@saptools/service-flow 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +11 -3
- package/TECHNICAL-NOTE.md +16 -2
- package/dist/{chunk-SIKIGT42.js → chunk-I33ASGX3.js} +322 -122
- package/dist/chunk-I33ASGX3.js.map +1 -0
- package/dist/cli.js +148 -95
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-SIKIGT42.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.5
|
|
4
|
+
|
|
5
|
+
- Runtime `--var` substitution now re-runs operation resolution in memory for trace and graph output, clears stale unresolved reasons on exact matches, and traverses into the matched downstream handler without mutating the persisted graph.
|
|
6
|
+
- Operation nodes now use target CDS provenance while call-site evidence remains on edges.
|
|
7
|
+
- Graph edges now carry explicit status values for resolved, terminal, dynamic, ambiguous, and unresolved cases; normal DB, external HTTP, and event terminals no longer receive remote-resolution failure text.
|
|
8
|
+
- Replaced per-statement SQLite shelling with a persistent `node:sqlite` connection, bound parameters, transactions, read-only query openings, WAL, busy timeouts, and connection-local foreign-key enforcement.
|
|
9
|
+
- Added schema user-version migration support for edge status and repository fingerprints.
|
|
10
|
+
- Repository indexing now skips unchanged repositories unless `--force` is supplied and reports indexed/skipped counts.
|
|
11
|
+
- `service-flow --version` now matches package metadata for the 0.1.5 release.
|
|
12
|
+
|
|
13
|
+
## 0.1.4
|
|
14
|
+
|
|
15
|
+
- Resolved helper-returned service bindings exported through named export lists, including aliased exports, while preserving helper-chain evidence.
|
|
16
|
+
- Parsed `cds.connect.to(alias, options)` as separate alias, destination, and service-path evidence so dynamic service paths can resolve with runtime variables.
|
|
17
|
+
- Improved repository discovery so valid workspace-root Git repositories no longer prevent nested repository discovery, and empty `.git` markers are ignored.
|
|
18
|
+
- Added explicit SQLite foreign-key constraints for fresh databases and recorded alias-expression evidence for service bindings.
|
|
19
|
+
- Documented clearer operator guidance for test-file hygiene, doctor severity, and list/trace selector semantics.
|
|
20
|
+
|
|
3
21
|
## 0.1.3
|
|
4
22
|
|
|
5
23
|
- Propagated imported helper-returned `cds.connect.to(...)` bindings to caller-local service variables with helper-chain evidence.
|
package/README.md
CHANGED
|
@@ -24,9 +24,11 @@ Index independent Git repositories, persist CAP/CDS facts in SQLite, resolve cro
|
|
|
24
24
|
- 🧩 **Static CAP/CDS indexing** — extracts services, actions, functions, events, handler classes, decorator metadata, handler registrations, generated constants, and package-level `cds.requires`
|
|
25
25
|
- 🔗 **Service-to-service linking** — resolves `cds.connect.to(...)`, `remote.send(...)`, `cds.services.*` style calls, helper package imports, dynamic candidates, and unresolved evidence into graph edges
|
|
26
26
|
- 🗄️ **SQLite-backed workspace cache** — stores deterministic facts under `.service-flow/service-flow.db` so large workspaces can be queried repeatedly without reparsing everything
|
|
27
|
-
- 🧠 **Dynamic edge support** — preserves parameterized destinations and service paths such as `svc_${objectCode}_process`, then lets
|
|
27
|
+
- 🧠 **Dynamic edge support** — preserves parameterized destinations and service paths such as `svc_${objectCode}_process`, then lets trace and graph commands apply runtime `--var key=value` values that can turn dynamic candidates into effective traversable operation edges
|
|
28
28
|
- 📊 **Multiple output modes** — renders human-readable tables, JSON for automation, and Mermaid diagrams for architecture docs
|
|
29
29
|
- 🩺 **Diagnostics-first workflow** — records parse/index issues and exposes them through `service-flow doctor` instead of hiding partial analysis
|
|
30
|
+
- 🧩 **CAP helper-aware binding evidence** — follows imported helpers exported directly or through named export lists and separates alias, destination, and service-path expressions for dynamic `cds.connect.to(alias, options)` calls
|
|
31
|
+
- 🧭 **Nested workspace discovery** — scans nested repositories even when the selected root is itself a valid Git repository, while ignoring empty `.git` placeholders
|
|
30
32
|
- 🔐 **Secret-aware summaries** — redacts sensitive keys in persisted summaries and CLI output while keeping useful source evidence
|
|
31
33
|
- 📦 **Standalone CLI & typed package** — ships as an npm CLI with TypeScript definitions for integration into other saptools workflows
|
|
32
34
|
|
|
@@ -45,7 +47,7 @@ npm install @saptools/service-flow
|
|
|
45
47
|
```
|
|
46
48
|
|
|
47
49
|
> [!NOTE]
|
|
48
|
-
> Requires **Node.js ≥ 20**. The analyzer is static: it reads files and package metadata, but it does not start CAP services, connect to SAP BTP, or execute application code.
|
|
50
|
+
> Requires **Node.js ≥ 20**. Version 0.1.5 uses a persistent SQLite driver (`node:sqlite` in supported Node builds) for bound parameters, transactions, WAL, busy timeouts, and read-only query commands. The analyzer is static: it reads files and package metadata, but it does not start CAP services, connect to SAP BTP, or execute application code.
|
|
49
51
|
|
|
50
52
|
---
|
|
51
53
|
|
|
@@ -71,7 +73,7 @@ service-flow graph --workspace /path/to/workspace --service /FacadeService --pat
|
|
|
71
73
|
service-flow doctor --workspace /path/to/workspace
|
|
72
74
|
```
|
|
73
75
|
|
|
74
|
-
After `init`, the workspace configuration and SQLite database live below the selected workspace by default. Run `index` whenever source changes
|
|
76
|
+
After `init`, the workspace configuration and SQLite database live below the selected workspace by default. Run `index` whenever source changes; unchanged repositories are skipped unless `--force` is supplied. Then run `link` to rebuild the graph edges used by `trace` and `graph`.
|
|
75
77
|
|
|
76
78
|
---
|
|
77
79
|
|
|
@@ -180,6 +182,7 @@ service-flow list repos --workspace /path/to/workspace
|
|
|
180
182
|
service-flow list services --workspace /path/to/workspace --repo facade-service
|
|
181
183
|
service-flow list operations --workspace /path/to/workspace --repo facade-service --service /FacadeService
|
|
182
184
|
service-flow list calls --workspace /path/to/workspace --repo facade-service --operation doWork
|
|
185
|
+
# `--operation` filters outgoing call paths/payloads; use trace/graph `--operation` for handler-origin traversal.
|
|
183
186
|
```
|
|
184
187
|
|
|
185
188
|
| Command | Description |
|
|
@@ -280,6 +283,10 @@ service-flow trace --workspace /path/to/workspace --repo facade-service --operat
|
|
|
280
283
|
|
|
281
284
|
When a concrete target exists after variable substitution, the trace shows both the parameterized evidence and the resolved match. When it does not, `service-flow` keeps the edge as a dynamic candidate or unresolved edge so the missing link remains visible.
|
|
282
285
|
|
|
286
|
+
Service-binding evidence keeps these fields distinct: service alias, alias expression, destination expression, service-path expression, operation-path expression, and runtime placeholders. This is important for common CAP helpers such as `cds.connect.to(`remote_${code}`, { credentials: { destination: `remote_${code}`, path: `/${entityType}ProcessService` } })`, where the alias is not the service path.
|
|
287
|
+
|
|
288
|
+
By default, production traces should be built from production source files. Keep generated credentials and local state out of git, and use explicit fixture/test workspaces when validating test-only mocked service clients so they do not pollute production graph interpretation.
|
|
289
|
+
|
|
283
290
|
---
|
|
284
291
|
|
|
285
292
|
## 📁 Workspace State
|
|
@@ -377,6 +384,7 @@ Run `service-flow index` after source, CDS, package metadata, or helper-package
|
|
|
377
384
|
<summary><b>Why is an expected call unresolved?</b></summary>
|
|
378
385
|
|
|
379
386
|
Check `service-flow doctor`, then inspect the facts with `service-flow list services`, `service-flow list operations`, and `service-flow list calls`. Dynamic destinations may need `--var key=value`, and custom wrappers may need new parser support.
|
|
387
|
+
Default doctor output is intended to focus on actionable indexing or trace-impacting issues; use `--strict` when you need exhaustive model-shape diagnostics for entity-only or extension-heavy CDS models.
|
|
380
388
|
|
|
381
389
|
</details>
|
|
382
390
|
|
package/TECHNICAL-NOTE.md
CHANGED
|
@@ -1,7 +1,21 @@
|
|
|
1
|
-
# Service Flow 0.1.
|
|
1
|
+
# Service Flow 0.1.5 Resolution Notes
|
|
2
2
|
|
|
3
3
|
- Imported helper bindings: TypeScript imports are resolved for relative modules. When a caller assigns `const client = await connectToService()`, the analyzer follows the imported symbol to an exported helper that returns `cds.connect.to(...)` and persists caller-variable evidence plus the helper source/export chain.
|
|
4
4
|
- Candidate ranking: operation-path matches start as weak candidates. A resolved operation edge requires a strong signal such as exact service path, CDS alias/destination context, or explicit dynamic variable overrides. Otherwise candidates are preserved in edge evidence as ambiguous or unresolved.
|
|
5
5
|
- Edge states: `REMOTE_CALL_RESOLVES_TO_OPERATION` is used only above the resolution threshold; `DYNAMIC_EDGE_CANDIDATE` preserves runtime-dependent service paths/destinations; `UNRESOLVED_EDGE` carries candidate counts and reasons when static evidence is insufficient.
|
|
6
6
|
- Trace cycle safety: trace queues carry repository IDs, visited scope keys are independent of depth, graph edge IDs are emitted once, and revisiting an already-seen downstream operation scope creates a cycle marker instead of recursive expansion.
|
|
7
|
-
- SQLite reliability: the package uses
|
|
7
|
+
- SQLite reliability: the package uses a persistent SQLite connection per opened database, bound parameters, transactions, WAL, busy timeouts, read-only openings for query commands, and connection-local foreign-key enforcement. Native driver loading failures produce an actionable startup error before output rendering.
|
|
8
|
+
|
|
9
|
+
## 0.1.4 trace-correctness additions
|
|
10
|
+
|
|
11
|
+
- Helper exports are normalized through a public-to-local export map, so `export { helper }` and `export { helper as publicHelper }` both resolve to the local declaration that contains the `cds.connect.to(...)` call.
|
|
12
|
+
- Two-argument CAP connections keep alias expressions distinct from `credentials.destination` and `credentials.path` / `credentials.servicePath`; dynamic placeholders from all three fields are retained for later `--var` substitution.
|
|
13
|
+
- Repository discovery validates `.git` markers using `HEAD`, `config`, or gitfile `gitdir:` content and keeps scanning children so outer workspaces can contain many nested repositories.
|
|
14
|
+
- Fresh SQLite stores now declare core parent/child foreign keys with cascading cleanup for repository-owned facts.
|
|
15
|
+
|
|
16
|
+
## 0.1.5 hardening additions
|
|
17
|
+
|
|
18
|
+
- Runtime variables are applied to alias, destination, service path, and operation path evidence. Trace/graph then perform an effective in-memory resolution requiring both operation-path compatibility and an exact service-path signal.
|
|
19
|
+
- Edge evidence and target operation provenance are separate: call file/line and helper chains stay on the edge, while operation nodes are loaded from CDS operation/service/repository rows.
|
|
20
|
+
- The linker stores explicit edge status categories and summary counts. Valid DB, event, and external terminals keep `unresolved_reason` null.
|
|
21
|
+
- Repository-level fingerprints include source paths/hashes, package dependencies, and analyzer schema version. Unchanged repositories are skipped unless `--force` is used.
|