From bf521eb26db1b5ed3a0c92c1a7ee9a65c130ace7 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Mon, 7 Sep 2026 19:10:46 -0400 Subject: [PATCH 1/2] feat(typescript): take up codeanalyzer-typescript 1.4.0's binding layer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.4.0 (cants#182) adds TS_IMPORTS / TS_RE_EXPORTS edges, :TSModule.exports_json, :TSCallable.parameters_json and TS_READS_CONFIG_UNRESOLVED. get_imports, get_exports, get_method_parameters and get_unresolved_config_reads answer over Neo4j on such a graph instead of refusing; parameters and exports also reach TSCallable.parameters and TSModule.exports on a rebuilt node, so the symbol table and the accessors cannot disagree. The model change comes first and is not optional: every TS model is extra="forbid", so 1.4.0's new TSImport/TSExport.resolved_module makes TSAnalysis.model_validate_json raise outright on a 1.4.0 analysis.json (12 errors on the sample app). The field is added to both models and the four checked-in analysis.json fixtures are regenerated at the pin. A graph emitted before 1.4.0 is still attachable — the floor stays 1.3.0 — and those four still refuse there, because [] would read as "imports nothing" / "takes no parameters" / "every read resolved". The decision is measured from the application's own data, one statement asking whether any of the three carriers is present, never from analyzer_version: the pattern leg 3 established for Java's port probe, so a re-emitted graph starts answering with no change here. Three carriers OR-ed because each is null when empty on its own node and an emitter writes all or none. Cached, and paid only on first use of one of the four. parameters_json and exports_json are decoded strictly: a malformed value raises rather than collapsing to [], which would recreate the ambiguous empty this closes. Imports are the one lossy half and say so — the edge folds every binding between a module pair into sorted sets, so an alias, an import_kind and a span are not recoverable, and the emitter drops a relative specifier that resolved to no emitted module. Both directions are pinned. Offline, one stub answers the probe and one does not, over identical rows. Over the write gate the sample app's real parameters and import bindings are compared to the sources and across backends. Over the re-emitted superset-frontend reference graph every expectation is derived from the graph at run time — the count the aggregate implies, the encoded export lists, the edge count. Still open upstream and untouched by 1.4.0: cants#177 (declaration-merge id collision), #179 (:TSCallable.code one line short, still pinned by four strict xfails), #180, #181. --- CHANGELOG.md | 27 +++- .../typescript/neo4j/neo4j_backend.py | 146 ++++++++++++++---- cldk/analysis/typescript/neo4j/reconstruct.py | 95 +++++++++++- cldk/models/typescript/models.py | 7 + docs/agent-api-reference.md | 43 ++++-- pyproject.toml | 4 +- tests/analysis/typescript/conftest.py | 12 +- .../typescript/test_typescript_analysis.py | 7 +- .../test_typescript_bulk_parity_live.py | 34 ++-- .../test_typescript_e2e_neo4j_live.py | 63 ++++++-- .../test_typescript_get_method_functions.py | 74 ++++++--- .../test_typescript_neo4j_backend.py | 55 ++++--- ...ypescript_neo4j_multi_application_scope.py | 11 ++ .../analysis_json/v2/a1/analysis.json | 2 +- .../analysis_json/v2/a2/analysis.json | 2 +- .../analysis_json/v2/a3/analysis.json | 2 +- .../analysis_json/v2/a4/analysis.json | 2 +- uv.lock | 14 +- 18 files changed, 463 insertions(+), 137 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4359ac32..67a6f1ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -95,17 +95,27 @@ surface** (3b). Design records: `docs/design/specs/2026-09-06-leg-2.5-typescript `ddg` edges whose endpoint was never emitted as a body node (codeanalyzer-java#228), so `get_ddg()` over `analysis.json` and over Neo4j now report the same edges — 10,430 on daytrader8, set for set, against a 5,434/5,347 split before. -- **Pins:** `codeanalyzer-java` 2.4.1 → 3.0.3, `codeanalyzer-typescript` 0.4.3 → 1.3.0. +- **Pins:** `codeanalyzer-java` 2.4.1 → 3.0.3, `codeanalyzer-typescript` 0.4.3 → 1.4.0. - **The Java analyzer ships as a wheel, not a jar in this repo.** The 35 MB checked-in jar, the Temurin download in `_jdk.py`, and the release workflow's jar injection are gone; no `JAVA_HOME` is read or set, and no JDK is downloaded. The published wheel drops from about 35 MB to 320 KB. - **Both languages' backends inherit the generic `AnalysisBackend`**, so each answers the shared artifact, dependency and configuration accessors. - **Where a backend cannot answer, it says so instead of returning an empty value.** On Neo4j: Java's file-keyed - comment accessors, and TypeScript's `get_imports`, `get_all_exports`, `get_unresolved_config_reads`, - `get_method_parameters` for a found method, and `get_extended_classes`/`get_implemented_interfaces` when the - relationship type is absent. The remaining documented gaps, and where the two backends legitimately differ, + comment accessors, and TypeScript's `get_extended_classes`/`get_implemented_interfaces` when the relationship + type is absent — and its `get_imports`, `get_exports`, `get_method_parameters` and + `get_unresolved_config_reads` on a graph emitted **before** codeanalyzer-typescript 1.4.0, which carries none + of the data they read (below). The remaining documented gaps, and where the two backends legitimately differ, are listed in `docs/agent-api-reference.md`. +- **TypeScript's `get_imports`, `get_exports`, `get_method_parameters` and `get_unresolved_config_reads` answer + over Neo4j**, on a graph emitted by codeanalyzer-typescript 1.4.0 or newer: the projection gained + `TS_IMPORTS` / `TS_RE_EXPORTS` edges, `:TSModule.exports_json`, `:TSCallable.parameters_json` and + `TS_READS_CONFIG_UNRESOLVED` (codeanalyzer-typescript#182). Parameters also reach `TSCallable.parameters` and + exports reach `TSModule.exports` on a rebuilt node. A **1.3.0 graph is still attachable** and those four + still refuse there rather than answer an empty that would read as a fact; the decision is measured from the + application's own data — is any carrier present — never from the analyzer's version string, so a re-emitted + graph starts answering with no SDK change. `TSImport`/`TSExport` gained the analyzer's new + `resolved_module`. **Migration:** re-emit with `codeanalyzer-typescript>=1.4.0 --emit neo4j`. - **Every Cypher statement is scoped per bound variable, not per statement** — both endpoints of a call edge, a quantified path's far end, a slice's reached body nodes, and every *interior* node of a variable-length or shortest-path walk (`all(n IN nodes(p) …)` on the slice, path and reachability queries). A statement that @@ -149,9 +159,14 @@ surface** (3b). Design records: `docs/design/specs/2026-09-06-leg-2.5-typescript - Java CRUD accessors raise: schema v2 does not carry CRUD yet (codeanalyzer-java#187). - The Java graph's `JCallable.code` is the declaration slice where the JSON's is the body block, and the graph cannot recover the body block (codeanalyzer-java#176). +- **Import bindings read over the TypeScript Neo4j backend are narrower than in process.** `TS_IMPORTS` folds + every binding between a module pair into one edge of sorted sets, so an entry's alias, `import_kind` and span + are not recoverable, and the emitter drops a relative specifier that resolved to no emitted module. Exports, + parameters and unresolved config reads are lossless, except that the config-read edge carries no `site` and + collapses sites sharing a `(callee, key, reason)` triple. - **Source text read over the TypeScript Neo4j backend is truncated by one line.** codeanalyzer-typescript - 1.3.0 projects `:TSCallable.code` as the callable's text minus its final `\n}` while the line numbers stay - correct, so `get_source`, `get_method_bodies`, `describe` and `locate(...).source` return short text over + 1.3.0 and 1.4.0 project `:TSCallable.code` as the callable's text minus its final `\n}` while the line + numbers stay correct, so `get_source`, `get_method_bodies`, `describe` and `locate(...).source` return short text over Neo4j and complete text in process (codeanalyzer-typescript#179). Read the text in process, or re-slice the span, until the fix ships. - TypeScript's DDG has one provenance tier; Java's has two; Python's has three. diff --git a/cldk/analysis/typescript/neo4j/neo4j_backend.py b/cldk/analysis/typescript/neo4j/neo4j_backend.py index ab09722b..af315d12 100644 --- a/cldk/analysis/typescript/neo4j/neo4j_backend.py +++ b/cldk/analysis/typescript/neo4j/neo4j_backend.py @@ -15,13 +15,15 @@ ################################################################################ """Neo4j-backed TypeScript analysis backend (read-only Cypher client) on the codeanalyzer-typescript -1.2.0 graph vocabulary. +schema-v2 graph vocabulary -- 1.2.0's ``can://`` grammar, through the 1.4.0 pin. A drop-in alternative to :class:`TSCodeanalyzer`: the same query surface, every method answered by Cypher over a live graph that ``codeanalyzer-typescript --emit neo4j`` populated out of band. This class never writes and needs neither the analyzer binary nor the sources. -**The graph it reads** (``schema.neo4j.json`` at the 1.2.0 tag; ``main`` renames nothing): +**The graph it reads** (``schema.neo4j.json``; the vocabulary below dates to the 1.2.0 tag and +1.4.0 renames nothing, only adding the binding layer :attr:`TSNeo4jBackend._carries_bindings` asks +about): ``:Application {id: can://typescript/}`` anchors the application and stamps ``analyzer_version``; every project node carries a ``can://`` ``id`` under the merge label ``CanNode`` -- ``TSModule`` (``name`` holds the file key), ``TSClass``/``TSInterface``/``TSEnum``/ @@ -55,11 +57,14 @@ class never writes and needs neither the analyzer binary nor the sources. callables it walks -- never one statement per parent. **Lossiness** relative to the in-memory backend (the projection's, not this client's; see -:mod:`reconstruct` for the per-node detail): parameters, comments, type parameters, overloads, -bodies and the L3/L4 graphs are not on ``:TSCallable``; enum member values, imports and exports -are not projected at all; call sites keep lines and the resolved callee only; the anonymous-callable -index is keyed by the tree node's own id rather than the analyzer's older compatibility key; -``config_reads`` are not projected (see :meth:`get_unresolved_config_reads`); an unresolved +:mod:`reconstruct` for the per-node detail): comments, type parameters, overloads, bodies and the +L3/L4 graphs are not on ``:TSCallable``; enum member values are not projected at all; call sites +keep lines and the resolved callee only; the anonymous-callable index is keyed by the tree node's +own id rather than the analyzer's older compatibility key; import bindings survive only as the +per-target aggregate ``TS_IMPORTS`` folds them into, so :meth:`get_imports` cannot pair a name +with its alias, its ``import_kind`` or its span (parameters, exports and unresolved config reads +are lossless -- ``parameters_json``, ``exports_json`` and the ``TS_READS_CONFIG_UNRESOLVED`` +edges, all four accessors gated on :attr:`~TSNeo4jBackend._carries_bindings`); an unresolved call site contributes ``""`` to :meth:`get_call_targets` where the in-memory backend contributes the call's ``method_name``; the extends/implements split is read off ``TS_EXTENDS``/``TS_IMPLEMENTS`` rather than the never-written ``implements_types`` property, so it covers resolved in-repo bases @@ -71,7 +76,7 @@ class never writes and needs neither the analyzer binary nor the sources. body-node id outright, where the local backend answers both. **And one that is a value divergence rather than an absence**, which is why it is stated loudly: -codeanalyzer-typescript 1.3.0 projects ``:TSCallable.code`` **one line short of the callable's own +codeanalyzer-typescript 1.3.0 and 1.4.0 project ``:TSCallable.code`` **one line short of the callable's own span** -- the graph text is the in-memory text minus its final ``"\\n}"`` (measured: 544 characters against 546 for the sample app's ``src/index.main``), while ``start_line``/``end_line`` on the same node are correct. Every accessor that hands a caller a callable's source over this backend is @@ -206,6 +211,16 @@ def _vertex(var: str, *, escape: bool = False) -> str: return f"{open_}kind: {var}.kind, signature: {var}.signature, name: {var}.name, ref: {var}.id, line: {var}.start_line, module: {var}.module{close}" +#: What :meth:`TSNeo4jBackend._require_bindings` raises. Names the accessor, the application and +#: the three carriers it looked for, so a reader can check the claim against the graph in one +#: statement rather than take the SDK's word for it. +BINDINGS_ABSENT = ( + "The codeanalyzer-typescript Neo4j projection for application {app!r} carries no binding layer -- no TS_IMPORTS edge, " + "no :TSModule.exports_json and no :TSCallable.parameters_json -- so {accessor} cannot be answered from it. " + "codeanalyzer-typescript projects all of it from 1.4.0 on (cants#182); re-emit the graph with 1.4.0 or newer. " + "An empty answer here would be indistinguishable from a graph that carries the layer and has nothing to report." +) + #: The kinds a method owner may have -- alongside the label, so a declaration-merged node carrying #: ``TSClass``/``TSInterface`` with another declaration's kind is not an owner. _OWNER_KINDS = ["class", "interface"] @@ -427,6 +442,36 @@ def _load_module_keys(self) -> Dict[str, str]: rows = self._run("MATCH (:Application {id: $app_id})-[:TS_HAS_MODULE]->(m:TSModule) RETURN m.name AS k, m.id AS id", app_id=self._app_id) return {r["k"]: r["id"] for r in rows} + #: One statement, three carriers OR-ed, asked of **this application's own data** -- exactly as + #: leg 3 asks Java's SDG whether its ports carry dependence, and never of ``analyzer_version``: + #: the refusal below is a statement about what was emitted, so a graph re-emitted by a newer + #: analyzer must start answering with no change here. Three carriers because each is ``null`` + #: when empty on its own node, and an emitter writes all of them or none: any application with + #: an import, an ``export`` statement or a parameter trips at least one. + _BINDINGS_PRESENT = ( + f"RETURN EXISTS {{ MATCH (m:TSModule)-[:TS_IMPORTS]->() WHERE {_scoped('m')} }} " + f"OR EXISTS {{ MATCH (m:TSModule) WHERE {_scoped('m')} AND m.exports_json IS NOT NULL }} " + f"OR EXISTS {{ MATCH (c:TSCallable) WHERE {_scoped('c')} AND c.parameters_json IS NOT NULL }} AS ok" + ) + + @cached_property + def _carries_bindings(self) -> bool: + """Whether this application's projection carries the binding layer codeanalyzer-typescript + 1.4.0 added (cants#182) -- ``TS_IMPORTS``, ``exports_json``, ``parameters_json`` and + ``TS_READS_CONFIG_UNRESOLVED``, which ship together. + + Asked on first use rather than at attach: a caller who never asks a binding question never + pays for it, and a caller who does pays once. A 1.3.0 graph is still perfectly attachable + (:attr:`_ANALYZER_FLOOR`) -- it simply answers ``False`` here and the four accessors gated + on it refuse rather than answer an empty that would read as a fact. + """ + rows = self._run(self._BINDINGS_PRESENT, **self._scope_params) + return bool(rows and rows[0]["ok"]) + + def _require_bindings(self, accessor: str) -> None: + if not self._carries_bindings: + raise CodeanalyzerExecutionException(BINDINGS_ABSENT.format(app=self.application_name, accessor=accessor)) + # ===================================================================================== # Containment subtree: one statement for the roots, one for everything beneath them. # ===================================================================================== @@ -538,8 +583,9 @@ def get_application_view(self) -> TSApplication: * ``param_in``/``param_out`` -- the L4 dataflow overlay. Leg 2.5a reads **none** of it (no ``TS_PARAM_IN``/``TS_PARAM_OUT``/``TS_DDG``/``TS_SUMMARY`` statement exists on this class); the whole dataflow surface, this overlay with it, is leg 2.5b. - * ``config_reads`` -- not projected at all (see :meth:`get_unresolved_config_reads`, which - raises rather than answer ``[]`` here). + * ``config_reads`` -- projected since 1.4.0 and reachable through + :meth:`get_unresolved_config_reads`, but not folded into the view: the edge carries no + ``site``, so the entries would not be the ones the in-memory view holds. * ``unresolved_imports`` -- ``TS_UNRESOLVED_IMPORT`` is in the projection but no accessor on this surface reads it, so the view does not invent one. """ @@ -838,12 +884,19 @@ def get_method(self, qualified_class_name: str, qualified_method_name: str) -> T return self._callable(roots[0], children) if roots else None def get_method_parameters(self, qualified_class_name: str, qualified_method_name: str) -> List[str]: - """``[]`` for a missing method, as in-memory. For a **found** one this graph cannot answer: - the 1.2.0 projection carries no parameters on ``:TSCallable`` (nor as nodes), and an empty - list would read as "takes no parameters", so it raises naming the gap.""" - if self.get_method(qualified_class_name, qualified_method_name) is None: + """The found method's parameter names, ``[]`` for a missing method (as in-memory). + + The names come off the callable's own ``parameters_json``, decoded by + :func:`~cldk.analysis.typescript.neo4j.reconstruct.parameters` on the way through + :meth:`get_method`, so this is the same list the in-memory backend answers. A graph + without the binding layer refuses instead (:attr:`_carries_bindings`): ``[]`` there would + read as "takes no parameters". The missing-method ``[]`` is decided first, and needs no + binding layer to be true.""" + method = self.get_method(qualified_class_name, qualified_method_name) + if method is None: return [] - raise CodeanalyzerExecutionException(f"The codeanalyzer-typescript Neo4j projection carries no parameters for {qualified_method_name!r}; they exist only in analysis.json.") + self._require_bindings("get_method_parameters") + return [p.name for p in method.parameters] def get_all_constructors(self, qualified_class_name: str) -> Dict[str, TSCallable]: return {name: m for name, m in self.get_all_methods_in_class(qualified_class_name).items() if m.kind == "constructor"} @@ -864,18 +917,43 @@ def get_interface_properties(self, qualified_interface_name: str) -> List[TSClas # imports / exports / variables # ===================================================================================== def get_imports(self) -> Dict[str, List[TSImport]]: - """The 1.2.0 projection carries no import bindings (no relationship type, no property), so - this graph cannot say what a module imports; raises naming the gap rather than returning - empty lists that would read as "imports nothing".""" - raise CodeanalyzerExecutionException( - f"The codeanalyzer-typescript Neo4j projection carries no import bindings for application {self.application_name!r}; they exist only in analysis.json." - ) + """Every module's import bindings, rebuilt from the aggregated ``TS_IMPORTS`` edges + (codeanalyzer-typescript 1.4.0, cants#182 D2). Every module key is present, so a module + that imports nothing answers ``[]`` rather than being absent. + + **Narrower than the in-memory list, in two ways the emitter decides and one this rebuild + does.** The emitter drops a relative specifier that resolved to no emitted module (a + ``--skip-tests`` target, a broken path) -- those survive in ``analysis.json`` only -- and + folds every binding between a pair into one edge of sorted sets. The rebuild therefore + cannot pair a name with its alias, its ``import_kind`` or its span; see + :func:`~cldk.analysis.typescript.neo4j.reconstruct.import_edge` for exactly what each + entry does and does not carry. A graph without the binding layer refuses + (:attr:`_carries_bindings`) rather than answer lists that would read as "imports nothing". + """ + self._require_bindings("get_imports") + out: Dict[str, List[TSImport]] = {key: [] for key in self._modules} + for r in self._run( + f"MATCH (m:TSModule)-[i:TS_IMPORTS]->() WHERE {_scoped('m')} RETURN m.name AS k, properties(i) AS p", + **self._scope_params, + ): + out.setdefault(r["k"], []).extend(R.import_edge(r["p"])) + return {k: sorted(v, key=lambda i: (i.module, i.name)) for k, v in out.items()} def get_all_exports(self) -> Dict[str, List[TSExport]]: - """As :meth:`get_imports`: the projection carries no export bindings.""" - raise CodeanalyzerExecutionException( - f"The codeanalyzer-typescript Neo4j projection carries no export bindings for application {self.application_name!r}; they exist only in analysis.json." - ) + """Every module's export bindings, decoded from ``:TSModule.exports_json`` (1.4.0, + cants#182 D3). Unlike :meth:`get_imports` this is **lossless** -- the property is the + in-memory list serialized verbatim, spans included. + + The property is ``null`` on a module that exports nothing, which is why the refusal is + decided over the application (:attr:`_carries_bindings`) and not by this property being + absent on one module. ``TS_RE_EXPORTS``, the other half of D3, is what makes barrel chains + walkable in Cypher; it carries no binding this accessor needs, so nothing here reads it. + """ + self._require_bindings("get_exports") + out: Dict[str, List[TSExport]] = {key: [] for key in self._modules} + for r in self._run(f"MATCH (m:TSModule) WHERE {_scoped('m')} AND m.exports_json IS NOT NULL RETURN m.name AS k, m.exports_json AS j", **self._scope_params): + out[r["k"]] = R.exports(r["j"]) + return out def get_all_variables(self) -> Dict[str, List[TSVariableDeclaration]]: out: Dict[str, List[TSVariableDeclaration]] = {key: [] for key in self._modules} @@ -942,12 +1020,18 @@ def get_config_uses(self, key: str | None = None) -> List[PyConfigUseEdge]: return [PyConfigUseEdge(src=r["src"], dst=r["dst"], prov=list(r["prov"] or [])) for r in self._run(query, **params)] def get_unresolved_config_reads(self) -> List[PyConfigRead]: - """The 1.2.0 projection does not carry ``config_reads`` (no relationship type or property - in ``schema.neo4j.json``), so this graph cannot say whether a detector-matched read failed - to resolve. Raising keeps that distinct from "every read resolved".""" - raise CodeanalyzerExecutionException( - f"The codeanalyzer-typescript Neo4j projection carries no unresolved config reads for application {self.application_name!r}; they exist only in analysis.json." - ) + """Detector-matched config reads that resolved to no declared key, from the + ``TS_READS_CONFIG_UNRESOLVED`` edges 1.4.0 projects (cants#182 D5). + + The edge runs application-to-target, so ``site`` comes back ``""`` and sites sharing a + ``(callee, key, reason)`` triple collapse onto one edge -- a count gap against the + in-memory list, never a presence one, stated in full on + :func:`~cldk.analysis.typescript.neo4j.reconstruct.unresolved_config_read`. ``[]`` means + every matched read resolved; a graph that cannot say refuses instead + (:attr:`_carries_bindings`).""" + self._require_bindings("get_unresolved_config_reads") + rows = self._run("MATCH (:Application {id: $app_id})-[u:TS_READS_CONFIG_UNRESOLVED]->(t) RETURN properties(u) AS p, t.id AS callee", app_id=self._app_id) + return [R.unresolved_config_read(r["p"], callee=r["callee"]) for r in rows] # ===================================================================================== # decorators diff --git a/cldk/analysis/typescript/neo4j/reconstruct.py b/cldk/analysis/typescript/neo4j/reconstruct.py index c18e8744..5e84ab78 100644 --- a/cldk/analysis/typescript/neo4j/reconstruct.py +++ b/cldk/analysis/typescript/neo4j/reconstruct.py @@ -14,11 +14,12 @@ # limitations under the License. ################################################################################ -"""Rebuild the ``cldk.models.typescript`` (schema v2) models from codeanalyzer-typescript 1.2.0 -Neo4j node/edge property maps. +"""Rebuild the ``cldk.models.typescript`` (schema v2) models from codeanalyzer-typescript +Neo4j node/edge property maps (1.4.0 additions -- ``parameters_json``, ``exports_json``, +``TS_IMPORTS`` -- decoded where present). Pure functions: they take the flat property dictionaries the analyzer's Neo4j projection wrote -(``schema.neo4j.json`` at the 1.2.0 tag is the authority for what each label carries) and return +(``schema.neo4j.json`` at the pinned tag is the authority for what each label carries) and return the same pydantic objects the in-memory backend returns. :class:`TSNeo4jBackend` fetches the rows and assembles the containment tree; the per-node shape lives here. @@ -31,13 +32,18 @@ ``code`` so the model's ``code`` property reads the text the graph projected for that node (``None`` when the graph carries none). A module is assembled with ``model_construct`` so the module-level source threading (which would overwrite that with ``""``) does not run. -* ``TSCallable.parameters``, ``comments``, ``type_parameters``, ``overload_signatures``, ``body``, +* ``TSCallable.comments``, ``type_parameters``, ``overload_signatures``, ``body``, ``cfg``/``cdg``/``ddg``/``summary`` -- ``:TSCallable`` projects none of them; the call view is answered from ``:TSBodyNode {kind:'call'}`` by the backend's call-site accessors, not stored on - the callable. ``decorators`` **are** recoverable (``TS_DECORATED_BY``) and are. + the callable. ``decorators`` **are** recoverable (``TS_DECORATED_BY``) and are, and so are + ``parameters`` on a graph carrying ``parameters_json`` (see :func:`parameters`). * ``TSField.value`` (enum member values), ``comments``, ``initializer``, ``scope``, ``declaration_kind`` and the boolean facets -- ``:TSField`` projects ``name``/``type``/lines. -* ``TSModule.imports`` / ``exports`` / ``comments`` -- no relationship type or property exists. +* ``TSModule.comments`` -- no relationship type or property exists. ``exports`` come back in + full from ``exports_json`` where the graph carries it (see :func:`exports`); ``imports`` stay + empty on a rebuilt module -- they live on ``TS_IMPORTS`` edges the containment fetch does not + walk, and the backend's :meth:`~cldk.analysis.typescript.neo4j.neo4j_backend.TSNeo4jBackend.get_imports` + is what reads them. * ``TSDecorator`` line/column -- the edge carries only the arguments. * A call site's ``method_name``/receiver/argument facets and columns -- a ``call`` body node projects ``callee`` and its lines only. @@ -48,14 +54,18 @@ import json from typing import Any, Dict, List, Mapping +from cldk.models.python import PyConfigRead from cldk.models.typescript import ( TSCallable, + TSCallableParameter, TSCallableOverview, TSClassOverview, TSCallsite, TSClass, TSDecorator, TSEnum, + TSExport, + TSImport, TSExternalNode, TSField, TSInterface, @@ -65,6 +75,7 @@ TSSynthesizedNode, TSTypeAlias, ) +from cldk.utils.exceptions.exceptions import CodeanalyzerExecutionException Props = Mapping[str, Any] @@ -100,6 +111,75 @@ def child_key(parent_id: str, props: Props) -> str: # ---------------------------------------------------------------------------------------------- # leaves # ---------------------------------------------------------------------------------------------- +def _json_list(raw: Any, prop: str) -> List[Any]: + """A JSON-string property decoded to a list. + + A malformed value is **raised**, never swallowed into ``[]``: the analyzer writes these + properties as ``null`` when the list is empty, so ``[]`` is a real answer ("no parameters", + "no exports") and must not double as "the text on this node was garbage" -- the ambiguity + the 1.4.0 uptake (#368) exists to close. The caller decides what ``null`` means; this only + ever sees a value. + """ + try: + decoded = json.loads(raw) + except (TypeError, ValueError) as e: + raise CodeanalyzerExecutionException(f"The graph's {prop} is not valid JSON: {raw!r}") from e + if not isinstance(decoded, list): + raise CodeanalyzerExecutionException(f"The graph's {prop} decoded to a {type(decoded).__name__}, not a list: {raw!r}") + return decoded + + +def parameters(props: Props) -> List[TSCallableParameter]: + """A callable's parameters from ``:TSCallable.parameters_json`` (codeanalyzer-typescript 1.4.0, + cants#182 D4) -- ``JSON.stringify(callable.parameters)`` verbatim, so this round-trips the + in-memory list exactly, spans, decorators, ``@formal_in:N`` ids and all. + + Absent (``null``) on a callable that takes none, and absent on **every** callable of a graph + emitted before 1.4.0. The two read the same here, deliberately: telling them apart is a + question about the application, not about one node, and + :attr:`~cldk.analysis.typescript.neo4j.neo4j_backend.TSNeo4jBackend._carries_bindings` is + where it is asked. + """ + raw = props.get("parameters_json") + return [TSCallableParameter.model_validate(p) for p in _json_list(raw, "TSCallable.parameters_json")] if raw else [] + + +def exports(raw: Any) -> List[TSExport]: + """A module's export bindings from ``:TSModule.exports_json`` (cants#182 D3) -- + ``JSON.stringify(module.exports)`` verbatim, and so lossless: the same list the in-memory + backend answers, spans included. ``null`` when the module exports nothing.""" + return [TSExport.model_validate(e) for e in _json_list(raw, "TSModule.exports_json")] if raw else [] + + +def import_edge(props: Props) -> List[TSImport]: + """The bindings one aggregated ``TS_IMPORTS`` edge stands for (cants#182 D2). + + The emitter folds **every** binding between an importer and one target module into one edge, + each facet a sorted *set* -- ``spellings``, ``imported_names``, ``aliases``, + ``type_only_names`` -- so what a name was written on, and what it was renamed to, are not + recoverable from the edge. What is recoverable is rebuilt; the rest is left at the model + default rather than guessed: ``alias`` is always ``None``, ``import_kind`` always the model's + ``"named"``, and the span always ``-1``. A name is emitted against every spelling on the edge, + which is exact for the overwhelmingly common one-spelling edge and an over-count when one + module reaches another by two specifiers. An edge with no names at all is a side-effect import + (``import "./styles.css"``) and becomes one entry naming the spelling itself, as the Python + twin's ``PyNeo4jBackend._module_imports`` does. + """ + names = list(props.get("imported_names") or []) + type_only = set(props.get("type_only_names") or []) + return [TSImport(module=spelling, name=name, is_type_only=name in type_only) for spelling in (props.get("spellings") or []) for name in (names or [spelling])] + + +def unresolved_config_read(props: Props, *, callee: str) -> PyConfigRead: + """A :class:`PyConfigRead` from a ``TS_READS_CONFIG_UNRESOLVED`` edge and its target's id + (cants#182 D5), which is python's shape verbatim -- and so is its ceiling, stated in full on + :func:`cldk.analysis.python.neo4j.reconstruct.unresolved_config_read`: the edge runs + application-to-target and never touches the reading body node, so ``site`` is always ``""``, + and its discriminant is ``(key, reason)``, so several sites reading the same + ``(callee, key, reason)`` collapse onto one edge. A count gap, never a presence one.""" + return PyConfigRead(site="", callee=callee, key=props.get("key"), reason=props.get("reason", "non-literal"), prov=list(props.get("prov") or [])) + + def decorator(node: Props, edge: Props | None = None) -> TSDecorator: """A decorator from its ``:TSDecorator`` node (keyed by name) plus the ``TS_DECORATED_BY`` edge properties (``positional_arguments``, ``keyword_arguments_json``).""" @@ -201,6 +281,7 @@ def callable_(props: Props, *, decorators: List[TSDecorator] | None = None, call name=props["name"], signature=props["signature"], decorators=decorators or [], + parameters=parameters(props), return_type=props.get("return_type"), cyclomatic_complexity=props.get("cyclomatic_complexity", 0), accessibility=props.get("accessibility"), @@ -260,7 +341,7 @@ def module(props: Props, *, types: Dict[str, Any] | None = None, functions: Dict span=_span(props), source="", imports=[], - exports=[], + exports=exports(props.get("exports_json")), comments=[], types=types or {}, functions=functions or {}, diff --git a/cldk/models/typescript/models.py b/cldk/models/typescript/models.py index 7bd46aea..5d76e18a 100644 --- a/cldk/models/typescript/models.py +++ b/cldk/models/typescript/models.py @@ -111,6 +111,10 @@ class TSImport(_Base): """A TypeScript import binding (one entry per imported name).""" module: str + #: 1.4.0 additive: the project-relative module key ``module`` resolves to under the importer's + #: own program, from the compiler's own resolver. ``None`` when the specifier is external, a + #: builtin, or unresolvable -- and it is what the Neo4j projection homes ``TS_IMPORTS`` on. + resolved_module: Optional[str] = None name: str alias: Optional[str] = None is_type_only: bool = False @@ -125,6 +129,9 @@ class TSExport(_Base): """A TypeScript export / re-export binding.""" module: Optional[str] = None + #: 1.4.0 additive, as on :class:`TSImport`; set on re-exports only (a local ``export { x }`` + #: names no other module). + resolved_module: Optional[str] = None name: str alias: Optional[str] = None is_type_only: bool = False diff --git a/docs/agent-api-reference.md b/docs/agent-api-reference.md index 7b9be452..b82b5a28 100644 --- a/docs/agent-api-reference.md +++ b/docs/agent-api-reference.md @@ -43,8 +43,9 @@ and the message names what it found and the floor. What attaching to each genera ## TypeScript -Status: leg 2.5b (`codeanalyzer-typescript` 1.3.0 pinned; graphs emitted by 1.3.0 or newer -served). What attaches today is the **1.x accessor surface** — symbol table, classes / interfaces / +Status: leg 2.5b (`codeanalyzer-typescript` 1.4.0 pinned; graphs emitted by 1.3.0 or newer +served, with four accessors gated on the 1.4.0 binding layer — see the floor below). What attaches +today is the **1.x accessor surface** — symbol table, classes / interfaces / enums / type aliases / namespaces, methods, fields, call graph, call sites, decorators, externals, synthesized callables, the four bulk accessors and the repository-artifact layer — on both backends. Every accessor is **called** against the live superset-frontend graph (1,841 modules: 1,557 @@ -94,13 +95,25 @@ ts = CLDK.typescript(project_path="/path/to/project", backend=TSCodeAnalyzerConf | --- | --- | | emitted by 0.4.x (`:Symbol` / `CALLS` / `HAS_CALLSITE`), a Python graph, an empty database | refused (`GraphSchemaMismatch`), naming the relationship types found and missing | | `analyzer_version` below 1.3.0 (a 1.2.0 graph included), unparsable, or no `:Application` with that id | refused, naming what was found and the floor | -| 1.3.0 and newer | served, silent | +| 1.3.0 | served, silent — but `get_imports` / `get_exports` / `get_method_parameters` / `get_unresolved_config_reads` refuse (below) | +| 1.4.0 and newer | served, silent; all four answer | A 1.2.0 graph carries none of the entrypoint marks and none of the per-callable graph vocabulary this surface reads, so it is refused rather than served with silent empties. **Migration:** re-emit -with `codeanalyzer-typescript>=1.3.0 --emit neo4j` (which takes no `-a`: the emit is always full +with `codeanalyzer-typescript>=1.4.0 --emit neo4j` (which takes no `-a`: the emit is always full depth). +**The 1.4.0 binding layer, and how its absence is decided.** codeanalyzer-typescript 1.4.0 +([#182](https://github.com/codellm-devkit/codeanalyzer-typescript/issues/182)) added `TS_IMPORTS` / +`TS_RE_EXPORTS` edges, `:TSModule.exports_json`, `:TSCallable.parameters_json` and +`TS_READS_CONFIG_UNRESOLVED`, which is what makes `get_imports`, `get_exports`, +`get_method_parameters` and `get_unresolved_config_reads` answer over Neo4j. A **1.3.0 graph is +still attachable** and carries none of it, so those four raise there rather than return an empty +that would read as "imports nothing" / "takes no parameters" / "every read resolved". The decision +is **measured from the application's own data** — one statement asking whether any of the three +carriers is present — never from `analyzer_version`, so a re-emitted graph starts answering with no +SDK change. It costs one query, on first use of one of the four, cached for the backend's life. + **JavaScript is in scope.** The analyzer ids `.js/.jsx/.mjs/.cjs` modules `can://javascript//…` beside `can://typescript//…`; every accessor reads both, and every Neo4j statement is scoped by the two prefixes. Path values are repo-relative module keys with their real extension @@ -110,24 +123,26 @@ by the two prefixes. Path values are repo-relative module keys with their real e class (`new X()`) a callee; nodes carry `kind` ∈ `module | class | interface | enum | type_alias | namespace | callable | external`. Filter on `kind == "callable"` for Python's shape. -**What the 1.2.0 Neo4j projection does not carry.** The in-memory backend reads `analysis.json` +**What the Neo4j projection does not carry.** The in-memory backend reads `analysis.json` and has everything below; the graph does not. Where an empty value would read as a fact, the Neo4j backend **raises** (`CodeanalyzerExecutionException`, naming the gap); otherwise the model's documented empty comes back. | accessor / field | on `TSNeo4jBackend` | | --- | --- | -| `get_imports()`, `get_exports()` | **raises** — no import/export vocabulary in the graph | -| `get_unresolved_config_reads()` | **raises** — `config_reads` not projected; `[]` would read as "every read resolved" | -| `get_method_parameters(cls, m)` | **raises** for a found method (no parameters on `:TSCallable`); `[]` for a missing one | +| `get_imports()` | answers from the aggregated `TS_IMPORTS` edges, and **narrower than in process**: the emitter folds every binding between a module pair into one edge of sorted sets and drops a relative specifier that resolved to no emitted module, so an entry carries `module` / `name` / `is_type_only` and leaves `alias`, `import_kind` and the span at their defaults. One entry per (spelling, name); an edge with no names (a side-effect `import "./x.css"`) contributes one naming the spelling | +| `get_exports()` | answers from `:TSModule.exports_json`, **lossless** — the in-memory list serialized verbatim, spans included | +| `get_unresolved_config_reads()` | answers from `TS_READS_CONFIG_UNRESOLVED`. `site` is always `""` and sites sharing a `(callee, key, reason)` triple collapse onto one edge, so the **count** can be lower than in process; presence/absence agrees | +| `get_method_parameters(cls, m)` | answers from `:TSCallable.parameters_json`; `[]` for a missing method, as in process | +| all four above, on a graph emitted **before 1.4.0** | **raise**, naming the application and the three carriers looked for. The binding layer is what they read; `[]` there would read as a fact | | `get_extended_classes(sig)`, `get_implemented_interfaces(sig)` | read off `TS_EXTENDS` / `TS_IMPLEMENTS`, so **resolved in-repo bases only** (a library base is in `base_classes` with no node to point at); each **raises** when its relationship type is absent from the database — as `TS_IMPLEMENTS` is on superset-frontend. The `implements_types` property the in-memory split uses is written by no node in the projection, so subtracting it would return the interfaces as extended classes | | `get_config_uses(key=None)` | `[]` also when the database declares no `TS_USES_CONFIG` at all (superset-frontend): indistinguishable from a corpus with no config reads. Not raised — a project that reads no configuration is a valid project, and refusing it at attach would be worse | | `get_nested_classes(sig)` | permanently `[]`, on **both** backends and not a projection gap: a schema-v2 class holds only `callables` and `fields`, so no class nests a class. `TSCallable.inner_classes` is the surviving case | -| `get_application_view().param_in` / `.param_out` | empty — leg 2.5a reads **no** dataflow overlay (2.5b does). `.config_reads` and `.unresolved_imports` are empty for their own reasons: not projected, and no accessor reads `TS_UNRESOLVED_IMPORT`. `.artifacts` / `.dependencies` / `.config_uses` **are** populated, from the same rows the dedicated accessors return | -| `TSCallable.parameters`, `comments`, `type_parameters`, `overload_signatures`, `body`, `cfg`/`cdg`/`ddg`/`summary` | empty | -| `TSEnumMember.value`; `TSModule.source` / `imports` / `exports` / `comments`; decorator positions; a call site's `method_name`, receiver and argument facets | empty / `None` | +| `get_application_view().param_in` / `.param_out` | empty — leg 2.5a reads **no** dataflow overlay (2.5b does). `.config_reads` and `.unresolved_imports` are empty for their own reasons: the config-read edge carries no `site`, so the view's entries would not be the ones in-process holds (`get_unresolved_config_reads()` is where they are reachable), and no accessor reads `TS_UNRESOLVED_IMPORT`. `.artifacts` / `.dependencies` / `.config_uses` **are** populated, from the same rows the dedicated accessors return | +| `TSCallable.comments`, `type_parameters`, `overload_signatures`, `body`, `cfg`/`cdg`/`ddg`/`summary` | empty. `parameters` are populated from `parameters_json` on a 1.4.0 graph | +| `TSEnumMember.value`; `TSModule.source` / `imports` / `comments`; decorator positions; a call site's `method_name`, receiver and argument facets | empty / `None`. `TSModule.exports` **is** populated from `exports_json`; `imports` stay empty on a rebuilt module — they live on edges the containment fetch does not walk, and `get_imports()` is what reads them | | `code` on any node | the text the graph projected for that node, on a line-only span (columns `0`) | -| **any source text of a callable** — `get_source(sig)`, `get_method_bodies(...)`, `describe(...).source`, `locate(...).source`, `TSCallable.code` | **truncated by one line**: codeanalyzer-typescript 1.3.0 projects `:TSCallable.code` as the callable's text minus its final `\n}`, while `start_line`/`end_line` on the same node are correct. Measured: 544 characters against the 546 the in-memory backend returns for the same callable. Upstream: [codeanalyzer-typescript#179](https://github.com/codellm-devkit/codeanalyzer-typescript/issues/179). **If you feed graph source to a parser or a diff, expect the closing brace to be missing** — until the fix ships, read the text in-process or re-slice the span yourself | +| **any source text of a callable** — `get_source(sig)`, `get_method_bodies(...)`, `describe(...).source`, `locate(...).source`, `TSCallable.code` | **truncated by one line**: codeanalyzer-typescript 1.3.0 and 1.4.0 project `:TSCallable.code` as the callable's text minus its final `\n}`, while `start_line`/`end_line` on the same node are correct. Measured: 544 characters against the 546 the in-memory backend returns for the same callable. Upstream: [codeanalyzer-typescript#179](https://github.com/codellm-devkit/codeanalyzer-typescript/issues/179). **If you feed graph source to a parser or a diff, expect the closing brace to be missing** — until the fix ships, read the text in-process or re-slice the span yourself | | `get_call_targets(sig)` | an unresolved call site contributes `""` (in-memory: the call's `method_name`) | | `get_synthesized_callables()` | keyed by the anonymous node's own id (the analyzer's older compatibility key is JSON-only) | | `locate(path, line)` at module scope | `source == ""` plus a second `module_source_unavailable` diagnostic — `:TSModule` carries no `source`. In-memory: the module's text | @@ -135,7 +150,7 @@ documented empty comes back. | `LocateResult.span` columns and byte offsets | placeholders; lines are real on both backends | | `get_entrypoint_coverage()` | the anchor's `entrypoint_report_json` string, parsed — same report as in-memory, no lossiness. A graph without the property answers `entrypoint_report_unavailable` rather than empty-but-clean fields | -Two more hold on **both** backends. `get_entrypoint_classes()` covers **classes only**: 1.3.0 +Two more hold on **both** backends. `get_entrypoint_classes()` covers **classes only**: the wire declares `is_entrypoint` on all five type kinds, but the Neo4j projection stamps it onto `:TSCallable` and `:TSClass` nodes alone, so widening it would make the backends disagree. And `get_config_keys()` is keyed by the config key's `can://` **id**, not by its artifact-relative @@ -216,7 +231,7 @@ accessors** — `get_callables_overview`, `get_method_bodies`, `get_decorated_ca - **`get_entrypoint_coverage` reports that there is no report.** codeanalyzer-java emits the entrypoint *marks* and nothing about the pass that made them: `analysis.json` carries no report key and the `:JApplication` anchor carries only `name` / `schema_version` / `analyzer_name` / - `analyzer_version` — unlike codeanalyzer-python 1.4.1 and codeanalyzer-typescript 1.3.0, which + `analyzer_version` — unlike codeanalyzer-python 1.4.1 and codeanalyzer-typescript 1.4.0, which both project one. So it answers with `diagnostics=[entrypoint_report_unavailable]` and empty fields that are explicitly *not* coverage. It is not synthesised from the `is_entrypoint` booleans: a count of syntactically-marked callables is not a coverage record. The marks diff --git a/pyproject.toml b/pyproject.toml index 4dde1647..2f4a788c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "tree-sitter-python==0.23.6", "tree-sitter-javascript==0.23.1", "codeanalyzer-python==1.4.1", - "codeanalyzer-typescript==1.3.0", + "codeanalyzer-typescript==1.4.0", ] [project.optional-dependencies] @@ -88,7 +88,7 @@ include = [ [tool.backend-versions] codeanalyzer-java = "3.0.3" codeanalyzer-python = "1.4.1" -codeanalyzer-typescript = "1.3.0" +codeanalyzer-typescript = "1.4.0" ######################################## # Tool configurations diff --git a/tests/analysis/typescript/conftest.py b/tests/analysis/typescript/conftest.py index b62463df..b9e6d111 100644 --- a/tests/analysis/typescript/conftest.py +++ b/tests/analysis/typescript/conftest.py @@ -91,9 +91,12 @@ def typescript_analysis_json() -> str: # --- a fake Neo4j driver, so TSNeo4jBackend can be constructed and probed in-process --- -#: The relationship types codeanalyzer-typescript 1.2.0 projects (``schema.neo4j.json`` at the +#: The relationship types the pinned codeanalyzer-typescript projects (``schema.neo4j.json`` at the #: tag) -- a healthy graph by default, so fixtures that do not care about the schema probe need -#: not set ``rel_types`` themselves. ``main`` adds and removes none of them. +#: not set ``rel_types`` themselves. Everything but the last three dates to 1.2.0 and is unchanged +#: since; 1.4.0 *adds* the binding layer (#368) and renames nothing. The schema probe is a subset +#: check over four required types, so the additions trip nothing -- they are here so an offline +#: fake models the graph the pin actually emits. V2_RELATIONSHIP_TYPES = frozenset( { "TS_HAS_MODULE", @@ -119,6 +122,9 @@ def typescript_analysis_json() -> str: "TS_PARAM_OUT", "TS_EXTENDS", "TS_IMPLEMENTS", + "TS_IMPORTS", + "TS_RE_EXPORTS", + "TS_READS_CONFIG_UNRESOLVED", } ) @@ -158,7 +164,7 @@ class FakeDriver: """Stands in for ``neo4j.GraphDatabase.driver``. ``analyzer_version=None`` means "no ``:Application`` with that id".""" - def __init__(self, rel_types=V2_RELATIONSHIP_TYPES, responder=None, analyzer_version="1.3.0") -> None: + def __init__(self, rel_types=V2_RELATIONSHIP_TYPES, responder=None, analyzer_version="1.4.0") -> None: self.rel_types = set(rel_types) self.analyzer_version = analyzer_version self.responder = responder diff --git a/tests/analysis/typescript/test_typescript_analysis.py b/tests/analysis/typescript/test_typescript_analysis.py index 44a42e39..9e22154c 100644 --- a/tests/analysis/typescript/test_typescript_analysis.py +++ b/tests/analysis/typescript/test_typescript_analysis.py @@ -22,6 +22,7 @@ import networkx as nx import pytest +import toml from cldk import CLDK from cldk.analysis import AnalysisLevel @@ -437,6 +438,10 @@ def test_tsc_only_is_a_deprecated_no_op(typescript_application, typescript_analy def test_backend_keeps_the_envelope(ts_analysis): analysis = ts_analysis.backend.analysis - assert analysis.analyzer.version == "1.3.0" + # The pin, read rather than written down (the idiom tests/models/typescript uses): the fixture + # is regenerated with the pinned wheel, so a literal here is one more place a bump has to be + # remembered -- and #368 found this one stale. + pin = toml.load(Path(__file__).resolve().parents[3] / "pyproject.toml")["tool"]["backend-versions"]["codeanalyzer-typescript"] + assert analysis.analyzer.version == pin assert analysis.max_level == 4 assert analysis.application is ts_analysis.get_application_view() diff --git a/tests/analysis/typescript/test_typescript_bulk_parity_live.py b/tests/analysis/typescript/test_typescript_bulk_parity_live.py index 1b20c4ce..201bc290 100644 --- a/tests/analysis/typescript/test_typescript_bulk_parity_live.py +++ b/tests/analysis/typescript/test_typescript_bulk_parity_live.py @@ -642,13 +642,29 @@ def test_config_uses_and_readers_parity(ts_dual): assert {_overview_tuple(o) for o in ref.get_config_readers(key)} == {_overview_tuple(o) for o in neo.get_config_readers(key)}, key -def test_unresolved_config_reads_is_the_one_documented_divergence(ts_dual): - """Not a parity failure but a recorded gap: the Neo4j projection carries no ``config_reads`` at - all, so that backend raises naming the gap rather than answering ``[]``, which would read as - "every read resolved". Asserted here so the day the projection gains them, this test fails and - the divergence is closed rather than forgotten.""" +def test_unresolved_config_reads_parity(ts_dual): + """Was the one documented divergence -- the projection carried no ``config_reads`` and that + backend refused rather than answer ``[]``. codeanalyzer-typescript 1.4.0 projects them + (``TS_READS_CONFIG_UNRESOLVED``, #368), so this is parity. The sample app matches no config + read at all, which makes both sides ``[]``: presence/absence is what the edge guarantees, and + a count divergence would only appear on a corpus whose sites collapse onto one edge.""" ref, neo = ts_dual - assert ref.get_unresolved_config_reads() == [] - with pytest.raises(Exception) as e: - neo.get_unresolved_config_reads() - assert "unresolved config reads" in str(e.value) + assert ref.get_unresolved_config_reads() == neo.get_unresolved_config_reads() == [] + + +def test_import_export_and_parameter_bindings_parity(ts_dual): + """The other three #368 accessors, over the same sample app on both backends. + + Imports are compared on the facets the aggregate edge can carry: a ``TS_IMPORTS`` edge folds + every binding between a pair into sorted sets, so an alias, an ``import_kind`` and a span + survive only in ``analysis.json`` (see ``reconstruct.import_edge``). Exports and parameters + ride JSON-encoded properties and are compared whole. + """ + ref, neo = ts_dual + binding = lambda d: {k: sorted((i.module, i.name, i.is_type_only) for i in v) for k, v in d.items()} + assert binding(ref.get_imports()) == binding(neo.get_imports()) + assert any(v for v in ref.get_imports().values()), "the sample app imports something; an all-empty parity is vacuous" + assert ref.get_exports() == neo.get_exports() + params = lambda d: {sig: [p.name for p in c.parameters] for sig, c in d.items()} + assert params(ref.get_functions()) == params(neo.get_functions()) + assert ref.get_method_parameters("src/services.UserService", "create") == neo.get_method_parameters("src/services.UserService", "create") == ["name", "role"] diff --git a/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py b/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py index 2801d0dd..3b70c60e 100644 --- a/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py +++ b/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py @@ -245,7 +245,7 @@ def test_declaration_merged_nodes_are_one_facet_each_and_never_a_namespace(analy assert type(facet) in (TSClass, TSInterface, TSEnum, TSTypeAlias) and "TS" + type(facet).__name__[2:] in labels, f"{sig} rebuilt as the facet TS_DECLARES + labels name" -def test_class_method_and_code_round_trip(analysis, sample): +def test_class_method_and_code_round_trip(analysis, sample, cypher): cls = analysis.get_class(sample["class_sig"]) assert cls is not None and cls.id == sample["class_id"] methods = analysis.get_methods_in_class(sample["class_sig"]) @@ -253,9 +253,13 @@ def test_class_method_and_code_round_trip(analysis, sample): method = analysis.get_method(sample["class_sig"], sample["method_name"]) assert method is not None and method.id == sample["method_id"] assert method.code == sample["code"], "the graph's own code text reaches the model's code property" - assert method.parameters == [], "documented lossiness: :TSCallable projects no parameters" - with pytest.raises(CodeanalyzerExecutionException, match="no parameters for"): - analysis.get_method_parameters(sample["class_sig"], sample["method_name"]) + # #368: parameters_json on the node is the callable's own list, JSON-encoded verbatim, and it + # reaches both the rebuilt model and the accessor. Read back off the same node rather than + # named here, so this compares the SDK to the graph and not to a string in this file. + encoded = cypher("MATCH (c:CanNode:TSCallable {id: $id}) RETURN c.parameters_json AS j", id=sample["method_id"])[0]["j"] + expected = [p["name"] for p in json.loads(encoded)] if encoded else [] + assert [p.name for p in method.parameters] == expected + assert analysis.get_method_parameters(sample["class_sig"], sample["method_name"]) == expected assert analysis.get_method_parameters(sample["class_sig"], "no_such_method_here") == [] assert analysis.get_method_bodies([sample["method_sig"]]) == {sample["method_sig"]: sample["code"]} @@ -275,11 +279,44 @@ def test_functions_and_methods_in_application_match_the_graph(analysis, count): assert sum(len(v) for v in grouped.values()) <= count(f"MATCH (x:TSClass|TSInterface)-[:TS_HAS_METHOD]->(m) WHERE {SCOPED} RETURN count(m) AS n") -def test_imports_and_exports_name_the_projection_gap(analysis): - with pytest.raises(CodeanalyzerExecutionException, match="no import bindings"): - analysis.get_imports() - with pytest.raises(CodeanalyzerExecutionException, match="no export bindings"): - analysis.get_exports() +def test_imports_are_every_binding_the_aggregate_edges_stand_for(analysis, cypher, count): + """#368: ``TS_IMPORTS`` answers ``get_imports`` where the 1.3.0 graph could only refuse. + + The edge folds every binding between a pair into sorted sets, so the expected *count* is what + the aggregate implies -- one entry per (spelling, name), and one naming the spelling itself on + a side-effect edge that carries no names. Computed by the graph, so this is not the rebuild + checking its own arithmetic against a copy of itself.""" + scoped_m = SCOPED.replace("x.", "m.") + assert count(f"MATCH (m:TSModule)-[i:TS_IMPORTS]->() WHERE {scoped_m} RETURN count(i) AS n") > 0, "the reference graph carries import bindings" + imports = analysis.get_imports() + assert set(imports) == set(analysis.get_symbol_table()), "every module key answers, importing or not" + implied = cypher( + f"MATCH (m:TSModule)-[i:TS_IMPORTS]->() WHERE {scoped_m} " + "RETURN sum(size(coalesce(i.spellings, [])) * CASE WHEN size(coalesce(i.imported_names, [])) = 0 THEN 1 ELSE size(i.imported_names) END) AS n", + **SCOPE, + )[0]["n"] + assert sum(len(v) for v in imports.values()) == implied + row = cypher( + f"MATCH (m:TSModule)-[i:TS_IMPORTS]->() WHERE {scoped_m} AND size(coalesce(i.type_only_names, [])) > 0 " + "RETURN m.name AS k, i.type_only_names AS names ORDER BY m.name, i.type_only_names LIMIT 1", + **SCOPE, + ) + if row: # a corpus with no `import type` anywhere would make this vacuous, not wrong + assert set(row[0]["names"]) <= {i.name for i in imports[row[0]["k"]] if i.is_type_only} + + +def test_exports_are_the_modules_own_encoded_list(analysis, cypher): + """The other half of #368, and the lossless one: ``exports_json`` is the in-memory export list + serialized verbatim, ``null`` on a module that exports nothing.""" + scoped_m = SCOPED.replace("x.", "m.") + carried = cypher(f"MATCH (m:TSModule) WHERE {scoped_m} AND m.exports_json IS NOT NULL RETURN m.name AS k, m.exports_json AS j ORDER BY m.name", **SCOPE) + assert carried, "the reference graph carries export bindings" + exports = analysis.get_exports() + assert set(exports) == set(analysis.get_symbol_table()) + assert sum(len(v) for v in exports.values()) == sum(len(json.loads(r["j"])) for r in carried) + for r in carried[:20]: + assert [e.name for e in exports[r["k"]]] == [e["name"] for e in json.loads(r["j"])], r["k"] + assert all(not exports[k] for k in set(exports) - {r["k"] for r in carried}), "a module with no exports_json answers [], the honest empty" def test_extends_comes_from_the_relationship_and_implements_names_the_absent_type(analysis, cypher): @@ -410,8 +447,12 @@ def test_artifact_layer_matches_the_graph(analysis, cypher): assert len(backend.get_dependencies(direct_only=True)) == sum(d.direct for d in deps) assert len(backend.get_config_keys()) == cypher("MATCH (:Application {id: $id})-[:HAS_ARTIFACT]->()-[:DEFINES_CONFIG]->(k) RETURN count(k) AS n", id=APP_ID)[0]["n"] assert len(backend.get_config_uses()) == cypher(f"MATCH (x:TSBodyNode)-[u:TS_USES_CONFIG]->() WHERE {SCOPED} RETURN count(u) AS n", **SCOPE)[0]["n"] - with pytest.raises(CodeanalyzerExecutionException, match="unresolved config reads"): - backend.get_unresolved_config_reads() + # #368: TS_READS_CONFIG_UNRESOLVED reaches the graph from 1.4.0 on, so this answers instead of + # refusing -- one entry per edge, however many sites collapsed onto it, and `site` always "" + # (the edge runs application-to-target and never touches the reading body node). + reads = backend.get_unresolved_config_reads() + assert len(reads) == cypher("MATCH (:Application {id: $id})-[u:TS_READS_CONFIG_UNRESOLVED]->() RETURN count(u) AS n", id=APP_ID)[0]["n"] + assert all(r.site == "" and r.callee for r in reads) # ===================================================================================== diff --git a/tests/analysis/typescript/test_typescript_get_method_functions.py b/tests/analysis/typescript/test_typescript_get_method_functions.py index ca06834e..33320426 100644 --- a/tests/analysis/typescript/test_typescript_get_method_functions.py +++ b/tests/analysis/typescript/test_typescript_get_method_functions.py @@ -25,6 +25,7 @@ parity test below is comparing apples to apples. """ +import json from pathlib import Path from unittest.mock import MagicMock, patch @@ -290,20 +291,24 @@ def _run(query: str, **params): return backend -def _callable_props(c: TSCallable) -> dict: - """The ``:TSCallable`` node property shape (codeanalyzer-typescript 1.2.0 ``schema.neo4j.json``): - flat scalars, no parameters -- the projection does not carry them.""" - return {"id": c.id, "kind": c.kind, "signature": c.signature, "name": c.name, "return_type": c.return_type, "start_line": c.start_line, "end_line": c.end_line, "code": ""} +def _callable_props(c: TSCallable, *, bindings: bool = False) -> dict: + """The ``:TSCallable`` node property shape: flat scalars, plus -- on a graph emitted by + codeanalyzer-typescript 1.4.0 or newer (#368) -- ``parameters_json``, the parameter list + JSON-encoded verbatim. ``bindings=False`` is the 1.3.0 shape, which carries neither the + property nor anything else of the binding layer.""" + props = {"id": c.id, "kind": c.kind, "signature": c.signature, "name": c.name, "return_type": c.return_type, "start_line": c.start_line, "end_line": c.end_line, "code": ""} + if bindings and c.parameters: + props["parameters_json"] = json.dumps([p.model_dump() for p in c.parameters]) + return props SCOPE = (("p1", "can://typescript/t/"), ("p2", "can://javascript/t/")) -@pytest.fixture -def stub_neo4j_backend(): - bar_props = _callable_props(_bar()) - baz_props = _callable_props(_baz()) - qux_props = _callable_props(_qux()) +def _stub_rows(*, bindings: bool): + bar_props = _callable_props(_bar(), bindings=bindings) + baz_props = _callable_props(_baz(), bindings=bindings) + qux_props = _callable_props(_qux(), bindings=bindings) has_method_query = f"MATCH (o:TSClass|TSInterface {{signature: $sig}}) WHERE {_scoped('o')} AND o.kind IN $kinds MATCH (o)-[:TS_HAS_METHOD]->(root:TSCallable {{name: $name}}) RETURN properties(root) AS p, labels(root) AS labels" exact_sig_query = ( @@ -320,7 +325,24 @@ def stub_neo4j_backend(): (short_name_query, (("name", "baz"), ("sig_prefix", "src/mod.")) + SCOPE): [{"p": baz_props, "labels": ["CanNode", "TSCallable"]}], (short_name_query, (("name", "qux"), ("sig_prefix", "src/mod.")) + SCOPE): [{"p": qux_props, "labels": ["CanNode", "TSCallable"]}], } - return _neo4j_backend_with_stubbed_run(rows_by_call) + # The binding-layer probe (#368), answered from the data exactly as the real graph answers it: + # a 1.4.0 graph has a carrier to find, a 1.3.0 one has none and the statement returns no row, + # which is the shape a stubbed _run gives for every statement it was not seeded with. + if bindings: + rows_by_call[(TSNeo4jBackend._BINDINGS_PRESENT, SCOPE)] = [{"ok": True}] + return rows_by_call + + +@pytest.fixture +def stub_neo4j_backend(): + """A graph from **before** 1.4.0: no ``parameters_json``, no binding layer at all.""" + return _neo4j_backend_with_stubbed_run(_stub_rows(bindings=False)) + + +@pytest.fixture +def stub_neo4j_backend_with_bindings(): + """The same graph re-emitted by 1.4.0 or newer, carrying the binding layer.""" + return _neo4j_backend_with_stubbed_run(_stub_rows(bindings=True)) def test_neo4j_get_method_still_resolves_class_methods(stub_neo4j_backend): @@ -347,15 +369,26 @@ def test_neo4j_get_method_resolves_namespace_nested_function_by_short_name(stub_ assert method.signature == "src/mod.NS.qux" -def test_neo4j_get_method_parameters_module_level_function(stub_neo4j_backend): - # The 1.2.0 projection carries no parameters on :TSCallable, so a *found* function cannot be - # answered -- it raises naming the gap rather than returning an empty list that would read as - # "takes no parameters" (the local backend answers ["x"] for the same fixture). +def test_neo4j_get_method_parameters_refuses_a_graph_without_the_binding_layer(stub_neo4j_backend): + # #368's floor, measured from the data and never from a version string: a graph emitted before + # 1.4.0 carries no parameters_json anywhere, so a *found* function cannot be answered and the + # accessor refuses rather than return [] -- which would read as "takes no parameters", when + # the local backend answers ["x"] for the same fixture. + assert stub_neo4j_backend._carries_bindings is False assert stub_neo4j_backend.get_method("src/mod", "baz") is not None - with pytest.raises(CodeanalyzerExecutionException, match="no parameters for 'baz'"): + with pytest.raises(CodeanalyzerExecutionException, match="carries no binding layer"): stub_neo4j_backend.get_method_parameters("src/mod", "baz") +def test_neo4j_get_method_parameters_answers_on_a_graph_with_the_binding_layer(stub_neo4j_backend_with_bindings): + """The other direction of the same decision: same rows, one carrier added, real answer.""" + assert stub_neo4j_backend_with_bindings._carries_bindings is True + assert stub_neo4j_backend_with_bindings.get_method_parameters("src/mod", "baz") == ["x"] + # ...and a callable that genuinely takes none answers [] rather than refusing, because the + # question "does this graph carry parameters at all" was settled over the application. + assert stub_neo4j_backend_with_bindings.get_method_parameters("src/mod.Foo", "bar") == [] + + def test_neo4j_get_method_genuine_miss_returns_none(stub_neo4j_backend): assert stub_neo4j_backend.get_method("src/mod", "does_not_exist") is None assert stub_neo4j_backend.get_method_parameters("src/mod", "does_not_exist") == [] @@ -364,15 +397,14 @@ def test_neo4j_get_method_genuine_miss_returns_none(stub_neo4j_backend): # -----[ backend parity ]----- -def test_backend_parity_module_level_function(ts_analysis, stub_neo4j_backend): +def test_backend_parity_module_level_function(ts_analysis, stub_neo4j_backend_with_bindings): local = ts_analysis.get_method("src/mod", "baz") - remote = stub_neo4j_backend.get_method("src/mod", "baz") + remote = stub_neo4j_backend_with_bindings.get_method("src/mod", "baz") assert local.signature == remote.signature assert local.name == remote.name - # Parameters are the one documented divergence: analysis.json carries them, the graph does not. - assert ts_analysis.get_method_parameters("src/mod", "baz") == ["x"] - with pytest.raises(CodeanalyzerExecutionException): - stub_neo4j_backend.get_method_parameters("src/mod", "baz") + # Parameters used to be the one documented divergence; 1.4.0 projects them, so this is parity. + assert ts_analysis.get_method_parameters("src/mod", "baz") == stub_neo4j_backend_with_bindings.get_method_parameters("src/mod", "baz") == ["x"] + assert [p.name for p in remote.parameters] == [p.name for p in local.parameters], "and they reach the rebuilt callable, not just the accessor" def test_backend_parity_namespace_nested_function(ts_analysis, stub_neo4j_backend): diff --git a/tests/analysis/typescript/test_typescript_neo4j_backend.py b/tests/analysis/typescript/test_typescript_neo4j_backend.py index 30c6f936..65b4fadf 100644 --- a/tests/analysis/typescript/test_typescript_neo4j_backend.py +++ b/tests/analysis/typescript/test_typescript_neo4j_backend.py @@ -35,15 +35,16 @@ **The tolerances, each with its cause.** The graph is the analyzer's own projection and the projection is lossy (the full ledger is the "on ``TSNeo4jBackend``" table in -``docs/agent-api-reference.md``). Three assertions below are therefore weaker than the parity they -were originally written to prove; each says so where it stands, so a reader does not mistake them -for parity: - -* ``get_method_parameters`` **raises** for a callable that exists — ``:TSCallable`` projects no - parameters and the projection mints no parameter nodes, and ``[]`` would read as "takes no - parameters" (``neo4j_backend.get_method_parameters``). The two tests that used to read a - parameter list off the graph now assert that refusal: it witnesses that the lookup *resolved* - the callable — a name it does not resolve returns ``[]`` — and nothing about its signature. +``docs/agent-api-reference.md``). Two assertions below are therefore weaker than the parity they +were originally written to prove, and a third stopped being weak in #368; each says so where it +stands, so a reader does not mistake one for the other: + +* ``get_method_parameters`` answers again, and this suite is where the *answering* direction of + #368 is pinned: the graph this file emits is the one the pinned analyzer writes, so it carries + ``:TSCallable.parameters_json`` and the two tests below compare real parameter names against + the sources. The refusing direction — a graph emitted before 1.4.0, which carries no binding + layer and must not answer an ambiguous ``[]`` — is pinned over the fake driver in + ``test_typescript_get_method_functions.py``, whose ``FakeDriver`` writes none of it. * A call-graph edge carries ``type`` / ``weight`` / ``provenance`` and nothing else, on both TypeScript backends. There is no ``tags`` key to assert: ``tags`` was a schema-1.0.0 call-edge field, and schema v2's ``TSCallGraphEdge`` is ``{src, dst, prov, weight}``. So the edge shape is @@ -67,7 +68,6 @@ from cldk import CLDK from cldk.analysis import AnalysisLevel from cldk.analysis.typescript.neo4j import Neo4jConnectionConfig -from cldk.utils.exceptions.exceptions import CodeanalyzerExecutionException logging.getLogger("neo4j").setLevel(logging.ERROR) @@ -313,10 +313,23 @@ def test_methods_and_constructor(ts_neo4j): def test_fields_and_parameters(ts_neo4j): fields = {f.name for f in ts_neo4j.get_fields("src/models.User")} assert {"name", "role"} <= fields - # Fields are projected; parameters are not. This asserts a *refusal*, not parity: the graph - # carries no parameters on :TSCallable, and [] would read as "create takes none". - with pytest.raises(CodeanalyzerExecutionException, match="no parameters for 'create'"): - ts_neo4j.get_method_parameters("src/services.UserService", "create") + # Both are projected since codeanalyzer-typescript 1.4.0 (#368): parameters ride + # :TSCallable.parameters_json, so this is parity with the sources again, not a refusal. + # services.ts declares `create(name: string, role: Role = Role.Member)`. + assert ts_neo4j.get_method_parameters("src/services.UserService", "create") == ["name", "role"] + + +def test_import_bindings_are_the_modules_own(ts_neo4j): + """The TS_IMPORTS half of #368, against a graph this suite emitted with the pinned analyzer.""" + imports = ts_neo4j.get_imports() + assert set(imports) == set(ts_neo4j.get_symbol_table()), "every module key answers, importing or not" + assert {(i.module, i.name) for i in imports["src/services.ts"]} == {("./models", n) for n in ("Named", "Role", "User", "UserId")} + assert {i.name for i in imports["src/services.ts"] if i.is_type_only} == {"Named", "UserId"}, "`import type` survives the aggregate" + assert imports["src/models.ts"] == [], "a module that imports nothing is present and empty, never absent" + # The sample app writes no `export … from` / `export { … }` statement at all — every symbol is + # exported at its own declaration — so exports_json is null on every module. That is the + # answer, not a gap: get_exports refuses only when the whole binding layer is missing. + assert ts_neo4j.get_exports() == {key: [] for key in imports} def test_get_method_resolves_module_level_function(ts_neo4j): @@ -329,13 +342,13 @@ def test_get_method_resolves_module_level_function(ts_neo4j): def test_get_method_parameters_module_level_function(ts_neo4j): - # Exercises the module-level fallback in get_method_parameters/get_method. The projection - # carries no parameters, so the two outcomes are the refusal (the fallback resolved the - # callable) and [] (it did not) — which makes the *raise* the thing that proves "src/index.main" - # was found. It proves nothing about main's parameter list, even though index.ts declares - # `function main(): void`; the graph cannot say so. - with pytest.raises(CodeanalyzerExecutionException, match="no parameters for 'main'"): - ts_neo4j.get_method_parameters("src/index", "main") + # Exercises the module-level fallback in get_method_parameters/get_method. index.ts declares + # `function main(): void`, so the honest answer is [] — the same [] an unresolvable name gets, + # which is why the resolution half is asserted through get_method rather than through the + # parameter list. That [] is a *fact* here only because the graph carries the binding layer; + # without it the accessor refuses instead (test_typescript_get_method_functions.py). + assert ts_neo4j.get_method("src/index", "main") is not None + assert ts_neo4j.get_method_parameters("src/index", "main") == [] assert ts_neo4j.get_method_parameters("src/index", "no_such_function_here") == [] diff --git a/tests/analysis/typescript/test_typescript_neo4j_multi_application_scope.py b/tests/analysis/typescript/test_typescript_neo4j_multi_application_scope.py index 1705e29e..f98c5eb9 100644 --- a/tests/analysis/typescript/test_typescript_neo4j_multi_application_scope.py +++ b/tests/analysis/typescript/test_typescript_neo4j_multi_application_scope.py @@ -783,6 +783,11 @@ def test_has_resolution_edges_is_probed_against_this_applications_edges(): "DECLARES_DEPENDENCY", "TS_RESOLVES_TO", "TS_USES_CONFIG", + # 1.4.0 (#368). Containment, in the id sense this set means by it: the edge runs from the + # `(:Application {id: $app_id})` anchor, and *both* target forms the emitter mints are + # minted under that anchor's own id -- an in-project `:TSCallable`, or the per-application + # import ghost `/@external/`. There is no cross-application target to reach. + "TS_READS_CONFIG_UNRESOLVED", } ) @@ -1331,6 +1336,12 @@ def test_the_audit_sees_every_inline_statement_too(): "get_entrypoint_classes", "get_entrypoint_coverage", "get_config_readers", + # #368: the binding layer -- the probe that decides it, and the three accessors it gates + # (get_method_parameters issues no statement of its own; it reads get_method's). + "_carries_bindings", + "get_imports", + "get_all_exports", + "get_unresolved_config_reads", ): assert any(name.startswith(expected + "@") for name in inline), f"{expected}'s statement is not harvested" diff --git a/tests/resources/typescript/analysis_json/v2/a1/analysis.json b/tests/resources/typescript/analysis_json/v2/a1/analysis.json index b28a8bad..fd41eab1 100644 --- a/tests/resources/typescript/analysis_json/v2/a1/analysis.json +++ b/tests/resources/typescript/analysis_json/v2/a1/analysis.json @@ -1 +1 @@ -{"schema_version":"2.0.0","language":"typescript","max_level":1,"analyzer":{"name":"codeanalyzer-typescript","version":"1.3.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":null,"method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"}},"entrypoints":[],"is_entrypoint":false},"list":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":null,"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":null,"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":null,"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":null,"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":null,"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":null,"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":null,"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":null,"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@22:3"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"recordLogin":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":null,"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"}},"entrypoints":[],"is_entrypoint":false},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"loginCount":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":null,"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":null,"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"}},"entrypoints":[],"is_entrypoint":false},"createGuest":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":null,"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"}},"entrypoints":[],"is_entrypoint":false},"describeAll":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":null,"method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"loginAll":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":null,"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":null,"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"}},"entrypoints":[],"is_entrypoint":false},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":null,"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"}},"entrypoints":[],"is_entrypoint":false},"build":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":null,"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"}},"entrypoints":[],"is_entrypoint":false},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":null,"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":null,"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/classify@31:5"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]}}} \ No newline at end of file +{"schema_version":"2.0.0","language":"typescript","max_level":1,"analyzer":{"name":"codeanalyzer-typescript","version":"1.4.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":null,"method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"}},"entrypoints":[],"is_entrypoint":false},"list":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":null,"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":null,"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":null,"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":null,"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":null,"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":null,"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":null,"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":null,"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@22:3"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"recordLogin":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":null,"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"}},"entrypoints":[],"is_entrypoint":false},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"loginCount":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":null,"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":null,"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"}},"entrypoints":[],"is_entrypoint":false},"createGuest":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":null,"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"}},"entrypoints":[],"is_entrypoint":false},"describeAll":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":null,"method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"loginAll":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":null,"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":null,"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"}},"entrypoints":[],"is_entrypoint":false},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":null,"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"}},"entrypoints":[],"is_entrypoint":false},"build":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":null,"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"}},"entrypoints":[],"is_entrypoint":false},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":null,"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":null,"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/classify@31:5"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]}}} \ No newline at end of file diff --git a/tests/resources/typescript/analysis_json/v2/a2/analysis.json b/tests/resources/typescript/analysis_json/v2/a2/analysis.json index 190f16e0..d867d145 100644 --- a/tests/resources/typescript/analysis_json/v2/a2/analysis.json +++ b/tests/resources/typescript/analysis_json/v2/a2/analysis.json @@ -1 +1 @@ -{"schema_version":"2.0.0","language":"typescript","max_level":2,"analyzer":{"name":"codeanalyzer-typescript","version":"1.3.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"}},"entrypoints":[],"is_entrypoint":false},"list":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"recordLogin":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"}},"entrypoints":[],"is_entrypoint":false},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"loginCount":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"}},"entrypoints":[],"is_entrypoint":false},"createGuest":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"}},"entrypoints":[],"is_entrypoint":false},"describeAll":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"loginAll":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"}},"entrypoints":[],"is_entrypoint":false},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"}},"entrypoints":[],"is_entrypoint":false},"build":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"}},"entrypoints":[],"is_entrypoint":false},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file +{"schema_version":"2.0.0","language":"typescript","max_level":2,"analyzer":{"name":"codeanalyzer-typescript","version":"1.4.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"}},"entrypoints":[],"is_entrypoint":false},"list":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"recordLogin":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"}},"entrypoints":[],"is_entrypoint":false},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"loginCount":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"}},"entrypoints":[],"is_entrypoint":false},"createGuest":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"}},"entrypoints":[],"is_entrypoint":false},"describeAll":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"loginAll":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"}},"entrypoints":[],"is_entrypoint":false},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"}},"entrypoints":[],"is_entrypoint":false},"build":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"}},"entrypoints":[],"is_entrypoint":false},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/tests/resources/typescript/analysis_json/v2/a3/analysis.json b/tests/resources/typescript/analysis_json/v2/a3/analysis.json index ce324890..e8abbde6 100644 --- a/tests/resources/typescript/analysis_json/v2/a3/analysis.json +++ b/tests/resources/typescript/analysis_json/v2/a3/analysis.json @@ -1 +1 @@ -{"schema_version":"2.0.0","language":"typescript","max_level":3,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.3.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://typescript/slim/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[]},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://typescript/slim/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[]},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://typescript/slim/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://typescript/slim/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://typescript/slim/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[577,626]},"id":"can://typescript/slim/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[629,670]},"id":"can://typescript/slim/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://typescript/slim/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://typescript/slim/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1200,1228]},"id":"can://typescript/slim/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[731,783]},"id":"can://typescript/slim/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[788,826]},"id":"can://typescript/slim/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[858,870]},"id":"can://typescript/slim/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[904,950]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[955,992]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1030,1073]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@exit"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@exit"}},"entrypoints":[],"is_entrypoint":false,"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"]}]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1121,1135]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1140,1213]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1176,1207]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1218,1231]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[162,185]},"id":"can://typescript/slim/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[398,422]},"id":"can://typescript/slim/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[548,553]},"id":"can://typescript/slim/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://typescript/slim/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://typescript/slim/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://typescript/slim/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://typescript/slim/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@exit"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@exit"}},"entrypoints":[],"is_entrypoint":false,"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"]}]}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file +{"schema_version":"2.0.0","language":"typescript","max_level":3,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.4.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://typescript/slim/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[]},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://typescript/slim/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[]},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://typescript/slim/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://typescript/slim/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://typescript/slim/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[577,626]},"id":"can://typescript/slim/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[629,670]},"id":"can://typescript/slim/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://typescript/slim/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://typescript/slim/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1200,1228]},"id":"can://typescript/slim/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[731,783]},"id":"can://typescript/slim/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[788,826]},"id":"can://typescript/slim/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[858,870]},"id":"can://typescript/slim/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[904,950]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[955,992]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1030,1073]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@exit"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@exit"}},"entrypoints":[],"is_entrypoint":false,"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"]}]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1121,1135]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1140,1213]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1176,1207]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1218,1231]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[162,185]},"id":"can://typescript/slim/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[398,422]},"id":"can://typescript/slim/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[548,553]},"id":"can://typescript/slim/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://typescript/slim/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://typescript/slim/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://typescript/slim/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://typescript/slim/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@exit"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@exit"}},"entrypoints":[],"is_entrypoint":false,"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"]}]}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/tests/resources/typescript/analysis_json/v2/a4/analysis.json b/tests/resources/typescript/analysis_json/v2/a4/analysis.json index a345582c..d37a372d 100644 --- a/tests/resources/typescript/analysis_json/v2/a4/analysis.json +++ b/tests/resources/typescript/analysis_json/v2/a4/analysis.json @@ -1 +1 @@ -{"schema_version":"2.0.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.3.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_out"},"20:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_in:0"},"20:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_out"},"21:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"20:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]},{"src":"20:5/actual_out","dst":"20:5","var":"$ret","prov":["reaching-defs"]},{"src":"21:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"21:5/actual_out","dst":"21:5","var":"$ret","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":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/list@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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"]},{"src":"26:5/actual_out","dst":"26:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"service","id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://typescript/slim/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@exit"},"@formal_in:0":{"kind":"formal_in","of":"prefix","id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Controller@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Controller/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://typescript/slim/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@exit"},"@formal_in:0":{"kind":"formal_in","of":"path","id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Get@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Get/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://typescript/slim/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Param@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Param/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://typescript/slim/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://typescript/slim/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[577,626]},"id":"can://typescript/slim/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[629,670]},"id":"can://typescript/slim/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/index.ts/main@formal_out"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3","id":"can://typescript/slim/src/index.ts/main@11:3/actual_out"},"12:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"12:3","id":"can://typescript/slim/src/index.ts/main@12:3/actual_out"},"13:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"13:3","id":"can://typescript/slim/src/index.ts/main@13:3/actual_out"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3","id":"can://typescript/slim/src/index.ts/main@7:3/actual_in:0"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_in:0"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_out"},"8:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_in:1"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3","id":"can://typescript/slim/src/index.ts/main@11:3/actual_in:0"},"13:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"13:3","id":"can://typescript/slim/src/index.ts/main@13:3/actual_in:0"},"16:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0"},"16:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},"16:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:1"},"16:3/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:2"},"17:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"17:3","id":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0"},"17:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"17:3","id":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_in:0"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_out"},"19:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_in:1"},"21:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"21:3","id":"can://typescript/slim/src/index.ts/main@21:3/actual_in:0"},"22:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"22:3","id":"can://typescript/slim/src/index.ts/main@22:3/actual_in:0"},"22:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"22:3","id":"can://typescript/slim/src/index.ts/main@22:3/actual_out"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3","id":"can://typescript/slim/src/index.ts/main@7:3/actual_out"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3","id":"can://typescript/slim/src/index.ts/main@9:3/actual_out"},"21:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:3","id":"can://typescript/slim/src/index.ts/main@21:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"11:3/actual_out","dst":"11:3","var":"$ret","prov":["reaching-defs"]},{"src":"12:3/actual_out","dst":"12:3","var":"$ret","prov":["reaching-defs"]},{"src":"13:3/actual_out","dst":"13:3","var":"$ret","prov":["reaching-defs"]},{"src":"16:3/actual_out","dst":"16:3","var":"$ret","prov":["reaching-defs"]},{"src":"17:3/actual_out","dst":"17:3","var":"$ret","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"19:3/actual_out","dst":"19:3","var":"$ret","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"21:3/actual_out","dst":"21:3","var":"$ret","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3/actual_in:0","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"]},{"src":"7:3/actual_out","dst":"7:3","var":"$ret","prov":["reaching-defs"]},{"src":"8:3/actual_out","dst":"8:3","var":"$ret","prov":["reaching-defs"]},{"src":"9:3/actual_out","dst":"9:3","var":"$ret","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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://typescript/slim/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/recordLogin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://typescript/slim/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},"@formal_in:2":{"kind":"formal_in","of":"role","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/constructor@formal_out"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5","id":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_out"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5","id":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_in:0"}},"entrypoints":[],"is_entrypoint":false,"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"]},{"src":"@formal_in:0","dst":"40:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"40:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"40:5/actual_out","dst":"40:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/isAdmin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1200,1228]},"id":"can://typescript/slim/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Robot/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[731,783]},"id":"can://typescript/slim/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[788,826]},"id":"can://typescript/slim/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[858,870]},"id":"can://typescript/slim/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"role","id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/create@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_out"},"25:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:5","id":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_out"},"25:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:5","id":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_in:0"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:0"},"26:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:1"},"26:5/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:2"},"27:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"27:5","id":"can://typescript/slim/src/services.ts/UserService/create@27:5/actual_in:0"},"27:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"27:5","id":"can://typescript/slim/src/services.ts/UserService/create@27:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"25:5/actual_in:0","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5/actual_in:0","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":"@formal_in:0","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5/actual_in:1","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5/actual_in:2","var":"role","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"25:5/actual_out","dst":"25:5","var":"$ret","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":"26:5/actual_out","dst":"26:5","var":"$ret","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":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[904,950]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[955,992]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/createGuest@formal_out"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_out"},"33:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_out"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_in:0"},"33:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:0"},"33:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"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":"32:5/actual_in:0","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":"32:5","dst":"33:5/actual_in:0","var":"name","prov":["reaching-defs"]},{"src":"32:5/actual_out","dst":"32:5","var":"$ret","prov":["reaching-defs"]},{"src":"33:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"33:5/actual_out","dst":"33:5","var":"$ret","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":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1030,1073]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/describeAll@formal_out"},"37:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"37:5","id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5/actual_in:0"},"37:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:5","id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5/actual_out"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@exit"},"@formal_in:0":{"kind":"formal_in","of":"u","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_out"},"37:34/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:34","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"37:34","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"37:34/actual_out","dst":"37:34","var":"$ret","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1121,1135]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1140,1213]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1176,1207]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1218,1231]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/loginAll@formal_out"},"43:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"43:7","id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"43:7/actual_out","dst":"43:7","var":"$ret","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"startId","id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[162,185]},"id":"can://typescript/slim/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@exit"},"@formal_in:0":{"kind":"formal_in","of":"seed","id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/makeGuestName@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[398,422]},"id":"can://typescript/slim/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@exit"},"@formal_in:0":{"kind":"formal_in","of":"thing","id":"can://typescript/slim/src/services.ts/announce@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/announce@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"13:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[548,553]},"id":"can://typescript/slim/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@exit"},"@formal_in:0":{"kind":"formal_in","of":"n","id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/nextId@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"17:46","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@exit"},"@formal_in:0":{"kind":"formal_in","of":"part","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_out"},"14:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0"},"14:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"14:7/actual_in:0","var":"part","prov":["reaching-defs"]},{"src":"14:7/actual_out","dst":"14:7","var":"$ret","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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@formal_out"},"18:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"18:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0"},"18:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"18:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"n","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_out"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_in:0"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5/actual_in:0","var":"n","prov":["reaching-defs"]},{"src":"4:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"4:5/actual_out","dst":"4:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out"},"8:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_in:0"},"8:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_out"},"8:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://typescript/slim/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://typescript/slim/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://typescript/slim/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://typescript/slim/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@exit"},"@formal_in:0":{"kind":"formal_in","of":"items","id":"can://typescript/slim/src/util.ts/classify@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/classify@formal_out"},"30:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:5","id":"can://typescript/slim/src/util.ts/classify@30:5/actual_in:0"},"30:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:5","id":"can://typescript/slim/src/util.ts/classify@30:5/actual_out"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5","id":"can://typescript/slim/src/util.ts/classify@31:5/actual_in:0"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5","id":"can://typescript/slim/src/util.ts/classify@31:5/actual_out"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@exit"},"@formal_in:0":{"kind":"formal_in","of":"item","id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_out"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5/actual_in:0"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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"}]}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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":"30:5/actual_in:0","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":"30:5/actual_out","dst":"30:5","var":"$ret","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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[{"src":"can://typescript/slim/src/controllers.ts/UserController/show@20:5","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@11:3/actual_in:0","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@13:3","dst":"can://typescript/slim/src/controllers.ts/UserController/show@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/index.ts/main@13:3/actual_in:0","dst":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:1","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:2","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@19:3/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@19:3/actual_in:1","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@21:3/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@7:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@8:3","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/index.ts/main@8:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@8:3/actual_in:1","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@9:3","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_in:0","dst":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/nextId@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:0","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:1","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:2","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:1","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/slim/src/util.ts/classify@30:5/actual_in:0","dst":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"param_out":[{"src":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@11:3/actual_out"},{"src":"can://typescript/slim/src/controllers.ts/UserController/list@formal_out","dst":"can://typescript/slim/src/index.ts/main@12:3/actual_out"},{"src":"can://typescript/slim/src/controllers.ts/UserController/show@formal_out","dst":"can://typescript/slim/src/index.ts/main@13:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/Entity/constructor@formal_out","dst":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/Robot/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/constructor@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/describe@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/show@21:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/describe@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/recordLogin@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7/actual_out"},{"src":"can://typescript/slim/src/services.ts/announce@formal_out","dst":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/announce@formal_out","dst":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/makeGuestName@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/nextId@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@7:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/index.ts/main@8:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@formal_out","dst":"can://typescript/slim/src/index.ts/main@9:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/list@26:5/actual_out"},{"src":"can://typescript/slim/src/util.ts/classify/keyOf@formal_out","dst":"can://typescript/slim/src/util.ts/classify@30:5/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_out","dst":"can://typescript/slim/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@formal_out","dst":"can://typescript/slim/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_out","dst":"can://typescript/slim/src/index.ts/main@19:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_out"}],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file +{"schema_version":"2.0.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.4.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_out"},"20:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_in:0"},"20:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_out"},"21:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"20:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]},{"src":"20:5/actual_out","dst":"20:5","var":"$ret","prov":["reaching-defs"]},{"src":"21:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"21:5/actual_out","dst":"21:5","var":"$ret","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":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/list@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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"]},{"src":"26:5/actual_out","dst":"26:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"service","id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://typescript/slim/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@exit"},"@formal_in:0":{"kind":"formal_in","of":"prefix","id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Controller@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Controller/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://typescript/slim/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@exit"},"@formal_in:0":{"kind":"formal_in","of":"path","id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Get@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Get/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://typescript/slim/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Param@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Param/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://typescript/slim/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://typescript/slim/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[577,626]},"id":"can://typescript/slim/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[629,670]},"id":"can://typescript/slim/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/index.ts/main@formal_out"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3","id":"can://typescript/slim/src/index.ts/main@11:3/actual_out"},"12:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"12:3","id":"can://typescript/slim/src/index.ts/main@12:3/actual_out"},"13:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"13:3","id":"can://typescript/slim/src/index.ts/main@13:3/actual_out"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3","id":"can://typescript/slim/src/index.ts/main@7:3/actual_in:0"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_in:0"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_out"},"8:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_in:1"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3","id":"can://typescript/slim/src/index.ts/main@11:3/actual_in:0"},"13:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"13:3","id":"can://typescript/slim/src/index.ts/main@13:3/actual_in:0"},"16:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0"},"16:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},"16:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:1"},"16:3/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:2"},"17:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"17:3","id":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0"},"17:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"17:3","id":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_in:0"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_out"},"19:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_in:1"},"21:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"21:3","id":"can://typescript/slim/src/index.ts/main@21:3/actual_in:0"},"22:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"22:3","id":"can://typescript/slim/src/index.ts/main@22:3/actual_in:0"},"22:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"22:3","id":"can://typescript/slim/src/index.ts/main@22:3/actual_out"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3","id":"can://typescript/slim/src/index.ts/main@7:3/actual_out"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3","id":"can://typescript/slim/src/index.ts/main@9:3/actual_out"},"21:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:3","id":"can://typescript/slim/src/index.ts/main@21:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"11:3/actual_out","dst":"11:3","var":"$ret","prov":["reaching-defs"]},{"src":"12:3/actual_out","dst":"12:3","var":"$ret","prov":["reaching-defs"]},{"src":"13:3/actual_out","dst":"13:3","var":"$ret","prov":["reaching-defs"]},{"src":"16:3/actual_out","dst":"16:3","var":"$ret","prov":["reaching-defs"]},{"src":"17:3/actual_out","dst":"17:3","var":"$ret","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"19:3/actual_out","dst":"19:3","var":"$ret","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"21:3/actual_out","dst":"21:3","var":"$ret","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3/actual_in:0","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"]},{"src":"7:3/actual_out","dst":"7:3","var":"$ret","prov":["reaching-defs"]},{"src":"8:3/actual_out","dst":"8:3","var":"$ret","prov":["reaching-defs"]},{"src":"9:3/actual_out","dst":"9:3","var":"$ret","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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://typescript/slim/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/recordLogin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://typescript/slim/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},"@formal_in:2":{"kind":"formal_in","of":"role","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/constructor@formal_out"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5","id":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_out"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5","id":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_in:0"}},"entrypoints":[],"is_entrypoint":false,"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"]},{"src":"@formal_in:0","dst":"40:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"40:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"40:5/actual_out","dst":"40:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/isAdmin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1200,1228]},"id":"can://typescript/slim/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Robot/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[731,783]},"id":"can://typescript/slim/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[788,826]},"id":"can://typescript/slim/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[858,870]},"id":"can://typescript/slim/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"role","id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/create@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_out"},"25:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:5","id":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_out"},"25:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:5","id":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_in:0"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:0"},"26:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:1"},"26:5/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:2"},"27:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"27:5","id":"can://typescript/slim/src/services.ts/UserService/create@27:5/actual_in:0"},"27:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"27:5","id":"can://typescript/slim/src/services.ts/UserService/create@27:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"25:5/actual_in:0","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5/actual_in:0","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":"@formal_in:0","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5/actual_in:1","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5/actual_in:2","var":"role","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"25:5/actual_out","dst":"25:5","var":"$ret","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":"26:5/actual_out","dst":"26:5","var":"$ret","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":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[904,950]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[955,992]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/createGuest@formal_out"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_out"},"33:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_out"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_in:0"},"33:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:0"},"33:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"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":"32:5/actual_in:0","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":"32:5","dst":"33:5/actual_in:0","var":"name","prov":["reaching-defs"]},{"src":"32:5/actual_out","dst":"32:5","var":"$ret","prov":["reaching-defs"]},{"src":"33:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"33:5/actual_out","dst":"33:5","var":"$ret","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":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1030,1073]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/describeAll@formal_out"},"37:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"37:5","id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5/actual_in:0"},"37:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:5","id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5/actual_out"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@exit"},"@formal_in:0":{"kind":"formal_in","of":"u","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_out"},"37:34/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:34","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"37:34","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"37:34/actual_out","dst":"37:34","var":"$ret","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1121,1135]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1140,1213]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1176,1207]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1218,1231]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/loginAll@formal_out"},"43:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"43:7","id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"43:7/actual_out","dst":"43:7","var":"$ret","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"startId","id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[162,185]},"id":"can://typescript/slim/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@exit"},"@formal_in:0":{"kind":"formal_in","of":"seed","id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/makeGuestName@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[398,422]},"id":"can://typescript/slim/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@exit"},"@formal_in:0":{"kind":"formal_in","of":"thing","id":"can://typescript/slim/src/services.ts/announce@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/announce@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"13:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[548,553]},"id":"can://typescript/slim/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@exit"},"@formal_in:0":{"kind":"formal_in","of":"n","id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/nextId@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"17:46","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@exit"},"@formal_in:0":{"kind":"formal_in","of":"part","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_out"},"14:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0"},"14:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"14:7/actual_in:0","var":"part","prov":["reaching-defs"]},{"src":"14:7/actual_out","dst":"14:7","var":"$ret","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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@formal_out"},"18:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"18:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0"},"18:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"18:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"n","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_out"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_in:0"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5/actual_in:0","var":"n","prov":["reaching-defs"]},{"src":"4:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"4:5/actual_out","dst":"4:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out"},"8:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_in:0"},"8:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_out"},"8:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://typescript/slim/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://typescript/slim/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://typescript/slim/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://typescript/slim/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@exit"},"@formal_in:0":{"kind":"formal_in","of":"items","id":"can://typescript/slim/src/util.ts/classify@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/classify@formal_out"},"30:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:5","id":"can://typescript/slim/src/util.ts/classify@30:5/actual_in:0"},"30:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:5","id":"can://typescript/slim/src/util.ts/classify@30:5/actual_out"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5","id":"can://typescript/slim/src/util.ts/classify@31:5/actual_in:0"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5","id":"can://typescript/slim/src/util.ts/classify@31:5/actual_out"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@exit"},"@formal_in:0":{"kind":"formal_in","of":"item","id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_out"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5/actual_in:0"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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"}]}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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":"30:5/actual_in:0","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":"30:5/actual_out","dst":"30:5","var":"$ret","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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[{"src":"can://typescript/slim/src/controllers.ts/UserController/show@20:5","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@11:3/actual_in:0","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@13:3","dst":"can://typescript/slim/src/controllers.ts/UserController/show@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/index.ts/main@13:3/actual_in:0","dst":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:1","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:2","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@19:3/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@19:3/actual_in:1","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@21:3/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@7:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@8:3","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/index.ts/main@8:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@8:3/actual_in:1","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@9:3","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_in:0","dst":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/nextId@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:0","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:1","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:2","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:1","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/slim/src/util.ts/classify@30:5/actual_in:0","dst":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"param_out":[{"src":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@11:3/actual_out"},{"src":"can://typescript/slim/src/controllers.ts/UserController/list@formal_out","dst":"can://typescript/slim/src/index.ts/main@12:3/actual_out"},{"src":"can://typescript/slim/src/controllers.ts/UserController/show@formal_out","dst":"can://typescript/slim/src/index.ts/main@13:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/Entity/constructor@formal_out","dst":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/Robot/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/constructor@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/describe@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/show@21:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/describe@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/recordLogin@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7/actual_out"},{"src":"can://typescript/slim/src/services.ts/announce@formal_out","dst":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/announce@formal_out","dst":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/makeGuestName@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/nextId@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@7:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/index.ts/main@8:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@formal_out","dst":"can://typescript/slim/src/index.ts/main@9:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/list@26:5/actual_out"},{"src":"can://typescript/slim/src/util.ts/classify/keyOf@formal_out","dst":"can://typescript/slim/src/util.ts/classify@30:5/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_out","dst":"can://typescript/slim/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@formal_out","dst":"can://typescript/slim/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_out","dst":"can://typescript/slim/src/index.ts/main@19:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_out"}],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/uv.lock b/uv.lock index d5792e90..76c13f7b 100644 --- a/uv.lock +++ b/uv.lock @@ -352,7 +352,7 @@ requires-dist = [ { name = "cldk", extras = ["neo4j"], marker = "extra == 'all'" }, { name = "codeanalyzer-java", marker = "extra == 'java'", specifier = "==3.0.3" }, { name = "codeanalyzer-python", specifier = "==1.4.1" }, - { name = "codeanalyzer-typescript", specifier = "==1.3.0" }, + { name = "codeanalyzer-typescript", specifier = "==1.4.0" }, { name = "neo4j", marker = "extra == 'neo4j'", specifier = ">=5.14,<7" }, { name = "networkx", specifier = ">=3.4.2,<4" }, { name = "pydantic", specifier = ">=2.10.6,<3" }, @@ -433,14 +433,14 @@ wheels = [ [[package]] name = "codeanalyzer-typescript" -version = "1.3.0" +version = "1.4.0" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/16/c4/7c9292b5fb2dd903f0a514065fd61f7a06a8ac4403c53b43467fe2e7be78/codeanalyzer_typescript-1.3.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:955510071e900cbff8f7f8afc817c7a9fa1895c73dfe170501ed649ec0d646d5", size = 30870559, upload-time = "2026-09-06T14:40:52.755Z" }, - { url = "https://files.pythonhosted.org/packages/bc/cf/b16cbf1e599c2bac871fcc8e3a33e3af400e70ebf1f44807f0edc07622f4/codeanalyzer_typescript-1.3.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:55a0e62c96d74093eb3e768fe4bb6d0e03fc641c612b0b5d52bb88cde6bc71ab", size = 28268784, upload-time = "2026-09-06T14:40:56.886Z" }, - { url = "https://files.pythonhosted.org/packages/2b/72/ce7caaac4d8c15820c3600780edeae2d9e5011957c46143733eeba204512/codeanalyzer_typescript-1.3.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:c78089b8e69359cf2adf950d5f5cfe6f1c5efec50aa3e2444bb9eea38a130262", size = 39036310, upload-time = "2026-09-06T14:40:59.234Z" }, - { url = "https://files.pythonhosted.org/packages/da/2d/aa21cf4a26ca3345e3825f39bb658bab837b9d560c5721fdc3f6cfd0687f/codeanalyzer_typescript-1.3.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:860d0cf20fbda104e1f15ee520167485099f49710eadae23c95fda56ce2bccba", size = 39080571, upload-time = "2026-09-06T14:41:01.944Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ee/b26b55d69285bd349dcc56a10fdf8f10706732c3a894d55361b85dc9cd18/codeanalyzer_typescript-1.3.0-py3-none-win_amd64.whl", hash = "sha256:494f34109931e6cad5d634b4c8f2dc9df29a43b304ef6e5db09e9edaaa269fb4", size = 42230475, upload-time = "2026-09-06T14:41:04.76Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f3/63cb17f9e86f82f9ccab0542c5605cbc59a07f1c69b206da1915e3e1de87/codeanalyzer_typescript-1.4.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2cb970c9a8c3a4b03d586b54f74b2051cfc0cf466a64c25301c8c1336f9facd5", size = 30871883, upload-time = "2026-09-07T21:24:10.41Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5d/02565ad92e5bc69b7ee3eb713466404a0d255011249adf9b6c7f87985f84/codeanalyzer_typescript-1.4.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:38d8892a6bdd06922fb4db4cd487455d4b1d73ca2ce9fff575f3399d747e8490", size = 28270100, upload-time = "2026-09-07T21:24:14.491Z" }, + { url = "https://files.pythonhosted.org/packages/da/1f/6494066ce8efbe00d5b4df720e6769376fb6e370e3b051ce3a0ddba6b4c5/codeanalyzer_typescript-1.4.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:a97e2e61aff13329f151d83087b1d9f2c445654ca9c6f063164eff9b5722c77b", size = 39037559, upload-time = "2026-09-07T21:24:18.52Z" }, + { url = "https://files.pythonhosted.org/packages/8d/aa/633398cf8b532c101fbcc0d25a163a451a31433d1b05eb0f3a5983320c81/codeanalyzer_typescript-1.4.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6fb27a4ebe58ad94295cd739230b4951123417b8552000f1820f891d38f7b4f1", size = 39081825, upload-time = "2026-09-07T21:24:23.512Z" }, + { url = "https://files.pythonhosted.org/packages/f8/dd/eb01cd47b57781ae2773e51c042fa72e70902e88900e3caa2750561e783b/codeanalyzer_typescript-1.4.0-py3-none-win_amd64.whl", hash = "sha256:b3579e95ea83c3bc96656dd0c348d87f834cb434e25aa85cb7723b5d6d25a41c", size = 42231729, upload-time = "2026-09-07T21:24:28.204Z" }, ] [[package]] From 32d7ea7eae1b0c55f819ad043c24e8b6141c9e79 Mon Sep 17 00:00:00 2001 From: Rahul Krishna Date: Mon, 7 Sep 2026 19:46:40 -0400 Subject: [PATCH 2/2] feat(typescript): move the pin to 1.5.0 and take its UTF-8 spans MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.5.0 closes the four ceilings the 1.4.0 uptake documented, so this is mostly deletion — but one of them is breaking and needs SDK code. TSSpan.bytes are UTF-8 byte offsets now, on every node at every level (cants#179). They were UTF-16 code units, which Python sliced as code points and the Neo4j projection sliced as bytes: three units that agreed only on ASCII, which is why the mess hid. _Spanned.code now decodes the module's UTF-8 bytes the way JCompilationUnit.slice() already did — encoded once per module in the same validator that threads the source, not at all when the file is ASCII. Measured on the regenerated fixture: 28 spanned nodes live in non-ASCII modules and 14 of them would have been sliced wrong by the old character index. A graph-rebuilt node is unaffected; it carries its own code with a character-counted span and no _source_bytes. Everything else is removal, each verified rather than assumed: :TSCallable.code is no longer one line short over Neo4j. The four xfail(strict=True) marks pinned to that were run against a 1.5.0 graph first and all four XPASS(strict) — which is what strict was there to make loud — so the marks are gone and the tests are ordinary parity assertions again. Declaration merging mints one id per facet (cants#177). On the re-emitted superset graph no node carries two declaration labels any more, and 7 signatures name two nodes apiece (the second suffixed #interface / #type). This is a behaviour gain, not just a defect closing: both facets are now served — a class X + interface X pair answers from get_classes AND get_interfaces, where before the facet the last-written kind did not name was lost. The two live tests that asserted the collision now assert the split, both still deriving every expectation from the graph. The kind-alongside-label predicates stay: they are what keeps an accessor to its own facet now that a signature is no longer unique. cants#180 and #181 had no SDK workaround to remove. schema_version is still 2.0.0 across a change the analyzer marks breaking, so the contract version is not a signal that one landed. Said plainly in the changelog rather than left for the next reader to find. --- CHANGELOG.md | 27 ++++++---- .../typescript/neo4j/neo4j_backend.py | 43 ++++++++-------- cldk/models/typescript/models.py | 31 ++++++++---- docs/agent-api-reference.md | 9 ++-- pyproject.toml | 4 +- .../test_typescript_addressing_live.py | 43 +++++++++------- .../test_typescript_bulk_parity_live.py | 38 +++++--------- .../test_typescript_e2e_neo4j_live.py | 49 ++++++++++++------- tests/models/typescript/test_ts_v2_models.py | 27 ++++++++++ .../analysis_json/v2/a1/analysis.json | 2 +- .../analysis_json/v2/a2/analysis.json | 2 +- .../analysis_json/v2/a3/analysis.json | 2 +- .../analysis_json/v2/a4/analysis.json | 2 +- uv.lock | 14 +++--- 14 files changed, 176 insertions(+), 117 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67a6f1ef..c5f5db5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,14 @@ surface** (3b). Design records: `docs/design/specs/2026-09-06-leg-2.5-typescript `TSCallableOverview.from_callable` takes a required keyword-only `path`. - **Removed:** `TypeScriptAnalysis.get_entry_point_methods` and `get_service_entry_point_methods`, which only ever raised — the working entrypoint accessors below replace them. +- **TypeScript `TSSpan.bytes` are UTF-8 byte offsets**, on every node at every level + (codeanalyzer-typescript 1.5.0, cants#179). They were UTF-16 code units, which Python sliced as code points + and the Neo4j projection sliced as bytes — three units that agreed only on ASCII. `TSCallable.code` and + every accessor built on it (`get_source`, `get_method_bodies`, `describe`, `locate(...).source`) now decode + the module's UTF-8 bytes, the way Java's `JCompilationUnit.slice()` already did: encoded once per module, a + plain index when the file is ASCII. **On a non-ASCII file, text read through 1.3.0/1.4.0 was wrong and is now + right — re-emit rather than compare offsets across versions.** Note that `schema_version` stays `2.0.0` + through this break: the contract version is not a signal that a breaking change landed. ### Added @@ -95,7 +103,7 @@ surface** (3b). Design records: `docs/design/specs/2026-09-06-leg-2.5-typescript `ddg` edges whose endpoint was never emitted as a body node (codeanalyzer-java#228), so `get_ddg()` over `analysis.json` and over Neo4j now report the same edges — 10,430 on daytrader8, set for set, against a 5,434/5,347 split before. -- **Pins:** `codeanalyzer-java` 2.4.1 → 3.0.3, `codeanalyzer-typescript` 0.4.3 → 1.4.0. +- **Pins:** `codeanalyzer-java` 2.4.1 → 3.0.3, `codeanalyzer-typescript` 0.4.3 → 1.5.0. - **The Java analyzer ships as a wheel, not a jar in this repo.** The 35 MB checked-in jar, the Temurin download in `_jdk.py`, and the release workflow's jar injection are gone; no `JAVA_HOME` is read or set, and no JDK is downloaded. The published wheel drops from about 35 MB to 320 KB. @@ -115,7 +123,15 @@ surface** (3b). Design records: `docs/design/specs/2026-09-06-leg-2.5-typescript still refuse there rather than answer an empty that would read as a fact; the decision is measured from the application's own data — is any carrier present — never from the analyzer's version string, so a re-emitted graph starts answering with no SDK change. `TSImport`/`TSExport` gained the analyzer's new - `resolved_module`. **Migration:** re-emit with `codeanalyzer-typescript>=1.4.0 --emit neo4j`. + `resolved_module`. **Migration:** re-emit with `codeanalyzer-typescript>=1.5.0 --emit neo4j`. +- **Three more codeanalyzer-typescript ceilings are gone in 1.5.0**, verified against the re-emitted reference + graph rather than taken from the release notes. `:TSCallable.code` is no longer one line short over Neo4j + (cants#179) — the four `xfail(strict=True)` marks that pinned it now XPASS and are removed. Declaration + merging mints **one id per facet** (cants#177), so a `class X` + `interface X` pair is two nodes and *both* + are served, where before one facet was lost to whichever declaration the emitter saw last; on + superset-frontend that is 7 signatures, and no node carries two declaration labels any more. The analyzer + also refuses a missing or non-directory input instead of exiting 0 (cants#181) and no longer clones the whole + envelope per module (cants#180); neither had an SDK workaround to remove. - **Every Cypher statement is scoped per bound variable, not per statement** — both endpoints of a call edge, a quantified path's far end, a slice's reached body nodes, and every *interior* node of a variable-length or shortest-path walk (`all(n IN nodes(p) …)` on the slice, path and reachability queries). A statement that @@ -164,14 +180,7 @@ surface** (3b). Design records: `docs/design/specs/2026-09-06-leg-2.5-typescript are not recoverable, and the emitter drops a relative specifier that resolved to no emitted module. Exports, parameters and unresolved config reads are lossless, except that the config-read edge carries no `site` and collapses sites sharing a `(callee, key, reason)` triple. -- **Source text read over the TypeScript Neo4j backend is truncated by one line.** codeanalyzer-typescript - 1.3.0 and 1.4.0 project `:TSCallable.code` as the callable's text minus its final `\n}` while the line - numbers stay correct, so `get_source`, `get_method_bodies`, `describe` and `locate(...).source` return short text over - Neo4j and complete text in process (codeanalyzer-typescript#179). Read the text in process, or re-slice the - span, until the fix ships. - TypeScript's DDG has one provenance tier; Java's has two; Python's has three. -- codeanalyzer-typescript mints one id for a value and a type of the same name under declaration merging - (codeanalyzer-typescript#177); such a node resolves to the facet its kind names, or not at all. - `get_config_keys()` is still keyed by a `can://` id on Python and TypeScript, where Java now uses the artifact-relative key (#346). - **Java's `slice_forward`, `paths_between`, `flows_to_call` and `flows_to_argument` still raise on an diff --git a/cldk/analysis/typescript/neo4j/neo4j_backend.py b/cldk/analysis/typescript/neo4j/neo4j_backend.py index af315d12..004d8840 100644 --- a/cldk/analysis/typescript/neo4j/neo4j_backend.py +++ b/cldk/analysis/typescript/neo4j/neo4j_backend.py @@ -75,27 +75,27 @@ class never writes and needs neither the analyzer binary nor the sources. answers ``""`` plus a ``module_source_unavailable`` diagnostic and :meth:`get_source` refuses a body-node id outright, where the local backend answers both. -**And one that is a value divergence rather than an absence**, which is why it is stated loudly: -codeanalyzer-typescript 1.3.0 and 1.4.0 project ``:TSCallable.code`` **one line short of the callable's own -span** -- the graph text is the in-memory text minus its final ``"\\n}"`` (measured: 544 characters -against 546 for the sample app's ``src/index.main``), while ``start_line``/``end_line`` on the same -node are correct. Every accessor that hands a caller a callable's source over this backend is -affected: :meth:`get_source`, :meth:`get_method_bodies`, :meth:`describe`, :meth:`locate` / -:meth:`locate_many` and ``TSCallable.code`` on a rebuilt node. Filed upstream as -codellm-devkit/codeanalyzer-typescript#179; four ``xfail(strict=True)`` marks in -``tests/analysis/typescript/test_typescript_bulk_parity_live.py`` are pinned to it, so they fail -loudly the day it is fixed rather than passing quietly. +**Two value divergences used to be stated loudly here and are gone at the 1.5.0 pin**, both fixed +upstream and both re-measured against the re-emitted reference graph rather than taken on trust. +``:TSCallable.code`` was one line short of the callable's own span, the graph text being the +in-memory text minus its final ``"\\n}"`` (cants#179) -- the four ``xfail(strict=True)`` marks in +``tests/analysis/typescript/test_typescript_bulk_parity_live.py`` that pinned it now XPASS, so the +tests are ordinary parity assertions again. And spans are now UTF-8 byte offsets throughout, the +same break, which is what lets ``TSCallable.code`` mean one thing on both backends for a non-ASCII +file (see :meth:`~cldk.models.typescript.models._Spanned.code`). One thing is *less* lossy here than in the Python twin: a TypeScript ``call`` body node carries ``callee`` as a property, so ``LocateResult.body.callee`` is populated over Neo4j too. -One more is the emitter's: two declarations of one name (TypeScript -declaration merging -- ``const X = …`` + ``interface X``, ``const X = …`` + ``type X``, ``type X`` + -a field ``X``) share one id, so ``MERGE`` collapses them onto one node carrying both labels and the -``kind`` of whichever was written last. Such a node is rebuilt as the facet the containment edge -declares (``TS_DECLARES`` names a type or callable; its labels say which) and the other facet's -members under it are lost; a node whose labels cannot name the facet is raised as the defect it is -(three merged nodes on the superset graph). +**Declaration merging is no longer a collision.** Two declarations of one name (``const X = …`` + +``interface X``, ``class X`` + ``interface X``, ``const X = …`` + ``type X``) used to share one id, +so ``MERGE`` collapsed them onto one node carrying both labels and the ``kind`` of whichever was +written last, and the facet that ``kind`` did not name was lost. 1.5.0 mints **one id per facet** +(cants#177) -- the second suffixed ``#interface`` / ``#type`` -- so both facets are nodes and both +are served, each through the accessor its ``kind`` names. Measured on the re-emitted superset +graph: **no** node carries two declaration labels, and 7 signatures name two nodes apiece. The +kind-alongside-label predicates below are kept: they are what keeps an accessor to its own facet +now that a signature is no longer unique, and they cost nothing. """ from __future__ import annotations @@ -1462,11 +1462,10 @@ def _sources_for(self, refs: Sequence[str]) -> Dict[str, "str | None"]: callables the emitter writes no ``code`` for are the implicit constructors, which the local backend also has no text for. - **The text this returns is one line short of the callable's span** on - codeanalyzer-typescript 1.3.0 -- the graph's ``code`` is the source minus its final - ``"\\n}"`` (codellm-devkit/codeanalyzer-typescript#179). Every caller of this seam -- - :meth:`get_source` and :meth:`describe` -- inherits it, as do :meth:`get_method_bodies` and - :meth:`locate`, which read ``c.code`` by their own statements. See the module docstring. + The text was one line short of the callable's span through 1.4.0 + (codellm-devkit/codeanalyzer-typescript#179); 1.5.0 fixed it, so this and every caller of + the seam -- :meth:`get_source`, :meth:`describe`, and :meth:`get_method_bodies` / + :meth:`locate`, which read ``c.code`` by their own statements -- return the whole span. """ wanted = set(refs) found: Dict[str, "str | None"] = {} diff --git a/cldk/models/typescript/models.py b/cldk/models/typescript/models.py index 5d76e18a..a0784486 100644 --- a/cldk/models/typescript/models.py +++ b/cldk/models/typescript/models.py @@ -69,6 +69,9 @@ class _Spanned(_Base): span: TSSpan _source: Optional[str] = PrivateAttr(default=None) + #: The owning module's source encoded once as UTF-8, or ``None`` when that source is ASCII + #: (then a plain index is already the byte index). Threaded with ``_source``. + _source_bytes: Optional[bytes] = PrivateAttr(default=None) @property def start_line(self) -> int: @@ -88,18 +91,25 @@ def end_column(self) -> int: @property def code(self) -> Optional[str]: - """The node's source text: ``module.source[span.bytes[0]:span.bytes[1]]``, sliced as - **characters**. ``None`` until the node has been validated as part of a :class:`TSModule`. - - Caveat (codeanalyzer-typescript #174): the analyzer computes ``bytes`` as UTF-16 code-unit - offsets (JavaScript string indices). Python indexes code points, so on a file containing - astral characters (emoji, some CJK) the slice drifts after the first such character. The - Neo4j projection slices the same offsets as bytes and disagrees with both on non-ASCII - files. Both are documented lossiness until fixed upstream. + """The node's source text, ``module.source`` between the span's **UTF-8 byte** offsets. + ``None`` until the node has been validated as part of a :class:`TSModule`. + + codeanalyzer-typescript 1.5.0 made ``span.bytes`` UTF-8 byte offsets on every node at every + level (cants#179, the release's one breaking change), which retires the three-way + disagreement this used to document: the analyzer emitted UTF-16 code units (cants#174), + Python sliced code points, and the Neo4j projection sliced bytes, so the three agreed only + on ASCII. Now there is one unit, and this decodes it the way + :meth:`~cldk.models.java.models.JCompilationUnit.slice` already did -- the module's text + encoded once when it is not ASCII, a plain index when it is, so an ASCII file pays nothing. + A graph-rebuilt node is unaffected either way: it carries its own ``code`` as ``_source`` + with a character-counted span, and no ``_source_bytes``. """ if self._source is None: return None - return self._source[self.span.bytes[0] : self.span.bytes[1]] + b0, b1 = self.span.bytes + if self._source_bytes is None: + return self._source[b0:b1] + return self._source_bytes[b0:b1].decode("utf-8") # ---------------------------------------------------------------------------------------------- @@ -558,8 +568,11 @@ class TSModule(_Base): @model_validator(mode="after") def _thread_source(self) -> "TSModule": # Private attrs are not dumped, so model_dump/model_validate round-trips are unaffected. + # Encoded once per module rather than per node, and not at all for an ASCII file. + source_bytes = None if self.source.isascii() else self.source.encode("utf-8") for node in _iter_spanned(self): node._source = self.source + node._source_bytes = source_bytes return self @property diff --git a/docs/agent-api-reference.md b/docs/agent-api-reference.md index b82b5a28..69d0792d 100644 --- a/docs/agent-api-reference.md +++ b/docs/agent-api-reference.md @@ -43,7 +43,7 @@ and the message names what it found and the floor. What attaching to each genera ## TypeScript -Status: leg 2.5b (`codeanalyzer-typescript` 1.4.0 pinned; graphs emitted by 1.3.0 or newer +Status: leg 2.5b (`codeanalyzer-typescript` 1.5.0 pinned; graphs emitted by 1.3.0 or newer served, with four accessors gated on the 1.4.0 binding layer — see the floor below). What attaches today is the **1.x accessor surface** — symbol table, classes / interfaces / enums / type aliases / namespaces, methods, fields, call graph, call sites, decorators, externals, @@ -96,11 +96,11 @@ ts = CLDK.typescript(project_path="/path/to/project", backend=TSCodeAnalyzerConf | emitted by 0.4.x (`:Symbol` / `CALLS` / `HAS_CALLSITE`), a Python graph, an empty database | refused (`GraphSchemaMismatch`), naming the relationship types found and missing | | `analyzer_version` below 1.3.0 (a 1.2.0 graph included), unparsable, or no `:Application` with that id | refused, naming what was found and the floor | | 1.3.0 | served, silent — but `get_imports` / `get_exports` / `get_method_parameters` / `get_unresolved_config_reads` refuse (below) | -| 1.4.0 and newer | served, silent; all four answer | +| 1.4.0 and newer | served, silent; all four answer. 1.5.0 also fixes the one-line source truncation and the declaration-merge id collision below | A 1.2.0 graph carries none of the entrypoint marks and none of the per-callable graph vocabulary this surface reads, so it is refused rather than served with silent empties. **Migration:** re-emit -with `codeanalyzer-typescript>=1.4.0 --emit neo4j` (which takes no `-a`: the emit is always full +with `codeanalyzer-typescript>=1.5.0 --emit neo4j` (which takes no `-a`: the emit is always full depth). **The 1.4.0 binding layer, and how its absence is decided.** codeanalyzer-typescript 1.4.0 @@ -142,7 +142,6 @@ documented empty comes back. | `TSCallable.comments`, `type_parameters`, `overload_signatures`, `body`, `cfg`/`cdg`/`ddg`/`summary` | empty. `parameters` are populated from `parameters_json` on a 1.4.0 graph | | `TSEnumMember.value`; `TSModule.source` / `imports` / `comments`; decorator positions; a call site's `method_name`, receiver and argument facets | empty / `None`. `TSModule.exports` **is** populated from `exports_json`; `imports` stay empty on a rebuilt module — they live on edges the containment fetch does not walk, and `get_imports()` is what reads them | | `code` on any node | the text the graph projected for that node, on a line-only span (columns `0`) | -| **any source text of a callable** — `get_source(sig)`, `get_method_bodies(...)`, `describe(...).source`, `locate(...).source`, `TSCallable.code` | **truncated by one line**: codeanalyzer-typescript 1.3.0 and 1.4.0 project `:TSCallable.code` as the callable's text minus its final `\n}`, while `start_line`/`end_line` on the same node are correct. Measured: 544 characters against the 546 the in-memory backend returns for the same callable. Upstream: [codeanalyzer-typescript#179](https://github.com/codellm-devkit/codeanalyzer-typescript/issues/179). **If you feed graph source to a parser or a diff, expect the closing brace to be missing** — until the fix ships, read the text in-process or re-slice the span yourself | | `get_call_targets(sig)` | an unresolved call site contributes `""` (in-memory: the call's `method_name`) | | `get_synthesized_callables()` | keyed by the anonymous node's own id (the analyzer's older compatibility key is JSON-only) | | `locate(path, line)` at module scope | `source == ""` plus a second `module_source_unavailable` diagnostic — `:TSModule` carries no `source`. In-memory: the module's text | @@ -231,7 +230,7 @@ accessors** — `get_callables_overview`, `get_method_bodies`, `get_decorated_ca - **`get_entrypoint_coverage` reports that there is no report.** codeanalyzer-java emits the entrypoint *marks* and nothing about the pass that made them: `analysis.json` carries no report key and the `:JApplication` anchor carries only `name` / `schema_version` / `analyzer_name` / - `analyzer_version` — unlike codeanalyzer-python 1.4.1 and codeanalyzer-typescript 1.4.0, which + `analyzer_version` — unlike codeanalyzer-python 1.4.1 and codeanalyzer-typescript 1.5.0, which both project one. So it answers with `diagnostics=[entrypoint_report_unavailable]` and empty fields that are explicitly *not* coverage. It is not synthesised from the `is_entrypoint` booleans: a count of syntactically-marked callables is not a coverage record. The marks diff --git a/pyproject.toml b/pyproject.toml index 2f4a788c..b6450096 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "tree-sitter-python==0.23.6", "tree-sitter-javascript==0.23.1", "codeanalyzer-python==1.4.1", - "codeanalyzer-typescript==1.4.0", + "codeanalyzer-typescript==1.5.0", ] [project.optional-dependencies] @@ -88,7 +88,7 @@ include = [ [tool.backend-versions] codeanalyzer-java = "3.0.3" codeanalyzer-python = "1.4.1" -codeanalyzer-typescript = "1.4.0" +codeanalyzer-typescript = "1.5.0" ######################################## # Tool configurations diff --git a/tests/analysis/typescript/test_typescript_addressing_live.py b/tests/analysis/typescript/test_typescript_addressing_live.py index 0fe3b7eb..2e4e8358 100644 --- a/tests/analysis/typescript/test_typescript_addressing_live.py +++ b/tests/analysis/typescript/test_typescript_addressing_live.py @@ -250,24 +250,33 @@ def test_locate_inside_an_anonymous_callable_names_it_by_signature(ts, modules): # ------------------------------------------------------------------------ declaration merging (#177) -def test_a_declaration_merged_node_resolves_to_the_facet_its_kind_names_or_to_nothing(ts): - """cants mints one id for a value and a type of the same name, so ``MERGE`` collapses the two - onto one node carrying both labels and one ``kind`` (cants#177). The domain of - ``resolve_callable`` is the **kind**, not the label: a merged node whose kind is a callable kind - resolves as the callable it is, and one whose kind names a type facet is not reachable through a - callable accessor at all. A collision can therefore never resolve to the wrong facet — it - resolves to the right one, or it misses.""" - type_labels = sorted(TYPE_LABEL_KINDS) - merged = cypher( - f"MATCH (x) WHERE {SCOPED} AND size([l IN labels(x) WHERE l IN $decl]) > 1 " - "RETURN x.id AS id, x.signature AS signature, x.name AS name, x.kind AS kind, labels(x) AS labels ORDER BY x.id", - decl=["TSCallable", "TSField", "TSModule", "TSExternal", *type_labels], +def test_a_merged_declarations_callable_facet_resolves_and_a_type_only_one_misses(ts): + """cants#177, fixed in 1.5.0: a value and a type of the same name used to share one id, so + ``MERGE`` collapsed them onto one node carrying both labels and whichever ``kind`` was written + last, and one facet was simply lost. 1.5.0 mints **one id per facet** (the second suffixed + ``#interface`` / ``#type``), so a signature two declarations share now names two nodes. + + The ruling on ``resolve_callable`` is unchanged and is what this pins: its domain is the + **kind**, not the signature. A signature with a callable facet resolves to that facet's own id + — never to the type facet sharing the signature — and one with no callable facet misses. What + changed is that the answer no longer depends on which declaration the emitter saw last. + """ + decl = ["TSCallable", "TSField", "TSModule", "TSExternal", *sorted(TYPE_LABEL_KINDS)] + assert ( + cypher(f"MATCH (x) WHERE {SCOPED} AND size([l IN labels(x) WHERE l IN $decl]) > 1 RETURN count(x) AS n", decl=decl)[0]["n"] == 0 + ), "a node still carries two declaration labels; cants#177 has regressed" + shared = cypher( + f"MATCH (x) WHERE {SCOPED} AND x.signature IS NOT NULL AND size([l IN labels(x) WHERE l IN $decl]) > 0 " + "WITH x.signature AS signature, collect({id: x.id, kind: x.kind}) AS facets WHERE size(facets) > 1 " + "RETURN signature, facets ORDER BY signature", + decl=decl, ) - assert merged, "this corpus carries no declaration-merged node; the ruling is untested by it" - for row in merged: - if row["kind"] in CALLABLE_KINDS: - assert "TSCallable" in row["labels"], "the emitter kept a callable kind on a node carrying no TSCallable label" - assert ts.resolve_callable(row["signature"]).ref == row["id"] + assert shared, "this corpus carries no declaration shared by two facets; the ruling is untested by it" + for row in shared: + callable_facets = [f for f in row["facets"] if f["kind"] in CALLABLE_KINDS] + if callable_facets: + assert len(callable_facets) == 1, f"{row['signature']} has two callable facets; resolve_callable would be ambiguous" + assert ts.resolve_callable(row["signature"]).ref == callable_facets[0]["id"] else: with pytest.raises(SelectorNotInGraph): ts.resolve_callable(row["signature"]) diff --git a/tests/analysis/typescript/test_typescript_bulk_parity_live.py b/tests/analysis/typescript/test_typescript_bulk_parity_live.py index 201bc290..473f3639 100644 --- a/tests/analysis/typescript/test_typescript_bulk_parity_live.py +++ b/tests/analysis/typescript/test_typescript_bulk_parity_live.py @@ -134,22 +134,14 @@ def ts_dual(typescript_application, tmp_path_factory): _teardown_application() -#: codeanalyzer-typescript 1.3.0 projects ``:TSCallable.code`` one line short of the callable's -#: own span: the graph text is the local text minus its final ``"\n}"`` (measured -- 544 -#: characters against 546 for ``src/index.main``, and ``graph == local.rsplit("\n", 1)[0]`` -#: exactly), while ``start_line``/``end_line`` are right. Filed as -#: codellm-devkit/codeanalyzer-typescript#179; a caller gets *silently truncated source*, which -#: is why it is also a row in ``docs/agent-api-reference.md``'s lossiness table and a known -#: issue in the changelog rather than a note in a plan file. +#: Four tests below used to carry a ``CODE_ONE_LINE_SHORT`` ``xfail(strict=True)``: +#: codeanalyzer-typescript 1.3.0 and 1.4.0 projected ``:TSCallable.code`` one line short of the +#: callable's own span (the graph text was the local text minus its final ``"\n}"``), so every +#: source-text accessor truncated over Neo4j. 1.5.0 fixed it as part of cants#179, and the marks +#: are gone rather than left behind: with the pin at 1.5.0 all four **XPASS(strict)**, which is +#: what ``strict=True`` was there to make loud. The four are now ordinary parity assertions. #: -#: ``strict=True`` is the point: the day the projection is fixed these must fail loudly as -#: XPASS, not quietly start passing with the marks left behind. -CODE_ONE_LINE_SHORT = pytest.mark.xfail( - strict=True, - reason="codeanalyzer-typescript#179: the Neo4j projection writes :TSCallable.code one line short of its span, so every source-text accessor truncates over Neo4j", -) - -#: The same run's second projection gap, and a different one: the decorator call site +#: The projection's second gap, and a different one: the decorator call site #: ``@Param("id")`` reaches the graph carrying only its lines and its resolved callee #: (``method_name=''``, empty ``argument_types``, ``return_type=None``, columns ``-1``) -- the #: call-site lossiness ``TSNeo4jBackend``'s module docstring already records. @@ -167,7 +159,6 @@ def test_callables_overview_parity(ts_dual): assert ref_rows == neo_rows -@CODE_ONE_LINE_SHORT def test_method_bodies_parity(ts_dual): ref, neo = ts_dual sigs = [o.signature for o in ref.get_callables_overview()] @@ -277,7 +268,6 @@ def _positions(ref): return out + [("src/definitely-not-here.ts", 3)] -@CODE_ONE_LINE_SHORT def test_locate_many_parity_over_every_callable_and_every_module(ts_dual): ref, neo = ts_dual positions = _positions(ref) @@ -356,7 +346,6 @@ def test_resolve_value_parity_over_every_callable(ts_dual): assert seen, "the level-4 reference carried no formal_in vertex at all; this test proved nothing" -@CODE_ONE_LINE_SHORT def test_get_source_parity_and_the_one_documented_divergence(ts_dual): ref, neo = ts_dual for o in ref.get_callables_overview(): @@ -376,7 +365,6 @@ def test_get_source_parity_and_the_one_documented_divergence(ts_dual): neo.get_source(body) -@CODE_ONE_LINE_SHORT def test_describe_parity(ts_dual): ref, neo = ts_dual names = [o.signature for o in ref.get_callables_overview()] @@ -389,13 +377,13 @@ def test_describe_parity(ts_dual): def test_the_addressing_miss_paths_name_the_same_subject_on_both_backends(ts_dual): - """The miss halves of ``get_source`` and ``describe``, deliberately *outside* the ``xfail`` that - covers the truncation those two accessors' success paths hit. + """The miss halves of ``get_source`` and ``describe``, split out from the success paths. - An ``xfail(strict=True)`` swallows every assertion in the test it marks, so a miss-path - divergence inside one would be invisible for exactly as long as codeanalyzer-typescript#179 - stays open. This is where finding 2's fix is verified: the local backend used to name the - subject ``'can://typescript/application'`` where the graph named ``'application'``. + It was split out because an ``xfail(strict=True)`` swallows every assertion in the test it + marks, so while codeanalyzer-typescript#179 was open a miss-path divergence inside one would + have been invisible. #179 is fixed and the marks are gone, but the split stays: this is where + finding 2's fix is verified: the local backend used to name the subject + ``'can://typescript/application'`` where the graph named ``'application'``. """ ref, neo = ts_dual a, b = _same_raise(lambda: ref.get_source("no.such.node"), lambda: neo.get_source("no.such.node"), "no.such.node") diff --git a/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py b/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py index 3b70c60e..ac7e2979 100644 --- a/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py +++ b/tests/analysis/typescript/test_typescript_e2e_neo4j_live.py @@ -219,30 +219,45 @@ def test_type_accessors_match_the_graphs_label_and_kind_counts(analysis, count): assert all(type(v) is model and v.kind == kind and v.signature == k for k, v in got.items()), label +#: The declaration labels a node can carry; one apiece since codeanalyzer-typescript 1.5.0. +DECLARATION_LABELS = ["TSCallable", "TSClass", "TSInterface", "TSEnum", "TSTypeAlias", "TSNamespace", "TSField"] + + @pytest.fixture(scope="module") def merged(cypher) -> List[Dict[str, Any]]: - """The declaration-merged nodes: one id carrying two declaration labels.""" + """Declaration merging as 1.5.0 projects it (cants#177): **one id per facet**, so a signature + two declarations share names two nodes rather than one node carrying both labels. One row per + such signature, with every facet on it.""" return cypher( - f"MATCH (m:CanNode) WHERE {SCOPED.replace('x.', 'm.')} AND size([l IN labels(m) WHERE l IN ['TSCallable','TSClass','TSInterface','TSEnum','TSTypeAlias','TSNamespace','TSField']]) > 1 " - "OPTIONAL MATCH (p:TSModule)-[:TS_DECLARES]->(m) RETURN m.signature AS sig, m.name AS name, m.kind AS kind, labels(m) AS labels, p.name AS module ORDER BY sig", + f"MATCH (m:CanNode) WHERE {SCOPED.replace('x.', 'm.')} AND m.signature IS NOT NULL AND size([l IN labels(m) WHERE l IN $decl]) > 0 " + "WITH m.signature AS sig, collect({id: m.id, kind: m.kind, labels: [l IN labels(m) WHERE l IN $decl]}) AS facets " + "WHERE size(facets) > 1 RETURN sig, facets ORDER BY sig", + decl=DECLARATION_LABELS, **SCOPE, ) -def test_declaration_merged_nodes_are_one_facet_each_and_never_a_namespace(analysis, merged): - assert merged, "the graph no longer has merged-label nodes; retire this test" - functions, interfaces, aliases = analysis.get_functions(), analysis.get_interfaces(), analysis.get_type_aliases() - for node in merged: - sig, kind, labels = node["sig"], node["kind"], set(node["labels"]) - assert sig not in interfaces and sig not in aliases, f"{sig} served as a type it is not" - if kind in ("arrow", "function", "method"): - assert type(functions[sig]) is TSCallable and functions[sig].kind == kind, f"{sig} is a callable to get_functions" - if "TSInterface" in labels: - assert analysis.get_interface_properties(sig) == [], "no interface facet is served for it" - else: - assert sig not in functions - facet = analysis.get_typescript_module(node["module"]).types[node["name"]] - assert type(facet) in (TSClass, TSInterface, TSEnum, TSTypeAlias) and "TS" + type(facet).__name__[2:] in labels, f"{sig} rebuilt as the facet TS_DECLARES + labels name" +def test_declaration_merging_mints_one_id_per_facet_and_every_facet_is_served(analysis, merged, cypher): + """The fix in cants#177, and the behaviour change it buys: under 1.3.0/1.4.0 the two + declarations collapsed onto one node carrying both labels and the last writer's ``kind``, and + the SDK could serve only the facet that ``kind`` named — the other was lost. Now each facet is + its own node and **both are reachable**, each through the accessor its kind names. + + Two assertions, in order: no node is left carrying two declaration labels, and every facet of + every shared signature is served. Both read off the graph, so the day a corpus stops merging + the second fails loudly rather than passing vacuously.""" + assert cypher(f"MATCH (m:CanNode) WHERE {SCOPED.replace('x.', 'm.')} AND size([l IN labels(m) WHERE l IN $decl]) > 1 RETURN count(m) AS n", decl=DECLARATION_LABELS, **SCOPE)[0][ + "n" + ] == 0, "a node still carries two declaration labels; cants#177 has regressed" + assert merged, "this corpus carries no declaration shared by two facets; retire this test" + by_kind = {"class": analysis.get_classes(), "interface": analysis.get_interfaces(), "enum": analysis.get_enums(), "type_alias": analysis.get_type_aliases()} + functions = analysis.get_functions() + for row in merged: + for facet in row["facets"]: + assert len(facet["labels"]) == 1, f"{facet['id']} carries {facet['labels']}" + served = by_kind.get(facet["kind"], functions) + assert row["sig"] in served, f"{row['sig']} has a {facet['kind']} facet the matching accessor does not serve" + assert served[row["sig"]].kind == facet["kind"], f"{row['sig']} was served as the wrong facet" def test_class_method_and_code_round_trip(analysis, sample, cypher): diff --git a/tests/models/typescript/test_ts_v2_models.py b/tests/models/typescript/test_ts_v2_models.py index 3fd58b94..8f73a55e 100644 --- a/tests/models/typescript/test_ts_v2_models.py +++ b/tests/models/typescript/test_ts_v2_models.py @@ -30,6 +30,7 @@ import toml from pydantic import ValidationError +from cldk.models.typescript.models import _iter_spanned from cldk.models.typescript import ( TSAnalysis, TSApplication, @@ -305,3 +306,29 @@ def test_1_3_0_stopped_emitting_a_decorator_qualified_name(): for t in decorated: assert [d.name for d in t.decorators] == ["Controller"] assert all(d.qualified_name is None for d in t.decorators) + + +def test_span_bytes_are_utf8_offsets_and_code_decodes_them(): + """codeanalyzer-typescript 1.5.0's one breaking change (cants#179): ``span.bytes`` are UTF-8 + byte offsets on every node at every level, so ``code`` must slice the encoded module, not the + string. + + The fixture app carries em-dashes in comments, which is what makes this a real test rather + than a tautology: the assertion below counts how many nodes a *character* slice would have + got wrong, and fails if that count is zero — a corpus that went ASCII would make the whole + test vacuous without saying so. + """ + a = _load(4) + checked = drifted = 0 + for module in a.application.symbol_table.values(): + if module.source.isascii(): + continue + encoded = module.source.encode("utf-8") + for node in _iter_spanned(module): + start, end = node.span.bytes + expected = encoded[start:end].decode("utf-8") + assert node.code == expected, f"{node.span.bytes} in {module.id}" + checked += 1 + drifted += module.source[start:end] != expected + assert checked, "no non-ASCII module in the fixture; this test proves nothing as written" + assert drifted, "every span in the non-ASCII modules starts before the first multi-byte character; the test cannot fail" diff --git a/tests/resources/typescript/analysis_json/v2/a1/analysis.json b/tests/resources/typescript/analysis_json/v2/a1/analysis.json index fd41eab1..8beb06b3 100644 --- a/tests/resources/typescript/analysis_json/v2/a1/analysis.json +++ b/tests/resources/typescript/analysis_json/v2/a1/analysis.json @@ -1 +1 @@ -{"schema_version":"2.0.0","language":"typescript","max_level":1,"analyzer":{"name":"codeanalyzer-typescript","version":"1.4.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":null,"method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"}},"entrypoints":[],"is_entrypoint":false},"list":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":null,"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":null,"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":null,"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":null,"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":null,"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":null,"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":null,"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":null,"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@22:3"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"recordLogin":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":null,"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"}},"entrypoints":[],"is_entrypoint":false},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"loginCount":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":null,"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":null,"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"}},"entrypoints":[],"is_entrypoint":false},"createGuest":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":null,"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"}},"entrypoints":[],"is_entrypoint":false},"describeAll":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":null,"method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"loginAll":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":null,"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":null,"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"}},"entrypoints":[],"is_entrypoint":false},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":null,"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"}},"entrypoints":[],"is_entrypoint":false},"build":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":null,"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"}},"entrypoints":[],"is_entrypoint":false},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":null,"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":null,"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/classify@31:5"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]}}} \ No newline at end of file +{"schema_version":"2.0.0","language":"typescript","max_level":1,"analyzer":{"name":"codeanalyzer-typescript","version":"1.5.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":null,"method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"}},"entrypoints":[],"is_entrypoint":false},"list":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":null,"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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,742]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":null,"method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":null,"method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":null,"method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":null,"method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[503,543]},"callee":null,"method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[512,542]},"callee":null,"method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[547,574]},"callee":null,"method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[556,573]},"callee":null,"method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[592,627]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[647,671]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[675,708]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[675,700]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[675,691]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[712,729]},"callee":null,"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,"id":"can://typescript/slim/src/index.ts/main@22:3"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1237]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"recordLogin":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":null,"method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"}},"entrypoints":[],"is_entrypoint":false},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"loginCount":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1099,1236]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1240]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[558,1239]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[744,784]},"callee":null,"method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[803,827]},"callee":null,"method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[833,854]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"}},"entrypoints":[],"is_entrypoint":false},"createGuest":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[919,951]},"callee":null,"method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[964,993]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"}},"entrypoints":[],"is_entrypoint":false},"describeAll":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1039,1074]},"callee":null,"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1061,1073]},"callee":null,"method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"loginAll":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1193,1208]},"callee":null,"method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[587,614]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[407,423]},"callee":null,"method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"}},"entrypoints":[],"is_entrypoint":false},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[518,555]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":null,"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"}},"entrypoints":[],"is_entrypoint":false},"build":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":null,"method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"}},"entrypoints":[],"is_entrypoint":false},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":null,"method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":null,"method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/classify@31:5"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":null,"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]}}} \ No newline at end of file diff --git a/tests/resources/typescript/analysis_json/v2/a2/analysis.json b/tests/resources/typescript/analysis_json/v2/a2/analysis.json index d867d145..07b9d894 100644 --- a/tests/resources/typescript/analysis_json/v2/a2/analysis.json +++ b/tests/resources/typescript/analysis_json/v2/a2/analysis.json @@ -1 +1 @@ -{"schema_version":"2.0.0","language":"typescript","max_level":2,"analyzer":{"name":"codeanalyzer-typescript","version":"1.4.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"}},"entrypoints":[],"is_entrypoint":false},"list":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"recordLogin":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"}},"entrypoints":[],"is_entrypoint":false},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"loginCount":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"}},"entrypoints":[],"is_entrypoint":false},"createGuest":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"}},"entrypoints":[],"is_entrypoint":false},"describeAll":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"loginAll":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"}},"entrypoints":[],"is_entrypoint":false},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"}},"entrypoints":[],"is_entrypoint":false},"build":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"}},"entrypoints":[],"is_entrypoint":false},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file +{"schema_version":"2.0.0","language":"typescript","max_level":2,"analyzer":{"name":"codeanalyzer-typescript","version":"1.5.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"}},"entrypoints":[],"is_entrypoint":false},"list":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,742]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[503,543]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[512,542]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[547,574]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[556,573]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[592,627]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[647,671]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[675,708]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[675,700]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[675,691]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[712,729]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1237]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"recordLogin":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"}},"entrypoints":[],"is_entrypoint":false},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"loginCount":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1099,1236]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1240]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[558,1239]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[744,784]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[803,827]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[833,854]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"}},"entrypoints":[],"is_entrypoint":false},"createGuest":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[919,951]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[964,993]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"}},"entrypoints":[],"is_entrypoint":false},"describeAll":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1039,1074]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1061,1073]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false},"loginAll":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1193,1208]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[587,614]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[407,423]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"}},"entrypoints":[],"is_entrypoint":false},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[518,555]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"}},"entrypoints":[],"is_entrypoint":false},"build":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"}},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"}},"entrypoints":[],"is_entrypoint":false},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"}},"entrypoints":[],"is_entrypoint":false}},"entrypoints":[],"is_entrypoint":false}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/tests/resources/typescript/analysis_json/v2/a3/analysis.json b/tests/resources/typescript/analysis_json/v2/a3/analysis.json index e8abbde6..78973d8a 100644 --- a/tests/resources/typescript/analysis_json/v2/a3/analysis.json +++ b/tests/resources/typescript/analysis_json/v2/a3/analysis.json @@ -1 +1 @@ -{"schema_version":"2.0.0","language":"typescript","max_level":3,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.4.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://typescript/slim/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[]},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://typescript/slim/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[]},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://typescript/slim/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://typescript/slim/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://typescript/slim/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[577,626]},"id":"can://typescript/slim/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[629,670]},"id":"can://typescript/slim/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://typescript/slim/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://typescript/slim/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1200,1228]},"id":"can://typescript/slim/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[731,783]},"id":"can://typescript/slim/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[788,826]},"id":"can://typescript/slim/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[858,870]},"id":"can://typescript/slim/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[904,950]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[955,992]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1030,1073]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@exit"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@exit"}},"entrypoints":[],"is_entrypoint":false,"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"]}]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1121,1135]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1140,1213]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1176,1207]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1218,1231]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[162,185]},"id":"can://typescript/slim/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[398,422]},"id":"can://typescript/slim/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[548,553]},"id":"can://typescript/slim/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://typescript/slim/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://typescript/slim/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://typescript/slim/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://typescript/slim/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@exit"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@exit"}},"entrypoints":[],"is_entrypoint":false,"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"]}]}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file +{"schema_version":"2.0.0","language":"typescript","max_level":3,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.5.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://typescript/slim/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:16","kind":"fallthrough"},{"src":"5:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"5:3","kind":"fallthrough"},{"src":"5:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"5:3"}],"ddg":[]},"Get":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://typescript/slim/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:16","kind":"fallthrough"},{"src":"8:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"8:3","kind":"fallthrough"},{"src":"8:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"8:3"}],"ddg":[]},"Param":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://typescript/slim/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@exit"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:16","kind":"fallthrough"},{"src":"11:16","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:16"}],"ddg":[]}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"11:3","kind":"fallthrough"},{"src":"11:3","dst":"@exit","kind":"return"}],"cdg":[{"src":"@entry","dst":"11:3"}],"ddg":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,742]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[503,543]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[512,542]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[547,574]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[556,573]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[592,627]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[647,671]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[675,708]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[675,700]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[675,691]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[712,729]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"id":"can://typescript/slim/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://typescript/slim/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://typescript/slim/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[579,628]},"id":"can://typescript/slim/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[631,672]},"id":"can://typescript/slim/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"id":"can://typescript/slim/src/index.ts/main@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1237]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://typescript/slim/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://typescript/slim/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1099,1236]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"id":"can://typescript/slim/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1202,1230]},"id":"can://typescript/slim/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"id":"can://typescript/slim/src/models.ts/Robot/describe@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1240]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[558,1239]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[744,784]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[803,827]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[833,854]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"id":"can://typescript/slim/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[733,785]},"id":"can://typescript/slim/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[790,828]},"id":"can://typescript/slim/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[860,872]},"id":"can://typescript/slim/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"id":"can://typescript/slim/src/services.ts/UserService/create@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[919,951]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[964,993]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[906,952]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[957,994]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1039,1074]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1032,1075]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@exit"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1061,1073]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@exit"}},"entrypoints":[],"is_entrypoint":false,"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"]}]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1193,1208]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1123,1137]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1142,1215]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1178,1209]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1220,1233]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@exit"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[]}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[587,614]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"id":"can://typescript/slim/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[164,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"id":"can://typescript/slim/src/services.ts/makeGuestName@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[407,423]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"id":"can://typescript/slim/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[400,424]},"id":"can://typescript/slim/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"id":"can://typescript/slim/src/services.ts/announce@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[518,555]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[527,555]},"id":"can://typescript/slim/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[550,555]},"id":"can://typescript/slim/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[527,555]},"id":"can://typescript/slim/src/services.ts/nextId@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@exit"}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://typescript/slim/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://typescript/slim/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://typescript/slim/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://typescript/slim/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@exit"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@exit"}},"entrypoints":[],"is_entrypoint":false,"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"]}]}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[],"param_out":[],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/tests/resources/typescript/analysis_json/v2/a4/analysis.json b/tests/resources/typescript/analysis_json/v2/a4/analysis.json index d37a372d..aa4b1979 100644 --- a/tests/resources/typescript/analysis_json/v2/a4/analysis.json +++ b/tests/resources/typescript/analysis_json/v2/a4/analysis.json @@ -1 +1 @@ -{"schema_version":"2.0.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.4.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_out"},"20:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_in:0"},"20:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_out"},"21:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"20:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]},{"src":"20:5/actual_out","dst":"20:5","var":"$ret","prov":["reaching-defs"]},{"src":"21:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"21:5/actual_out","dst":"21:5","var":"$ret","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":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/list@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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"]},{"src":"26:5/actual_out","dst":"26:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"service","id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://typescript/slim/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@exit"},"@formal_in:0":{"kind":"formal_in","of":"prefix","id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Controller@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Controller/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://typescript/slim/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@exit"},"@formal_in:0":{"kind":"formal_in","of":"path","id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Get@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Get/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://typescript/slim/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Param@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Param/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,740]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[501,541]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[510,540]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[545,572]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[554,571]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[590,625]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[645,669]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[673,706]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[673,698]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[673,689]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[710,727]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://typescript/slim/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://typescript/slim/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[577,626]},"id":"can://typescript/slim/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[629,670]},"id":"can://typescript/slim/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,730]},"id":"can://typescript/slim/src/index.ts/main@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/index.ts/main@formal_out"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3","id":"can://typescript/slim/src/index.ts/main@11:3/actual_out"},"12:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"12:3","id":"can://typescript/slim/src/index.ts/main@12:3/actual_out"},"13:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"13:3","id":"can://typescript/slim/src/index.ts/main@13:3/actual_out"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3","id":"can://typescript/slim/src/index.ts/main@7:3/actual_in:0"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_in:0"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_out"},"8:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_in:1"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3","id":"can://typescript/slim/src/index.ts/main@11:3/actual_in:0"},"13:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"13:3","id":"can://typescript/slim/src/index.ts/main@13:3/actual_in:0"},"16:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0"},"16:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},"16:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:1"},"16:3/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:2"},"17:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"17:3","id":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0"},"17:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"17:3","id":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_in:0"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_out"},"19:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_in:1"},"21:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"21:3","id":"can://typescript/slim/src/index.ts/main@21:3/actual_in:0"},"22:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"22:3","id":"can://typescript/slim/src/index.ts/main@22:3/actual_in:0"},"22:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"22:3","id":"can://typescript/slim/src/index.ts/main@22:3/actual_out"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3","id":"can://typescript/slim/src/index.ts/main@7:3/actual_out"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3","id":"can://typescript/slim/src/index.ts/main@9:3/actual_out"},"21:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:3","id":"can://typescript/slim/src/index.ts/main@21:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"11:3/actual_out","dst":"11:3","var":"$ret","prov":["reaching-defs"]},{"src":"12:3/actual_out","dst":"12:3","var":"$ret","prov":["reaching-defs"]},{"src":"13:3/actual_out","dst":"13:3","var":"$ret","prov":["reaching-defs"]},{"src":"16:3/actual_out","dst":"16:3","var":"$ret","prov":["reaching-defs"]},{"src":"17:3/actual_out","dst":"17:3","var":"$ret","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"19:3/actual_out","dst":"19:3","var":"$ret","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"21:3/actual_out","dst":"21:3","var":"$ret","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3/actual_in:0","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"]},{"src":"7:3/actual_out","dst":"7:3","var":"$ret","prov":["reaching-defs"]},{"src":"8:3/actual_out","dst":"8:3","var":"$ret","prov":["reaching-defs"]},{"src":"9:3/actual_out","dst":"9:3","var":"$ret","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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1235]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://typescript/slim/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/recordLogin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://typescript/slim/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},"@formal_in:2":{"kind":"formal_in","of":"role","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/constructor@formal_out"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5","id":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_out"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5","id":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_in:0"}},"entrypoints":[],"is_entrypoint":false,"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"]},{"src":"@formal_in:0","dst":"40:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"40:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"40:5/actual_out","dst":"40:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/isAdmin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1097,1234]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1200,1228]},"id":"can://typescript/slim/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1175,1232]},"id":"can://typescript/slim/src/models.ts/Robot/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Robot/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1137,1172]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1238]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[556,1237]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[742,782]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[801,825]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[831,852]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[731,783]},"id":"can://typescript/slim/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[788,826]},"id":"can://typescript/slim/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[858,870]},"id":"can://typescript/slim/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[672,874]},"id":"can://typescript/slim/src/services.ts/UserService/create@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"role","id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/create@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_out"},"25:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:5","id":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_out"},"25:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:5","id":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_in:0"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:0"},"26:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:1"},"26:5/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:2"},"27:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"27:5","id":"can://typescript/slim/src/services.ts/UserService/create@27:5/actual_in:0"},"27:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"27:5","id":"can://typescript/slim/src/services.ts/UserService/create@27:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"25:5/actual_in:0","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5/actual_in:0","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":"@formal_in:0","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5/actual_in:1","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5/actual_in:2","var":"role","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"25:5/actual_out","dst":"25:5","var":"$ret","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":"26:5/actual_out","dst":"26:5","var":"$ret","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":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[917,949]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[962,991]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[904,950]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[955,992]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[878,996]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/createGuest@formal_out"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_out"},"33:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_out"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_in:0"},"33:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:0"},"33:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"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":"32:5/actual_in:0","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":"32:5","dst":"33:5/actual_in:0","var":"name","prov":["reaching-defs"]},{"src":"32:5/actual_out","dst":"32:5","var":"$ret","prov":["reaching-defs"]},{"src":"33:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"33:5/actual_out","dst":"33:5","var":"$ret","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":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1037,1072]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1030,1073]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1000,1077]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/describeAll@formal_out"},"37:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"37:5","id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5/actual_in:0"},"37:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:5","id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5/actual_out"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1059,1071]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1052,1071]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@exit"},"@formal_in:0":{"kind":"formal_in","of":"u","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_out"},"37:34/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:34","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"37:34","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"37:34/actual_out","dst":"37:34","var":"$ret","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1191,1206]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1121,1135]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1140,1213]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1176,1207]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1218,1231]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1081,1235]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/loginAll@formal_out"},"43:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"43:7","id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"43:7/actual_out","dst":"43:7","var":"$ret","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[616,668]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"startId","id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[585,612]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[162,185]},"id":"can://typescript/slim/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[106,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@exit"},"@formal_in:0":{"kind":"formal_in","of":"seed","id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/makeGuestName@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[405,421]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[398,422]},"id":"can://typescript/slim/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[347,424]},"id":"can://typescript/slim/src/services.ts/announce@exit"},"@formal_in:0":{"kind":"formal_in","of":"thing","id":"can://typescript/slim/src/services.ts/announce@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/announce@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"13:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[516,553]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[548,553]},"id":"can://typescript/slim/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[525,553]},"id":"can://typescript/slim/src/services.ts/nextId@exit"},"@formal_in:0":{"kind":"formal_in","of":"n","id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/nextId@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"17:46","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@exit"},"@formal_in:0":{"kind":"formal_in","of":"part","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_out"},"14:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0"},"14:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"14:7/actual_in:0","var":"part","prov":["reaching-defs"]},{"src":"14:7/actual_out","dst":"14:7","var":"$ret","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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@formal_out"},"18:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"18:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0"},"18:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"18:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"n","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_out"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_in:0"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5/actual_in:0","var":"n","prov":["reaching-defs"]},{"src":"4:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"4:5/actual_out","dst":"4:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out"},"8:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_in:0"},"8:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_out"},"8:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://typescript/slim/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://typescript/slim/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://typescript/slim/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://typescript/slim/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@exit"},"@formal_in:0":{"kind":"formal_in","of":"items","id":"can://typescript/slim/src/util.ts/classify@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/classify@formal_out"},"30:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:5","id":"can://typescript/slim/src/util.ts/classify@30:5/actual_in:0"},"30:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:5","id":"can://typescript/slim/src/util.ts/classify@30:5/actual_out"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5","id":"can://typescript/slim/src/util.ts/classify@31:5/actual_in:0"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5","id":"can://typescript/slim/src/util.ts/classify@31:5/actual_out"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@exit"},"@formal_in:0":{"kind":"formal_in","of":"item","id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_out"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5/actual_in:0"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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"}]}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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":"30:5/actual_in:0","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":"30:5/actual_out","dst":"30:5","var":"$ret","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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[{"src":"can://typescript/slim/src/controllers.ts/UserController/show@20:5","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@11:3/actual_in:0","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@13:3","dst":"can://typescript/slim/src/controllers.ts/UserController/show@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/index.ts/main@13:3/actual_in:0","dst":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:1","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:2","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@19:3/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@19:3/actual_in:1","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@21:3/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@7:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@8:3","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/index.ts/main@8:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@8:3/actual_in:1","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@9:3","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_in:0","dst":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/nextId@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:0","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:1","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:2","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:1","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/slim/src/util.ts/classify@30:5/actual_in:0","dst":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"param_out":[{"src":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@11:3/actual_out"},{"src":"can://typescript/slim/src/controllers.ts/UserController/list@formal_out","dst":"can://typescript/slim/src/index.ts/main@12:3/actual_out"},{"src":"can://typescript/slim/src/controllers.ts/UserController/show@formal_out","dst":"can://typescript/slim/src/index.ts/main@13:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/Entity/constructor@formal_out","dst":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/Robot/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/constructor@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/describe@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/show@21:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/describe@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/recordLogin@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7/actual_out"},{"src":"can://typescript/slim/src/services.ts/announce@formal_out","dst":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/announce@formal_out","dst":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/makeGuestName@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/nextId@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@7:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/index.ts/main@8:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@formal_out","dst":"can://typescript/slim/src/index.ts/main@9:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/list@26:5/actual_out"},{"src":"can://typescript/slim/src/util.ts/classify/keyOf@formal_out","dst":"can://typescript/slim/src/util.ts/classify@30:5/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_out","dst":"can://typescript/slim/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@formal_out","dst":"can://typescript/slim/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_out","dst":"can://typescript/slim/src/index.ts/main@19:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_out"}],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file +{"schema_version":"2.0.0","language":"typescript","max_level":4,"k_limit":3,"analyzer":{"name":"codeanalyzer-typescript","version":"1.5.0"},"application":{"id":"can://typescript/slim","kind":"application","symbol_table":{"src/controllers.ts":{"id":"can://typescript/slim/src/controllers.ts","kind":"module","span":{"start":[1,1],"end":[29,1],"bytes":[0,699]},"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,"resolved_module":"src/services.ts"}],"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}],"types":{"UserController":{"id":"can://typescript/slim/src/controllers.ts/UserController","kind":"class","span":{"start":[14,1],"end":[28,2],"bytes":[380,698]},"name":"UserController","signature":"src/controllers.UserController","comments":[],"decorators":[{"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":[],"callables":{"show":{"id":"can://typescript/slim/src/controllers.ts/UserController/show","kind":"method","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"name":"show","signature":"src/controllers.UserController.show","comments":[],"decorators":[{"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","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"20:18":{"kind":"call","span":{"start":[20,18],"end":[20,41],"bytes":[563,586]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:18"},"21:12":{"kind":"call","span":{"start":[21,12],"end":[21,27],"bytes":[599,614]},"callee":"can://typescript/slim/src/models.ts/User/describe","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,"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:12"},"19:9":{"kind":"call","span":{"start":[19,9],"end":[19,20],"bytes":[512,523]},"callee":"can://typescript/slim/src/controllers.ts/Param","method_name":"Param","argument_types":["\"id\""],"type_arguments":[],"return_type":"ParameterDecorator","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/controllers.ts/UserController/show@19:9"},"@entry":{"kind":"entry","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@entry"},"20:5":{"kind":"statement","span":{"start":[20,5],"end":[20,42],"bytes":[550,587]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5"},"21:5":{"kind":"statement","span":{"start":[21,5],"end":[21,28],"bytes":[592,615]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5"},"@exit":{"kind":"exit","span":{"start":[18,3],"end":[22,4],"bytes":[491,619]},"id":"can://typescript/slim/src/controllers.ts/UserController/show@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/show@formal_out"},"20:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"20:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_in:0"},"20:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"20:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_out"},"21:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:5","id":"can://typescript/slim/src/controllers.ts/UserController/show@21:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"20:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"20:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"20:5","dst":"21:5","var":"user.describe","prov":["reaching-defs"]},{"src":"20:5/actual_out","dst":"20:5","var":"$ret","prov":["reaching-defs"]},{"src":"21:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"21:5/actual_out","dst":"21:5","var":"$ret","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":{"id":"can://typescript/slim/src/controllers.ts/UserController/list","kind":"method","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"name":"list","signature":"src/controllers.UserController.list","comments":[],"decorators":[{"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,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,38],"bytes":[665,691]},"callee":"can://typescript/slim/src/services.ts/UserService/describeAll","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,"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:12"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,39],"bytes":[658,692]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[27,4],"bytes":[623,696]},"id":"can://typescript/slim/src/controllers.ts/UserController/list@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/list@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/controllers.ts/UserController/list@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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"]},{"src":"26:5/actual_out","dst":"26:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://typescript/slim/src/controllers.ts/UserController/constructor","kind":"constructor","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"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,"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[16,3],"end":[16,56],"bytes":[434,487]},"id":"can://typescript/slim/src/controllers.ts/UserController/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"service","id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"service":{"id":"can://typescript/slim/src/controllers.ts/UserController/service","kind":"field","name":"service","type":"UserService","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"Controller":{"id":"can://typescript/slim/src/controllers.ts/Controller","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"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,"id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"}],"type_parameters":[],"return_type":"ClassDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[200,223]},"id":"can://typescript/slim/src/controllers.ts/Controller@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[144,225]},"id":"can://typescript/slim/src/controllers.ts/Controller@exit"},"@formal_in:0":{"kind":"formal_in","of":"prefix","id":"can://typescript/slim/src/controllers.ts/Controller@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Controller@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"arrow","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"name":"(anonymous)","signature":"src/controllers.Controller.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@entry"},"5:16":{"kind":"statement","span":{"start":[5,16],"end":[5,25],"bytes":[213,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@5:16"},"@exit":{"kind":"exit","span":{"start":[5,10],"end":[5,25],"bytes":[207,222]},"id":"can://typescript/slim/src/controllers.ts/Controller/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Controller/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/Get","kind":"function","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"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,"id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"}],"type_parameters":[],"return_type":"MethodDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@entry"},"8:3":{"kind":"statement","span":{"start":[8,3],"end":[8,26],"bytes":[274,297]},"id":"can://typescript/slim/src/controllers.ts/Get@8:3"},"@exit":{"kind":"exit","span":{"start":[7,1],"end":[9,2],"bytes":[226,299]},"id":"can://typescript/slim/src/controllers.ts/Get@exit"},"@formal_in:0":{"kind":"formal_in","of":"path","id":"can://typescript/slim/src/controllers.ts/Get@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Get@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"arrow","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"name":"(anonymous)","signature":"src/controllers.Get.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@entry"},"8:16":{"kind":"statement","span":{"start":[8,16],"end":[8,25],"bytes":[287,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@8:16"},"@exit":{"kind":"exit","span":{"start":[8,10],"end":[8,25],"bytes":[281,296]},"id":"can://typescript/slim/src/controllers.ts/Get/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Get/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/controllers.ts/Param","kind":"function","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"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,"id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"}],"type_parameters":[],"return_type":"ParameterDecorator","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@entry"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,26],"bytes":[353,376]},"id":"can://typescript/slim/src/controllers.ts/Param@11:3"},"@exit":{"kind":"exit","span":{"start":[10,1],"end":[12,2],"bytes":[300,378]},"id":"can://typescript/slim/src/controllers.ts/Param@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/controllers.ts/Param@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Param@formal_out"}},"callables":{"":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"arrow","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"name":"(anonymous)","signature":"src/controllers.Param.","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"undefined","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@entry"},"11:16":{"kind":"statement","span":{"start":[11,16],"end":[11,25],"bytes":[366,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@11:16"},"@exit":{"kind":"exit","span":{"start":[11,10],"end":[11,25],"bytes":[360,375]},"id":"can://typescript/slim/src/controllers.ts/Param/@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/controllers.ts/Param/@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":[]}},"entrypoints":[],"is_entrypoint":false,"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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d42b8f615d51575e3436409b9fce70862182b6071da40471b4be9b95f7c9ee4c"},"src/index.ts":{"id":"can://typescript/slim/src/index.ts","kind":"module","span":{"start":[1,1],"end":[26,1],"bytes":[0,742]},"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,"resolved_module":"src/controllers.ts"},{"module":"./models","name":"Robot","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":2,"end_line":2,"start_column":1,"end_column":46,"resolved_module":"src/models.ts"},{"module":"./services","name":"UserService","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./services","name":"announce","is_type_only":false,"import_kind":"named","start_line":3,"end_line":3,"start_column":1,"end_column":52,"resolved_module":"src/services.ts"},{"module":"./util","name":"StringUtil","is_type_only":false,"import_kind":"named","start_line":4,"end_line":4,"start_column":1,"end_column":37,"resolved_module":"src/util.ts"}],"exports":[],"comments":[],"types":{},"functions":{"main":{"id":"can://typescript/slim/src/index.ts/main","kind":"function","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"name":"main","signature":"src/index.main","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"void","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"7:19":{"kind":"call","span":{"start":[7,19],"end":[7,39],"bytes":[233,253]},"callee":"can://typescript/slim/src/services.ts/UserService/constructor","method_name":"UserService","argument_types":["100"],"type_arguments":[],"return_type":"UserService","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@7:19"},"8:3":{"kind":"call","span":{"start":[8,3],"end":[8,36],"bytes":[257,290]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/index.ts/main@8:3"},"9:3":{"kind":"call","span":{"start":[9,3],"end":[9,24],"bytes":[294,315]},"callee":"can://typescript/slim/src/services.ts/UserService/createGuest","method_name":"createGuest","receiver_expr":"service","receiver_type":"UserService","argument_types":[],"type_arguments":[],"return_type":"User","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@9:3"},"11:22":{"kind":"call","span":{"start":[11,22],"end":[11,49],"bytes":[339,366]},"callee":"can://typescript/slim/src/controllers.ts/UserController/constructor","method_name":"UserController","argument_types":["UserService"],"type_arguments":[],"return_type":"UserController","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@11:22"},"12:3":{"kind":"call","span":{"start":[12,3],"end":[12,20],"bytes":[370,387]},"callee":"can://typescript/slim/src/controllers.ts/UserController/list","method_name":"list","receiver_expr":"controller","receiver_type":"UserController","argument_types":[],"type_arguments":[],"return_type":"string[]","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@12:3"},"13:3":{"kind":"call","span":{"start":[13,3],"end":[13,24],"bytes":[391,412]},"callee":"can://typescript/slim/src/controllers.ts/UserController/show","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,"id":"can://typescript/slim/src/index.ts/main@13:3"},"16:3":{"kind":"call","span":{"start":[16,3],"end":[16,43],"bytes":[503,543]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["User"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:3"},"16:12":{"kind":"call","span":{"start":[16,12],"end":[16,42],"bytes":[512,542]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["1","\"Ada\"","Role.Admin"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@16:12"},"17:3":{"kind":"call","span":{"start":[17,3],"end":[17,30],"bytes":[547,574]},"callee":"can://typescript/slim/src/services.ts/announce","method_name":"announce","argument_types":["Robot"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:3"},"17:12":{"kind":"call","span":{"start":[17,12],"end":[17,29],"bytes":[556,573]},"callee":"can://typescript/slim/src/models.ts/Robot/constructor","method_name":"Robot","argument_types":["\"r2d2\""],"type_arguments":[],"return_type":"Robot","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/index.ts/main@17:12"},"19:16":{"kind":"call","span":{"start":[19,16],"end":[19,51],"bytes":[592,627]},"callee":"can://typescript/slim/src/util.ts/StringUtil/repeat","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,"id":"can://typescript/slim/src/index.ts/main@19:16"},"20:19":{"kind":"call","span":{"start":[20,19],"end":[20,43],"bytes":[647,671]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","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,"id":"can://typescript/slim/src/index.ts/main@20:19"},"21:3":{"kind":"call","span":{"start":[21,3],"end":[21,36],"bytes":[675,708]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","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,"id":"can://typescript/slim/src/index.ts/main@21:3"},"21:3/2":{"kind":"call","span":{"start":[21,3],"end":[21,28],"bytes":[675,700]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/2"},"21:3/3":{"kind":"call","span":{"start":[21,3],"end":[21,19],"bytes":[675,691]},"callee":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","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,"id":"can://typescript/slim/src/index.ts/main@21:3/3"},"22:3":{"kind":"call","span":{"start":[22,3],"end":[22,20],"bytes":[712,729]},"callee":"can://typescript/slim/@external/(builtin)/log","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,"id":"can://typescript/slim/src/index.ts/main@22:3"},"@entry":{"kind":"entry","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"id":"can://typescript/slim/src/index.ts/main@entry"},"7:3":{"kind":"statement","span":{"start":[7,3],"end":[7,40],"bytes":[217,254]},"id":"can://typescript/slim/src/index.ts/main@7:3"},"11:3":{"kind":"statement","span":{"start":[11,3],"end":[11,50],"bytes":[320,367]},"id":"can://typescript/slim/src/index.ts/main@11:3"},"19:3":{"kind":"statement","span":{"start":[19,3],"end":[19,52],"bytes":[579,628]},"id":"can://typescript/slim/src/index.ts/main@19:3"},"20:3":{"kind":"statement","span":{"start":[20,3],"end":[20,44],"bytes":[631,672]},"id":"can://typescript/slim/src/index.ts/main@20:3"},"@exit":{"kind":"exit","span":{"start":[6,1],"end":[23,2],"bytes":[184,732]},"id":"can://typescript/slim/src/index.ts/main@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/index.ts/main@formal_out"},"11:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"11:3","id":"can://typescript/slim/src/index.ts/main@11:3/actual_out"},"12:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"12:3","id":"can://typescript/slim/src/index.ts/main@12:3/actual_out"},"13:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"13:3","id":"can://typescript/slim/src/index.ts/main@13:3/actual_out"},"7:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"7:3","id":"can://typescript/slim/src/index.ts/main@7:3/actual_in:0"},"8:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_in:0"},"8:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_out"},"8:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:3","id":"can://typescript/slim/src/index.ts/main@8:3/actual_in:1"},"11:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"11:3","id":"can://typescript/slim/src/index.ts/main@11:3/actual_in:0"},"13:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"13:3","id":"can://typescript/slim/src/index.ts/main@13:3/actual_in:0"},"16:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0"},"16:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},"16:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:1"},"16:3/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"16:3","id":"can://typescript/slim/src/index.ts/main@16:3/actual_in:2"},"17:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"17:3","id":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0"},"17:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"17:3","id":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},"19:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_in:0"},"19:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_out"},"19:3/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"19:3","id":"can://typescript/slim/src/index.ts/main@19:3/actual_in:1"},"21:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"21:3","id":"can://typescript/slim/src/index.ts/main@21:3/actual_in:0"},"22:3/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"22:3","id":"can://typescript/slim/src/index.ts/main@22:3/actual_in:0"},"22:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"22:3","id":"can://typescript/slim/src/index.ts/main@22:3/actual_out"},"7:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"7:3","id":"can://typescript/slim/src/index.ts/main@7:3/actual_out"},"9:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"9:3","id":"can://typescript/slim/src/index.ts/main@9:3/actual_out"},"21:3/actual_out":{"kind":"actual_out","of":"$ret","parent":"21:3","id":"can://typescript/slim/src/index.ts/main@21:3/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"11:3/actual_out","dst":"11:3","var":"$ret","prov":["reaching-defs"]},{"src":"12:3/actual_out","dst":"12:3","var":"$ret","prov":["reaching-defs"]},{"src":"13:3/actual_out","dst":"13:3","var":"$ret","prov":["reaching-defs"]},{"src":"16:3/actual_out","dst":"16:3","var":"$ret","prov":["reaching-defs"]},{"src":"17:3/actual_out","dst":"17:3","var":"$ret","prov":["reaching-defs"]},{"src":"19:3","dst":"22:3","var":"slug","prov":["reaching-defs"]},{"src":"19:3/actual_out","dst":"19:3","var":"$ret","prov":["reaching-defs"]},{"src":"20:3","dst":"21:3","var":"builder.add","prov":["reaching-defs"]},{"src":"21:3/actual_out","dst":"21:3","var":"$ret","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3","var":"service","prov":["reaching-defs"]},{"src":"7:3","dst":"11:3/actual_in:0","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"]},{"src":"7:3/actual_out","dst":"7:3","var":"$ret","prov":["reaching-defs"]},{"src":"8:3/actual_out","dst":"8:3","var":"$ret","prov":["reaching-defs"]},{"src":"9:3/actual_out","dst":"9:3","var":"$ret","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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"6de6f6ff5a01a5c7c750a93d5e10bae7b15817f386421f45c7527cfb7259d9b3"},"src/models.ts":{"id":"can://typescript/slim/src/models.ts","kind":"module","span":{"start":[1,1],"end":[65,1],"bytes":[0,1237]},"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}],"types":{"Entity":{"id":"can://typescript/slim/src/models.ts/Entity","kind":"class","span":{"start":[26,1],"end":[29,2],"bytes":[376,521]},"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"}],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Entity/describe","kind":"method","span":{"start":[28,3],"end":[28,31],"bytes":[491,519]},"name":"describe","signature":"src/models.Entity.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"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}],"body":{},"entrypoints":[],"is_entrypoint":false},"constructor":{"id":"can://typescript/slim/src/models.ts/Entity/constructor","kind":"constructor","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"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,"id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[27,3],"end":[27,41],"bytes":[450,488]},"id":"can://typescript/slim/src/models.ts/Entity/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Entity/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Entity/id","kind":"field","name":"id","type":"ID","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"is_abstract":true,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Identifiable"],"entrypoints":[],"is_entrypoint":false},"User":{"id":"can://typescript/slim/src/models.ts/User","kind":"class","span":{"start":[31,1],"end":[56,2],"bytes":[523,1015]},"name":"User","signature":"src/models.User","comments":[],"decorators":[],"base_classes":["src/models.Entity","src/models.Named"],"implements_types":["src/models.Named"],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/User/describe","kind":"method","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"name":"describe","signature":"src/models.User.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@entry"},"49:5":{"kind":"statement","span":{"start":[49,5],"end":[49,42],"bytes":[872,909]},"id":"can://typescript/slim/src/models.ts/User/describe@49:5"},"@exit":{"kind":"exit","span":{"start":[48,3],"end":[50,4],"bytes":[847,913]},"id":"can://typescript/slim/src/models.ts/User/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/recordLogin","kind":"method","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"name":"recordLogin","signature":"src/models.User.recordLogin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":1,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@entry"},"53:5":{"kind":"statement","span":{"start":[53,5],"end":[53,26],"bytes":[960,981]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@53:5"},"54:5":{"kind":"statement","span":{"start":[54,5],"end":[54,28],"bytes":[986,1009]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@54:5"},"@exit":{"kind":"exit","span":{"start":[52,3],"end":[55,4],"bytes":[917,1013]},"id":"can://typescript/slim/src/models.ts/User/recordLogin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/recordLogin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/constructor","kind":"constructor","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"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,"id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"40:5":{"kind":"call","span":{"start":[40,5],"end":[40,14],"bytes":[738,747]},"callee":"can://typescript/slim/src/models.ts/Entity/constructor","method_name":"super","argument_types":["UserId"],"type_arguments":[],"return_type":"void","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/models.ts/User/constructor@40:5"},"@entry":{"kind":"entry","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,22],"bytes":[753,770]},"id":"can://typescript/slim/src/models.ts/User/constructor@41:5"},"@exit":{"kind":"exit","span":{"start":[35,3],"end":[42,4],"bytes":[636,774]},"id":"can://typescript/slim/src/models.ts/User/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"id","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},"@formal_in:2":{"kind":"formal_in","of":"role","id":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/constructor@formal_out"},"40:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"40:5","id":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_out"},"40:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"40:5","id":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_in:0"}},"entrypoints":[],"is_entrypoint":false,"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"]},{"src":"@formal_in:0","dst":"40:5","var":"id","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"40:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"40:5/actual_out","dst":"40:5","var":"$ret","prov":["reaching-defs"]}],"summary":[]},"isAdmin#get":{"id":"can://typescript/slim/src/models.ts/User/isAdmin","kind":"getter","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"name":"isAdmin","signature":"src/models.User.isAdmin","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"boolean","cyclomatic_complexity":1,"is_static":false,"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":[],"body":{"@entry":{"kind":"entry","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@entry"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,37],"bytes":[807,839]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@45:5"},"@exit":{"kind":"exit","span":{"start":[44,3],"end":[46,4],"bytes":[778,843]},"id":"can://typescript/slim/src/models.ts/User/isAdmin@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/User/isAdmin@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/User/loginCount","kind":"field","span":{"start":[32,3],"end":[32,26],"bytes":[585,608]},"name":"loginCount","type":"number","comments":[],"decorators":[],"initializer":"0","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"instances":{"id":"can://typescript/slim/src/models.ts/User/instances","kind":"field","span":{"start":[33,3],"end":[33,24],"bytes":[611,632]},"name":"instances","type":"number","comments":[],"decorators":[],"initializer":"0","is_static":true,"is_readonly":false,"is_optional":false,"is_abstract":false},"name":{"id":"can://typescript/slim/src/models.ts/User/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"role":{"id":"can://typescript/slim/src/models.ts/User/role","kind":"field","name":"role","type":"Role","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":false,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"extends_ids":["can://typescript/slim/src/models.ts/Entity"],"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Robot":{"id":"can://typescript/slim/src/models.ts/Robot","kind":"class","span":{"start":[59,1],"end":[64,2],"bytes":[1099,1236]},"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":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Robot/describe","kind":"method","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"name":"describe","signature":"src/models.Robot.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"id":"can://typescript/slim/src/models.ts/Robot/describe@entry"},"62:5":{"kind":"statement","span":{"start":[62,5],"end":[62,33],"bytes":[1202,1230]},"id":"can://typescript/slim/src/models.ts/Robot/describe@62:5"},"@exit":{"kind":"exit","span":{"start":[61,3],"end":[63,4],"bytes":[1177,1234]},"id":"can://typescript/slim/src/models.ts/Robot/describe@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Robot/describe@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/models.ts/Robot/constructor","kind":"constructor","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"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,"id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[60,3],"end":[60,38],"bytes":[1139,1174]},"id":"can://typescript/slim/src/models.ts/Robot/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/models.ts/Robot/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Robot/name","kind":"field","name":"name","type":"string","comments":[],"decorators":[],"accessibility":"public","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"implements_ids":["can://typescript/slim/src/models.ts/Named"],"entrypoints":[],"is_entrypoint":false},"Identifiable":{"id":"can://typescript/slim/src/models.ts/Identifiable","kind":"interface","span":{"start":[3,1],"end":[5,2],"bytes":[42,105]},"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"}],"callables":{},"fields":{"id":{"id":"can://typescript/slim/src/models.ts/Identifiable/id","kind":"field","span":{"start":[4,3],"end":[4,18],"bytes":[88,103]},"name":"id","type":"T","comments":[],"decorators":[],"is_static":false,"is_readonly":true,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Named":{"id":"can://typescript/slim/src/models.ts/Named","kind":"interface","span":{"start":[7,1],"end":[10,2],"bytes":[107,171]},"name":"Named","signature":"src/models.Named","comments":[],"base_classes":[],"type_parameters":[],"callables":{"describe":{"id":"can://typescript/slim/src/models.ts/Named/describe","kind":"method","span":{"start":[9,3],"end":[9,22],"bytes":[150,169]},"name":"describe","signature":"src/models.Named.describe","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":0,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"name":{"id":"can://typescript/slim/src/models.ts/Named/name","kind":"field","span":{"start":[8,3],"end":[8,16],"bytes":[134,147]},"name":"name","type":"string","comments":[],"decorators":[],"is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"call_signatures":[],"index_signatures":[],"is_exported":true,"is_ambient":false},"Role":{"id":"can://typescript/slim/src/models.ts/Role","kind":"enum","span":{"start":[14,1],"end":[18,2],"bytes":[212,291]},"name":"Role","signature":"src/models.Role","comments":[],"fields":{"Admin":{"id":"can://typescript/slim/src/models.ts/Role/Admin","kind":"field","span":{"start":[15,3],"end":[15,18],"bytes":[233,248]},"name":"Admin","value":"admin"},"Member":{"id":"can://typescript/slim/src/models.ts/Role/Member","kind":"field","span":{"start":[16,3],"end":[16,20],"bytes":[252,269]},"name":"Member","value":"member"},"Guest":{"id":"can://typescript/slim/src/models.ts/Role/Guest","kind":"field","span":{"start":[17,3],"end":[17,18],"bytes":[273,288]},"name":"Guest","value":"guest"}},"is_const":false,"is_exported":true,"is_ambient":false},"Flag":{"id":"can://typescript/slim/src/models.ts/Flag","kind":"enum","span":{"start":[20,1],"end":[23,2],"bytes":[293,345]},"name":"Flag","signature":"src/models.Flag","comments":[],"fields":{"None":{"id":"can://typescript/slim/src/models.ts/Flag/None","kind":"field","span":{"start":[21,3],"end":[21,11],"bytes":[320,328]},"name":"None","value":"0"},"Active":{"id":"can://typescript/slim/src/models.ts/Flag/Active","kind":"field","span":{"start":[22,3],"end":[22,13],"bytes":[332,342]},"name":"Active","value":"1"}},"is_const":true,"is_exported":true,"is_ambient":false},"UserId":{"id":"can://typescript/slim/src/models.ts/UserId","kind":"type_alias","span":{"start":[12,1],"end":[12,38],"bytes":[173,210]},"name":"UserId","signature":"src/models.UserId","comments":[],"aliased_type":"string | number","type_parameters":[],"is_exported":true,"is_ambient":false}},"functions":{},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"d39ff571ccfda4b7c46923586b6b94d0e818a51be966f1ba40305650fd0ffc91"},"src/services.ts":{"id":"can://typescript/slim/src/services.ts","kind":"module","span":{"start":[1,1],"end":[48,1],"bytes":[0,1240]},"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,"resolved_module":"src/models.ts"},{"module":"./models","name":"Role","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"User","is_type_only":false,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"},{"module":"./models","name":"UserId","is_type_only":true,"import_kind":"named","start_line":1,"end_line":1,"start_column":1,"end_column":64,"resolved_module":"src/models.ts"}],"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}],"types":{"UserService":{"id":"can://typescript/slim/src/services.ts/UserService","kind":"class","span":{"start":[19,1],"end":[47,2],"bytes":[558,1239]},"name":"UserService","signature":"src/services.UserService","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"create":{"id":"can://typescript/slim/src/services.ts/UserService/create","kind":"method","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"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,"id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"}],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"25:16":{"kind":"call","span":{"start":[25,16],"end":[25,56],"bytes":[744,784]},"callee":"can://typescript/slim/src/services.ts/nextId","method_name":"nextId","argument_types":["number"],"type_arguments":[],"return_type":"UserId","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@25:16"},"26:18":{"kind":"call","span":{"start":[26,18],"end":[26,42],"bytes":[803,827]},"callee":"can://typescript/slim/src/models.ts/User/constructor","method_name":"User","argument_types":["UserId","string","Role"],"type_arguments":[],"return_type":"User","is_constructor_call":true,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/create@26:18"},"27:5":{"kind":"call","span":{"start":[27,5],"end":[27,26],"bytes":[833,854]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/services.ts/UserService/create@27:5"},"@entry":{"kind":"entry","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"id":"can://typescript/slim/src/services.ts/UserService/create@entry"},"25:5":{"kind":"statement","span":{"start":[25,5],"end":[25,57],"bytes":[733,785]},"id":"can://typescript/slim/src/services.ts/UserService/create@25:5"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,43],"bytes":[790,828]},"id":"can://typescript/slim/src/services.ts/UserService/create@26:5"},"28:5":{"kind":"statement","span":{"start":[28,5],"end":[28,17],"bytes":[860,872]},"id":"can://typescript/slim/src/services.ts/UserService/create@28:5"},"@exit":{"kind":"exit","span":{"start":[24,3],"end":[29,4],"bytes":[674,876]},"id":"can://typescript/slim/src/services.ts/UserService/create@exit"},"@formal_in:0":{"kind":"formal_in","of":"name","id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"role","id":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/create@formal_out"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_out"},"25:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"25:5","id":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_out"},"25:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"25:5","id":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_in:0"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:0"},"26:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:1"},"26:5/actual_in:2":{"kind":"actual_in","of":"arg2","parent":"26:5","id":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:2"},"27:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"27:5","id":"can://typescript/slim/src/services.ts/UserService/create@27:5/actual_in:0"},"27:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"27:5","id":"can://typescript/slim/src/services.ts/UserService/create@27:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"25:5/actual_in:0","var":"this.startId","prov":["reaching-defs"]},{"src":"@entry","dst":"25:5/actual_in:0","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":"@formal_in:0","dst":"26:5","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"26:5/actual_in:1","var":"name","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5","var":"role","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"26:5/actual_in:2","var":"role","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5","var":"id","prov":["reaching-defs"]},{"src":"25:5","dst":"26:5/actual_in:0","var":"id","prov":["reaching-defs"]},{"src":"25:5/actual_out","dst":"25:5","var":"$ret","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":"26:5/actual_out","dst":"26:5","var":"$ret","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":{"id":"can://typescript/slim/src/services.ts/UserService/createGuest","kind":"method","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"name":"createGuest","signature":"src/services.UserService.createGuest","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"User","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"32:18":{"kind":"call","span":{"start":[32,18],"end":[32,50],"bytes":[919,951]},"callee":"can://typescript/slim/src/services.ts/makeGuestName","method_name":"makeGuestName","argument_types":["number"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:18"},"33:12":{"kind":"call","span":{"start":[33,12],"end":[33,41],"bytes":[964,993]},"callee":"can://typescript/slim/src/services.ts/UserService/create","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,"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:12"},"@entry":{"kind":"entry","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@entry"},"32:5":{"kind":"statement","span":{"start":[32,5],"end":[32,51],"bytes":[906,952]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5"},"33:5":{"kind":"statement","span":{"start":[33,5],"end":[33,42],"bytes":[957,994]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5"},"@exit":{"kind":"exit","span":{"start":[31,3],"end":[34,4],"bytes":[880,998]},"id":"can://typescript/slim/src/services.ts/UserService/createGuest@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/createGuest@formal_out"},"32:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"32:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_out"},"33:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_out"},"32:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"32:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_in:0"},"33:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:0"},"33:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"33:5","id":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"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":"32:5/actual_in:0","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":"32:5","dst":"33:5/actual_in:0","var":"name","prov":["reaching-defs"]},{"src":"32:5/actual_out","dst":"32:5","var":"$ret","prov":["reaching-defs"]},{"src":"33:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"33:5/actual_out","dst":"33:5","var":"$ret","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":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll","kind":"method","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"name":"describeAll","signature":"src/services.UserService.describeAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string[]","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:12":{"kind":"call","span":{"start":[37,12],"end":[37,47],"bytes":[1039,1074]},"callee":"can://typescript/slim/@external/(builtin)/map","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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:12"},"@entry":{"kind":"entry","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@entry"},"37:5":{"kind":"statement","span":{"start":[37,5],"end":[37,48],"bytes":[1032,1075]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5"},"@exit":{"kind":"exit","span":{"start":[36,3],"end":[38,4],"bytes":[1002,1079]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/describeAll@formal_out"},"37:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"37:5","id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5/actual_in:0"},"37:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:5","id":"can://typescript/slim/src/services.ts/UserService/describeAll@37:5/actual_out"}},"callables":{"":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"arrow","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"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,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"37:34":{"kind":"call","span":{"start":[37,34],"end":[37,46],"bytes":[1061,1073]},"callee":"can://typescript/slim/src/models.ts/User/describe","method_name":"describe","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34"},"@entry":{"kind":"entry","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@entry"},"@exit":{"kind":"exit","span":{"start":[37,27],"end":[37,46],"bytes":[1054,1073]},"id":"can://typescript/slim/src/services.ts/UserService/describeAll/@exit"},"@formal_in:0":{"kind":"formal_in","of":"u","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@formal_out"},"37:34/actual_out":{"kind":"actual_out","of":"$ret","parent":"37:34","id":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"37:34","var":"u.describe","prov":["reaching-defs"]},{"src":"37:34","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"37:34/actual_out","dst":"37:34","var":"$ret","prov":["reaching-defs"]}],"summary":[]}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/services.ts/UserService/loginAll","kind":"method","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"name":"loginAll","signature":"src/services.UserService.loginAll","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"Promise","cyclomatic_complexity":2,"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":[],"body":{"43:22":{"kind":"call","span":{"start":[43,22],"end":[43,37],"bytes":[1193,1208]},"callee":"can://typescript/slim/src/models.ts/User/recordLogin","method_name":"recordLogin","receiver_expr":"u","receiver_type":"User","argument_types":[],"type_arguments":[],"return_type":"Promise","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:22"},"@entry":{"kind":"entry","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@entry"},"41:5":{"kind":"statement","span":{"start":[41,5],"end":[41,19],"bytes":[1123,1137]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@41:5"},"42:5":{"kind":"statement","span":{"start":[42,5],"end":[44,6],"bytes":[1142,1215]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@42:5"},"43:7":{"kind":"statement","span":{"start":[43,7],"end":[43,38],"bytes":[1178,1209]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7"},"45:5":{"kind":"statement","span":{"start":[45,5],"end":[45,18],"bytes":[1220,1233]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@45:5"},"@exit":{"kind":"exit","span":{"start":[40,3],"end":[46,4],"bytes":[1083,1237]},"id":"can://typescript/slim/src/services.ts/UserService/loginAll@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/loginAll@formal_out"},"43:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"43:7","id":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"43:7/actual_out","dst":"43:7","var":"$ret","prov":["reaching-defs"]},{"src":"45:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"constructor":{"id":"can://typescript/slim/src/services.ts/UserService/constructor","kind":"constructor","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"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,"id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"}],"type_parameters":[],"cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@entry"},"@exit":{"kind":"exit","span":{"start":[22,3],"end":[22,55],"bytes":[618,670]},"id":"can://typescript/slim/src/services.ts/UserService/constructor@exit"},"@formal_in:0":{"kind":"formal_in","of":"startId","id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/UserService/constructor@formal_out"}},"entrypoints":[],"is_entrypoint":false,"cfg":[{"src":"@entry","dst":"@exit","kind":"fallthrough"}],"cdg":[],"ddg":[],"summary":[]}},"fields":{"users":{"id":"can://typescript/slim/src/services.ts/UserService/users","kind":"field","span":{"start":[20,3],"end":[20,30],"bytes":[587,614]},"name":"users","type":"User[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false},"startId":{"id":"can://typescript/slim/src/services.ts/UserService/startId","kind":"field","name":"startId","type":"number","comments":[],"decorators":[],"accessibility":"private","is_static":false,"is_readonly":true,"is_optional":true,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"makeGuestName":{"id":"can://typescript/slim/src/services.ts/makeGuestName","kind":"function","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"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,"id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"id":"can://typescript/slim/src/services.ts/makeGuestName@entry"},"5:3":{"kind":"statement","span":{"start":[5,3],"end":[5,26],"bytes":[164,187]},"id":"can://typescript/slim/src/services.ts/makeGuestName@5:3"},"@exit":{"kind":"exit","span":{"start":[4,1],"end":[6,2],"bytes":[108,189]},"id":"can://typescript/slim/src/services.ts/makeGuestName@exit"},"@formal_in:0":{"kind":"formal_in","of":"seed","id":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/makeGuestName@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"5:3","var":"seed","prov":["reaching-defs"]},{"src":"5:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"announce":{"id":"can://typescript/slim/src/services.ts/announce","kind":"function","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"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,"id":"can://typescript/slim/src/services.ts/announce@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"13:10":{"kind":"call","span":{"start":[13,10],"end":[13,26],"bytes":[407,423]},"callee":"can://typescript/slim/src/models.ts/Named/describe","method_name":"describe","receiver_expr":"thing","receiver_type":"Named","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/services.ts/announce@13:10"},"@entry":{"kind":"entry","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"id":"can://typescript/slim/src/services.ts/announce@entry"},"13:3":{"kind":"statement","span":{"start":[13,3],"end":[13,27],"bytes":[400,424]},"id":"can://typescript/slim/src/services.ts/announce@13:3"},"@exit":{"kind":"exit","span":{"start":[12,1],"end":[14,2],"bytes":[349,426]},"id":"can://typescript/slim/src/services.ts/announce@exit"},"@formal_in:0":{"kind":"formal_in","of":"thing","id":"can://typescript/slim/src/services.ts/announce@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/announce@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"13:3","var":"thing.describe","prov":["reaching-defs"]},{"src":"13:3","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]},"nextId":{"id":"can://typescript/slim/src/services.ts/nextId","kind":"arrow","span":{"start":[17,14],"end":[17,51],"bytes":[518,555]},"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,"id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"}],"type_parameters":[],"return_type":"UserId","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"@entry":{"kind":"entry","span":{"start":[17,23],"end":[17,51],"bytes":[527,555]},"id":"can://typescript/slim/src/services.ts/nextId@entry"},"17:46":{"kind":"statement","span":{"start":[17,46],"end":[17,51],"bytes":[550,555]},"id":"can://typescript/slim/src/services.ts/nextId@17:46"},"@exit":{"kind":"exit","span":{"start":[17,23],"end":[17,51],"bytes":[527,555]},"id":"can://typescript/slim/src/services.ts/nextId@exit"},"@formal_in:0":{"kind":"formal_in","of":"n","id":"can://typescript/slim/src/services.ts/nextId@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/services.ts/nextId@formal_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"17:46","var":"n","prov":["reaching-defs"]},{"src":"17:46","dst":"@formal_out","var":"return","prov":["reaching-defs"]}],"summary":[]}},"fields":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"1bda3666dab48f8e686fb8ffc2143f2e422af62be46698053cfeea4184b55617"},"src/util.ts":{"id":"can://typescript/slim/src/util.ts","kind":"module","span":{"start":[1,1],"end":[35,1],"bytes":[0,949]},"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}],"types":{"StringUtil":{"id":"can://typescript/slim/src/util.ts/StringUtil","kind":"namespace","span":{"start":[2,1],"end":[21,2],"bytes":[106,543]},"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}],"types":{"Builder":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder","kind":"class","span":{"start":[11,3],"end":[20,4],"bytes":[328,541]},"name":"Builder","signature":"src/util.StringUtil.Builder","comments":[],"decorators":[],"base_classes":[],"implements_types":[],"type_parameters":[],"callables":{"add":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","kind":"method","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"}],"type_parameters":[],"return_type":"this","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"14:7":{"kind":"call","span":{"start":[14,7],"end":[14,34],"bytes":[421,448]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7"},"14:23":{"kind":"call","span":{"start":[14,23],"end":[14,33],"bytes":[437,447]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:23"},"@entry":{"kind":"entry","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@entry"},"15:7":{"kind":"statement","span":{"start":[15,7],"end":[15,19],"bytes":[456,468]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@15:7"},"@exit":{"kind":"exit","span":{"start":[13,5],"end":[16,6],"bytes":[389,474]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@exit"},"@formal_in:0":{"kind":"formal_in","of":"part","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_out"},"14:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"14:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0"},"14:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"14:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"14:7","var":"part","prov":["reaching-defs"]},{"src":"@formal_in:0","dst":"14:7/actual_in:0","var":"part","prov":["reaching-defs"]},{"src":"14:7/actual_out","dst":"14:7","var":"$ret","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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","kind":"method","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"name":"build","signature":"src/util.StringUtil.Builder.build","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"18:14":{"kind":"call","span":{"start":[18,14],"end":[18,34],"bytes":[510,530]},"callee":"can://typescript/slim/@external/(builtin)/join","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,"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:14"},"@entry":{"kind":"entry","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@entry"},"18:7":{"kind":"statement","span":{"start":[18,7],"end":[18,35],"bytes":[503,531]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7"},"@exit":{"kind":"exit","span":{"start":[17,5],"end":[19,6],"bytes":[479,537]},"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@exit"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@formal_out"},"18:7/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"18:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7/actual_in:0"},"18:7/actual_out":{"kind":"actual_out","of":"$ret","parent":"18:7","id":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@18:7/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","kind":"constructor","span":{"start":[0,0],"end":[0,0],"bytes":[0,0]},"name":"constructor","signature":"src/util.StringUtil.Builder.constructor","comments":[],"decorators":[],"parameters":[],"type_parameters":[],"cyclomatic_complexity":0,"is_static":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":[],"body":{},"entrypoints":[],"is_entrypoint":false}},"fields":{"parts":{"id":"can://typescript/slim/src/util.ts/StringUtil/Builder/parts","kind":"field","span":{"start":[12,5],"end":[12,34],"bytes":[355,384]},"name":"parts","type":"string[]","comments":[],"decorators":[],"initializer":"[]","accessibility":"private","is_static":false,"is_readonly":false,"is_optional":false,"is_abstract":false}},"is_abstract":false,"is_exported":true,"is_ambient":false,"entrypoints":[],"is_entrypoint":false}},"functions":{"repeat":{"id":"can://typescript/slim/src/util.ts/StringUtil/repeat","kind":"function","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"4:12":{"kind":"call","span":{"start":[4,12],"end":[4,29],"bytes":[204,221]},"callee":"can://typescript/slim/@external/(builtin)/repeat","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,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12"},"4:12/2":{"kind":"call","span":{"start":[4,12],"end":[4,19],"bytes":[204,211]},"callee":"can://typescript/slim/src/util.ts/StringUtil/slug","method_name":"slug","argument_types":["string"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:12/2"},"@entry":{"kind":"entry","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@entry"},"4:5":{"kind":"statement","span":{"start":[4,5],"end":[4,30],"bytes":[197,222]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5"},"@exit":{"kind":"exit","span":{"start":[3,3],"end":[5,4],"bytes":[138,226]},"id":"can://typescript/slim/src/util.ts/StringUtil/repeat@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},"@formal_in:1":{"kind":"formal_in","of":"n","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_out"},"4:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"4:5","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_in:0"},"4:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"4:5","id":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","dst":"4:5","var":"s","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5","var":"n","prov":["reaching-defs"]},{"src":"@formal_in:1","dst":"4:5/actual_in:0","var":"n","prov":["reaching-defs"]},{"src":"4:5","dst":"@formal_out","var":"return","prov":["reaching-defs"]},{"src":"4:5/actual_out","dst":"4:5","var":"$ret","prov":["reaching-defs"]}],"summary":[{"src":"4:5/actual_in:0","dst":"4:5/actual_out"}]},"slug":{"id":"can://typescript/slim/src/util.ts/StringUtil/slug","kind":"function","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"8:12":{"kind":"call","span":{"start":[8,12],"end":[8,48],"bytes":[283,319]},"callee":"can://typescript/slim/@external/(builtin)/replace","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,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12"},"8:12/2":{"kind":"call","span":{"start":[8,12],"end":[8,27],"bytes":[283,298]},"callee":"can://typescript/slim/@external/(builtin)/toLowerCase","method_name":"toLowerCase","receiver_expr":"s","receiver_type":"string","argument_types":[],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:12/2"},"@entry":{"kind":"entry","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@entry"},"8:5":{"kind":"statement","span":{"start":[8,5],"end":[8,49],"bytes":[276,320]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5"},"@exit":{"kind":"exit","span":{"start":[7,3],"end":[9,4],"bytes":[230,324]},"id":"can://typescript/slim/src/util.ts/StringUtil/slug@exit"},"@formal_in:0":{"kind":"formal_in","of":"s","id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out"},"8:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_in:0"},"8:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_out"},"8:5/actual_in:1":{"kind":"actual_in","of":"arg1","parent":"8:5","id":"can://typescript/slim/src/util.ts/StringUtil/slug@8:5/actual_in:1"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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":{},"is_exported":true,"is_ambient":false}},"functions":{"classify":{"id":"can://typescript/slim/src/util.ts/classify","kind":"function","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"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,"id":"can://typescript/slim/src/util.ts/classify@formal_in:0"}],"type_parameters":[{"name":"T","constraint":"{ name: string }"}],"return_type":"Record","cyclomatic_complexity":2,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":true,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"30:15":{"kind":"call","span":{"start":[30,15],"end":[30,26],"bytes":[884,895]},"callee":"can://typescript/slim/src/util.ts/classify/keyOf","method_name":"keyOf","argument_types":["T"],"type_arguments":[],"return_type":"string","is_constructor_call":false,"is_optional_chain":false,"id":"can://typescript/slim/src/util.ts/classify@30:15"},"31:5":{"kind":"call","span":{"start":[31,5],"end":[31,31],"bytes":[901,927]},"callee":"can://typescript/slim/@external/(builtin)/push","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,"id":"can://typescript/slim/src/util.ts/classify@31:5"},"@entry":{"kind":"entry","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@entry"},"25:3":{"kind":"statement","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify@25:3"},"28:3":{"kind":"statement","span":{"start":[28,3],"end":[28,39],"bytes":[803,839]},"id":"can://typescript/slim/src/util.ts/classify@28:3"},"29:3":{"kind":"statement","span":{"start":[29,3],"end":[32,4],"bytes":[842,932]},"id":"can://typescript/slim/src/util.ts/classify@29:3"},"30:5":{"kind":"statement","span":{"start":[30,5],"end":[30,27],"bytes":[874,896]},"id":"can://typescript/slim/src/util.ts/classify@30:5"},"33:3":{"kind":"statement","span":{"start":[33,3],"end":[33,14],"bytes":[935,946]},"id":"can://typescript/slim/src/util.ts/classify@33:3"},"@exit":{"kind":"exit","span":{"start":[24,1],"end":[34,2],"bytes":[641,948]},"id":"can://typescript/slim/src/util.ts/classify@exit"},"@formal_in:0":{"kind":"formal_in","of":"items","id":"can://typescript/slim/src/util.ts/classify@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/classify@formal_out"},"30:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"30:5","id":"can://typescript/slim/src/util.ts/classify@30:5/actual_in:0"},"30:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"30:5","id":"can://typescript/slim/src/util.ts/classify@30:5/actual_out"},"31:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"31:5","id":"can://typescript/slim/src/util.ts/classify@31:5/actual_in:0"},"31:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"31:5","id":"can://typescript/slim/src/util.ts/classify@31:5/actual_out"}},"callables":{"keyOf":{"id":"can://typescript/slim/src/util.ts/classify/keyOf","kind":"function","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"}],"type_parameters":[],"return_type":"string","cyclomatic_complexity":1,"is_static":false,"is_abstract":false,"is_async":false,"is_generator":false,"is_optional":false,"is_readonly":false,"is_exported":false,"is_ambient":false,"is_implicit":false,"overload_signatures":[],"body":{"26:12":{"kind":"call","span":{"start":[26,12],"end":[26,31],"bytes":[776,795]},"callee":"can://typescript/slim/@external/(builtin)/charAt","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,"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:12"},"@entry":{"kind":"entry","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@entry"},"26:5":{"kind":"statement","span":{"start":[26,5],"end":[26,32],"bytes":[769,796]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5"},"@exit":{"kind":"exit","span":{"start":[25,3],"end":[27,4],"bytes":[731,800]},"id":"can://typescript/slim/src/util.ts/classify/keyOf@exit"},"@formal_in:0":{"kind":"formal_in","of":"item","id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"},"@formal_out":{"kind":"formal_out","of":"$ret","id":"can://typescript/slim/src/util.ts/classify/keyOf@formal_out"},"26:5/actual_in:0":{"kind":"actual_in","of":"arg0","parent":"26:5","id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5/actual_in:0"},"26:5/actual_out":{"kind":"actual_out","of":"$ret","parent":"26:5","id":"can://typescript/slim/src/util.ts/classify/keyOf@26:5/actual_out"}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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"}]}},"entrypoints":[],"is_entrypoint":false,"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":"@formal_in:0","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":"30:5/actual_in:0","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":"30:5/actual_out","dst":"30:5","var":"$ret","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":{},"is_tsx":false,"is_declaration_file":false,"content_hash":"54886cff7e11ccadc987571f508b2aef2f324b14e63d8ad52100499851d130fa"}},"call_graph":[{"src":"can://typescript/slim/src/controllers.ts","dst":"can://typescript/slim/src/controllers.ts/Controller","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/index.ts","dst":"can://typescript/slim/src/index.ts/main","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Param","prov":["tsc","defuse"],"weight":2},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/services.ts/UserService/describeAll","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/UserService/createGuest","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/list","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/controllers.ts/UserController/show","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/services.ts/announce","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/models.ts/Robot/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","prov":["tsc"],"weight":2},{"src":"can://typescript/slim/src/index.ts/main","dst":"can://typescript/slim/@external/(builtin)/log","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/models.ts/User/constructor","dst":"can://typescript/slim/src/models.ts/Entity/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Named/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/announce","dst":"can://typescript/slim/src/models.ts/Robot/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/services.ts/nextId","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/src/models.ts/User/constructor","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/create","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/makeGuestName","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest","dst":"can://typescript/slim/src/services.ts/UserService/create","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/@external/(builtin)/map","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll/","dst":"can://typescript/slim/src/models.ts/User/describe","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/loginAll","dst":"can://typescript/slim/src/models.ts/User/recordLogin","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/src/util.ts/classify/keyOf","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/classify/keyOf","dst":"can://typescript/slim/@external/(builtin)/charAt","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/@external/(builtin)/repeat","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/replace","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug","dst":"can://typescript/slim/@external/(builtin)/toLowerCase","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/@external/(builtin)/push","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add","dst":"can://typescript/slim/src/util.ts/StringUtil/slug","prov":["tsc"],"weight":1},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build","dst":"can://typescript/slim/@external/(builtin)/join","prov":["import"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/list","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/controllers.ts/UserController/show","dst":"can://typescript/slim/src/controllers.ts/Get","prov":["defuse"],"weight":1},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/","prov":["defuse"],"weight":1}],"param_in":[{"src":"can://typescript/slim/src/controllers.ts/UserController/show@20:5","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@11:3/actual_in:0","dst":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@13:3","dst":"can://typescript/slim/src/controllers.ts/UserController/show@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/index.ts/main@13:3/actual_in:0","dst":"can://typescript/slim/src/controllers.ts/UserController/show@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:1","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@16:3/actual_in:2","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/slim/src/models.ts/Robot/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@17:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/announce@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@19:3/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@19:3/actual_in:1","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@21:3/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@7:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/constructor@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@8:3","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/index.ts/main@8:3/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/index.ts/main@8:3/actual_in:1","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/slim/src/index.ts/main@9:3","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_in:0","dst":"can://typescript/slim/src/models.ts/Entity/constructor@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/nextId@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:0","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:1","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:1"},{"src":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_in:2","dst":"can://typescript/slim/src/models.ts/User/constructor@formal_in:2"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/makeGuestName@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5","dst":"can://typescript/slim/src/services.ts/UserService/create@entry","var":"src/services.nextId"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:0","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:0"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_in:1","dst":"can://typescript/slim/src/services.ts/UserService/create@formal_in:1"},{"src":"can://typescript/slim/src/util.ts/classify@30:5/actual_in:0","dst":"can://typescript/slim/src/util.ts/classify/keyOf@formal_in:0"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_in:0","dst":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_in:0"}],"param_out":[{"src":"can://typescript/slim/src/controllers.ts/UserController/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@11:3/actual_out"},{"src":"can://typescript/slim/src/controllers.ts/UserController/list@formal_out","dst":"can://typescript/slim/src/index.ts/main@12:3/actual_out"},{"src":"can://typescript/slim/src/controllers.ts/UserController/show@formal_out","dst":"can://typescript/slim/src/index.ts/main@13:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/Entity/constructor@formal_out","dst":"can://typescript/slim/src/models.ts/User/constructor@40:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/Robot/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/constructor@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/create@26:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/describe@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/show@21:5/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/describe@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/describeAll/@37:34/actual_out"},{"src":"can://typescript/slim/src/models.ts/User/recordLogin@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/loginAll@43:7/actual_out"},{"src":"can://typescript/slim/src/services.ts/announce@formal_out","dst":"can://typescript/slim/src/index.ts/main@16:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/announce@formal_out","dst":"can://typescript/slim/src/index.ts/main@17:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/makeGuestName@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@32:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/nextId@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/create@25:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/constructor@formal_out","dst":"can://typescript/slim/src/index.ts/main@7:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/show@20:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/index.ts/main@8:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/create@formal_out","dst":"can://typescript/slim/src/services.ts/UserService/createGuest@33:5/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/createGuest@formal_out","dst":"can://typescript/slim/src/index.ts/main@9:3/actual_out"},{"src":"can://typescript/slim/src/services.ts/UserService/describeAll@formal_out","dst":"can://typescript/slim/src/controllers.ts/UserController/list@26:5/actual_out"},{"src":"can://typescript/slim/src/util.ts/classify/keyOf@formal_out","dst":"can://typescript/slim/src/util.ts/classify@30:5/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@formal_out","dst":"can://typescript/slim/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/Builder/build@formal_out","dst":"can://typescript/slim/src/index.ts/main@21:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/repeat@formal_out","dst":"can://typescript/slim/src/index.ts/main@19:3/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/slim/src/util.ts/StringUtil/Builder/add@14:7/actual_out"},{"src":"can://typescript/slim/src/util.ts/StringUtil/slug@formal_out","dst":"can://typescript/slim/src/util.ts/StringUtil/repeat@4:5/actual_out"}],"artifacts":{"package.json":{"id":"can://artifact/slim/package.json","kind":"artifact","path":"package.json","format":"json","roles":["dependency-manifest","tool-config"],"size_bytes":88,"sha256":"277f174033b3f17dcd3ba9a550b53289624f034606303cef18a3f84ab7156c67","source":"{\n \"name\": \"sample-app\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"private\": true\n}\n","extraction":"none","config_keys":[]},"tsconfig.json":{"id":"can://artifact/slim/tsconfig.json","kind":"artifact","path":"tsconfig.json","format":"json","roles":["tool-config"],"size_bytes":289,"sha256":"72f24fc616456ab556dd8e7c886264214cb344547b32b972eb476467af0a9cab","source":"{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"experimentalDecorators\": true,\n \"emitDecoratorMetadata\": true\n },\n \"include\": [\"src/**/*.ts\"]\n}\n","extraction":"full","config_keys":[{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.target","key":"compilerOptions.target","namespace":"json","value":"ES2022","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.module","key":"compilerOptions.module","namespace":"json","value":"ESNext","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.moduleResolution","key":"compilerOptions.moduleResolution","namespace":"json","value":"bundler","references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.strict","key":"compilerOptions.strict","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.esModuleInterop","key":"compilerOptions.esModuleInterop","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.skipLibCheck","key":"compilerOptions.skipLibCheck","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.experimentalDecorators","key":"compilerOptions.experimentalDecorators","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/compilerOptions.emitDecoratorMetadata","key":"compilerOptions.emitDecoratorMetadata","namespace":"json","value":true,"references":[]},{"id":"can://artifact/slim/tsconfig.json@key/include.0","key":"include.0","namespace":"json","value":"src/**/*.ts","references":[]}]}},"dependencies":[],"unresolved_imports":[],"config_uses":[],"config_reads":[],"entrypoint_report":{"frameworks_detected":[],"rulesets":["shipped"],"unresolved":{"Get":2,"Controller":1},"errors":[]},"external_symbols":{"can://typescript/slim/@external/(builtin)/log":{"id":"can://typescript/slim/@external/(builtin)/log","kind":"external","module":"(builtin)","name":"log"},"can://typescript/slim/@external/(builtin)/push":{"id":"can://typescript/slim/@external/(builtin)/push","kind":"external","module":"(builtin)","name":"push"},"can://typescript/slim/@external/(builtin)/map":{"id":"can://typescript/slim/@external/(builtin)/map","kind":"external","module":"(builtin)","name":"map"},"can://typescript/slim/@external/(builtin)/charAt":{"id":"can://typescript/slim/@external/(builtin)/charAt","kind":"external","module":"(builtin)","name":"charAt"},"can://typescript/slim/@external/(builtin)/repeat":{"id":"can://typescript/slim/@external/(builtin)/repeat","kind":"external","module":"(builtin)","name":"repeat"},"can://typescript/slim/@external/(builtin)/replace":{"id":"can://typescript/slim/@external/(builtin)/replace","kind":"external","module":"(builtin)","name":"replace"},"can://typescript/slim/@external/(builtin)/toLowerCase":{"id":"can://typescript/slim/@external/(builtin)/toLowerCase","kind":"external","module":"(builtin)","name":"toLowerCase"},"can://typescript/slim/@external/(builtin)/join":{"id":"can://typescript/slim/@external/(builtin)/join","kind":"external","module":"(builtin)","name":"join"}},"synthesized_callables":{"can://typescript/slim/src/controllers.ts/Controller@5:10":{"id":"can://typescript/slim/src/controllers.ts/Controller/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Get@8:10":{"id":"can://typescript/slim/src/controllers.ts/Get/","kind":"callable"},"can://typescript/slim/src/controllers.ts/Param@11:10":{"id":"can://typescript/slim/src/controllers.ts/Param/","kind":"callable"},"can://typescript/slim/src/services.ts/UserService/describeAll@37:27":{"id":"can://typescript/slim/src/services.ts/UserService/describeAll/","kind":"callable"}}}} \ No newline at end of file diff --git a/uv.lock b/uv.lock index 76c13f7b..d2d2a55a 100644 --- a/uv.lock +++ b/uv.lock @@ -352,7 +352,7 @@ requires-dist = [ { name = "cldk", extras = ["neo4j"], marker = "extra == 'all'" }, { name = "codeanalyzer-java", marker = "extra == 'java'", specifier = "==3.0.3" }, { name = "codeanalyzer-python", specifier = "==1.4.1" }, - { name = "codeanalyzer-typescript", specifier = "==1.4.0" }, + { name = "codeanalyzer-typescript", specifier = "==1.5.0" }, { name = "neo4j", marker = "extra == 'neo4j'", specifier = ">=5.14,<7" }, { name = "networkx", specifier = ">=3.4.2,<4" }, { name = "pydantic", specifier = ">=2.10.6,<3" }, @@ -433,14 +433,14 @@ wheels = [ [[package]] name = "codeanalyzer-typescript" -version = "1.4.0" +version = "1.5.0" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/f3/63cb17f9e86f82f9ccab0542c5605cbc59a07f1c69b206da1915e3e1de87/codeanalyzer_typescript-1.4.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2cb970c9a8c3a4b03d586b54f74b2051cfc0cf466a64c25301c8c1336f9facd5", size = 30871883, upload-time = "2026-09-07T21:24:10.41Z" }, - { url = "https://files.pythonhosted.org/packages/3c/5d/02565ad92e5bc69b7ee3eb713466404a0d255011249adf9b6c7f87985f84/codeanalyzer_typescript-1.4.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:38d8892a6bdd06922fb4db4cd487455d4b1d73ca2ce9fff575f3399d747e8490", size = 28270100, upload-time = "2026-09-07T21:24:14.491Z" }, - { url = "https://files.pythonhosted.org/packages/da/1f/6494066ce8efbe00d5b4df720e6769376fb6e370e3b051ce3a0ddba6b4c5/codeanalyzer_typescript-1.4.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:a97e2e61aff13329f151d83087b1d9f2c445654ca9c6f063164eff9b5722c77b", size = 39037559, upload-time = "2026-09-07T21:24:18.52Z" }, - { url = "https://files.pythonhosted.org/packages/8d/aa/633398cf8b532c101fbcc0d25a163a451a31433d1b05eb0f3a5983320c81/codeanalyzer_typescript-1.4.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6fb27a4ebe58ad94295cd739230b4951123417b8552000f1820f891d38f7b4f1", size = 39081825, upload-time = "2026-09-07T21:24:23.512Z" }, - { url = "https://files.pythonhosted.org/packages/f8/dd/eb01cd47b57781ae2773e51c042fa72e70902e88900e3caa2750561e783b/codeanalyzer_typescript-1.4.0-py3-none-win_amd64.whl", hash = "sha256:b3579e95ea83c3bc96656dd0c348d87f834cb434e25aa85cb7723b5d6d25a41c", size = 42231729, upload-time = "2026-09-07T21:24:28.204Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4d/c35e431af85d8d639ffa0d83079c4a9e545724d9ff26f58471c6bb9ced1a/codeanalyzer_typescript-1.5.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a8e2b0e8252997e3a8123558be6c52d5cfafb6f1ad6bec343cea5cc7e9995e2d", size = 30872960, upload-time = "2026-09-07T22:56:02.724Z" }, + { url = "https://files.pythonhosted.org/packages/b8/76/e93a6170be5716bcb6e550f629337810b8a316cad33d2d49e9235c9d8dd0/codeanalyzer_typescript-1.5.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8b185485369effac56712f2ebe030d58fbb22776e786d4f4d1ab95c51c0b75b1", size = 28271201, upload-time = "2026-09-07T22:56:05.602Z" }, + { url = "https://files.pythonhosted.org/packages/16/43/bf885cd1f44c259fae64fba7b62b07f08718520730d365cdc7cdaec99c32/codeanalyzer_typescript-1.5.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:b61270038e6dac8f3e3bd8254a3683a5e65359e83caf48208868f8ad83d6f3aa", size = 39038628, upload-time = "2026-09-07T22:56:08.305Z" }, + { url = "https://files.pythonhosted.org/packages/3c/34/0fdbfd854e822b13a7b13ef1dfef37e98b508b52d83d6f16e1d29da1d7db/codeanalyzer_typescript-1.5.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b9d791feb82498b188311d9ea0f20e76e626589e68e55a2a265e9b8a9614a7ca", size = 39082870, upload-time = "2026-09-07T22:56:11.662Z" }, + { url = "https://files.pythonhosted.org/packages/33/d1/c04254f170e86d2dec03dd70098b9be0ea030355b00ce6d292f1662753da/codeanalyzer_typescript-1.5.0-py3-none-win_amd64.whl", hash = "sha256:321bb5857c600757f34c02e3f0675f6883af70fb796da03ded331356325260c1", size = 42232778, upload-time = "2026-09-07T22:56:14.666Z" }, ] [[package]]