@codependix/boundaries 0.0.3
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/LICENSE +21 -0
- package/README.md +748 -0
- package/dist/src/index.d.ts +736 -0
- package/dist/src/index.js +509 -0
- package/package.json +65 -0
package/README.md
ADDED
|
@@ -0,0 +1,748 @@
|
|
|
1
|
+
# π§ Codependix Boundaries
|
|
2
|
+
|
|
3
|
+
**Evaluates declared rules against a graph codependix already built, and reports the edges and cycles that break them.**
|
|
4
|
+
|
|
5
|
+
Codependix draws graphs at three levels and says nothing about whether their
|
|
6
|
+
shape is allowed. This turns it from a documentation tool into a gate, at all
|
|
7
|
+
three levels β Nx project edges, NestJS module edges, and file-level import
|
|
8
|
+
edges, judged separately per language even though TypeScript and Python are
|
|
9
|
+
exported together as one `fileImports` graph type.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
codependix map --check boundaries
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Why not an ESLint rule
|
|
16
|
+
|
|
17
|
+
`@nx/enforce-module-boundaries` reads import statements, one file at a time.
|
|
18
|
+
Three facts it structurally cannot see:
|
|
19
|
+
|
|
20
|
+
1. **Implicit edges.** An Nx `implicitDependencies` entry creates a
|
|
21
|
+
project-graph edge with no import statement to flag. `NeighborhoodEdge`
|
|
22
|
+
already carries `implicit`, so codependix holds a fact the lint rule has no
|
|
23
|
+
way to reach.
|
|
24
|
+
2. **A NestJS module edge is a container fact, not a source fact.**
|
|
25
|
+
`NestjsProjectService.exploreProject` reports what the container resolved,
|
|
26
|
+
so a dynamic module, a `forRootAsync`, or a conditionally composed import
|
|
27
|
+
produces an edge no `import` statement expresses.
|
|
28
|
+
3. **A rule can be about the graph rather than the edge.** A cycle, or a
|
|
29
|
+
project's dependents, is a statement about a shape, and a rule that sees
|
|
30
|
+
one file at a time cannot make one.
|
|
31
|
+
|
|
32
|
+
What this deliberately does **not** replace: the layered `depConstraints`
|
|
33
|
+
graph in
|
|
34
|
+
[`configuration/eslint.config.ts`](../../configuration/eslint.config.ts), which
|
|
35
|
+
reports at the import site with a line number, and `dependency-cruiser`'s
|
|
36
|
+
`no-circular`, which is already this repository's file-cycle gate.
|
|
37
|
+
|
|
38
|
+
The two were checked against each other rather than assumed equivalent. All 32
|
|
39
|
+
of this repository's `depConstraints` translate mechanically β
|
|
40
|
+
`onlyDependOnLibsWithTags` is an `allow` rule, `notDependOnLibsWithTags` is a
|
|
41
|
+
`forbid` rule, and an empty `onlyDependOnLibsWithTags` is a `forbid` reaching
|
|
42
|
+
everything β and with `edges: { implicit: false }` all 32 pass, exactly as
|
|
43
|
+
ESLint reports them. Without that narrowing one more edge is reported:
|
|
44
|
+
`conformetry-examples β conformetry-cli`, declared by an `implicitDependencies`
|
|
45
|
+
entry with no import statement behind it. Its own `depConstraint` comment says
|
|
46
|
+
that dependency should not exist, and ESLint has nothing to flag. Whether that
|
|
47
|
+
is a finding or a false positive is the question `edges` exists to let a rule
|
|
48
|
+
answer.
|
|
49
|
+
|
|
50
|
+
## The rule model
|
|
51
|
+
|
|
52
|
+
Rules are declared in `codependix.config.ts`, keyed by the graph level that
|
|
53
|
+
judges them β `nestjsModules`, `nxProjects`, and `fileImports`, which nests by
|
|
54
|
+
language as `{ typescript, python }` since no edge ever crosses the two. A
|
|
55
|
+
level declaring no rule is never built at all, which is what keeps the gate
|
|
56
|
+
affordable: judging the NestJS level means booting every container in
|
|
57
|
+
preview mode.
|
|
58
|
+
|
|
59
|
+
Two shapes and three kinds β an access rule, written as `from`/`to` with the
|
|
60
|
+
verdict running one way or the other, and an `acyclic` rule scoped by `nodes`:
|
|
61
|
+
|
|
62
|
+
| Kind | Reports |
|
|
63
|
+
| ---- | ------- |
|
|
64
|
+
| `forbid` | An edge whose source matches `from` and whose target matches `to` |
|
|
65
|
+
| `allow` | An edge leaving `from` for anywhere `to` does not claim |
|
|
66
|
+
| `acyclic` | A cycle among the nodes `nodes` selects, defaulting to every node |
|
|
67
|
+
|
|
68
|
+
An access rule may also narrow **which edges** it judges, rather than which
|
|
69
|
+
nodes it selects:
|
|
70
|
+
|
|
71
|
+
| `edges` | Judges |
|
|
72
|
+
| ------- | ------ |
|
|
73
|
+
| unset | every edge β the stricter reading, and the right default for a rule about what a project may _depend on_ |
|
|
74
|
+
| `{ implicit: false }` | only edges backed by an import statement β exactly what an `@nx/enforce-module-boundaries` `depConstraint` sees |
|
|
75
|
+
| `{ implicit: true }` | only edges an `implicitDependencies` entry declares and no import backs |
|
|
76
|
+
|
|
77
|
+
Only the Nx level draws an implicit edge; every other level's edges are read as
|
|
78
|
+
explicit.
|
|
79
|
+
|
|
80
|
+
Each rule carries a `name` and, optionally, a `message` saying why it exists.
|
|
81
|
+
The message is **appended** to the generated sentence rather than replacing
|
|
82
|
+
it, so no wording a configuration chooses can cost a report the rule that
|
|
83
|
+
fired and both ends of what it fired on.
|
|
84
|
+
|
|
85
|
+
## Selectors
|
|
86
|
+
|
|
87
|
+
One node shape covers three vocabularies, and every field is a list of globs
|
|
88
|
+
matched with `path.matchesGlob`:
|
|
89
|
+
|
|
90
|
+
| Field | Matches | Available at |
|
|
91
|
+
| ----- | ------- | ------------ |
|
|
92
|
+
| `id` | The node's identifier β a project name, a file path, or a module class name | every level |
|
|
93
|
+
| `path` | A workspace-relative project root, or a project-relative file path | `nxProjects`, `fileImports.typescript`, `fileImports.python` |
|
|
94
|
+
| `project` | The Nx project a node belongs to | `nxProjects`, `fileImports.typescript`, `fileImports.python` |
|
|
95
|
+
| `tags` | The node's Nx tags; one tag matching is enough | `nxProjects` |
|
|
96
|
+
|
|
97
|
+
Every field a selector states must match β the fields narrow each other.
|
|
98
|
+
Within one field, one glob matching is enough. A selector naming a field its
|
|
99
|
+
level does not carry matches **nothing** rather than everything: a `path` rule
|
|
100
|
+
evaluated against a NestJS module graph, which carries no file paths, selects
|
|
101
|
+
no module instead of silently selecting all of them. A selector stating no
|
|
102
|
+
field at all is refused by the configuration schema, since it reads exactly
|
|
103
|
+
like a typo.
|
|
104
|
+
|
|
105
|
+
## The two halves, and the one seam between them
|
|
106
|
+
|
|
107
|
+
`src/modules/boundaries/` evaluates rules and knows nothing about workspaces: a
|
|
108
|
+
`BoundaryGraph` and a list of rules go in, and violations come out.
|
|
109
|
+
`src/modules/boundary-check/` is what turns a real workspace into those graphs
|
|
110
|
+
β one adapter per level, plus the orchestration around them.
|
|
111
|
+
|
|
112
|
+
`BoundaryGraph` is the seam, and it is deliberately not any of the four real
|
|
113
|
+
graph types. Each adapter flattens a `Neighborhood`, a `NestjsModuleGraph`, or
|
|
114
|
+
an import graph into it, so rule evaluation never sees `@nx/devkit`,
|
|
115
|
+
`@nestjs/core`, or `typescript` and could be lifted out again without
|
|
116
|
+
touching a rule.
|
|
117
|
+
|
|
118
|
+
`BoundaryCheckService.run` walks the four levels in `BOUNDARY_LEVEL_ORDER` β
|
|
119
|
+
cheapest first β and **skips any level with no declared rules before building
|
|
120
|
+
anything**. That is what keeps the gate affordable: judging the NestJS level
|
|
121
|
+
means booting every container in preview mode, and judging the TypeScript level
|
|
122
|
+
means building a `ts.Program` per project. A workspace declaring only Nx rules
|
|
123
|
+
pays for neither. Each level also isolates one project's failure to that
|
|
124
|
+
project, so a container that will not boot is collected as a
|
|
125
|
+
`BoundaryCheckFailure` while every other project is still judged.
|
|
126
|
+
|
|
127
|
+
Nothing here depends on `@codependix/cli` β the host calls in, never the
|
|
128
|
+
reverse β and a rule in `configuration/codependix.config.ts` says so, so the
|
|
129
|
+
two cannot close a cycle.
|
|
130
|
+
|
|
131
|
+
## Test
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
nx run codependix-boundaries:vitest
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## π Conformetry
|
|
138
|
+
|
|
139
|
+
This project was generated from the [nestjs-service-project](../../configuration/conformetry-templates/nestjs-service-project) conformetry template.
|
|
140
|
+
|
|
141
|
+
## πΈοΈ Codependix
|
|
142
|
+
|
|
143
|
+
Dependency graphs exported by [codependix](https://github.com/Organizzolini/codebase/tree/main/packages/ic-suite/codependix/codependix-cli), regenerated by `nx run codebase:codependix:write`.
|
|
144
|
+
|
|
145
|
+
### Nx Neighborhood
|
|
146
|
+
|
|
147
|
+
<!-- codependix:start name="codependix-nx-projects" -->
|
|
148
|
+
```mermaid
|
|
149
|
+
graph LR
|
|
150
|
+
codependix_boundaries["codependix-boundaries"]
|
|
151
|
+
codependix_cli["codependix-cli"]
|
|
152
|
+
codependix_configuration["codependix-configuration"]
|
|
153
|
+
codependix_core["codependix-core"]
|
|
154
|
+
codependix_examples["codependix-examples"]
|
|
155
|
+
codependix_file_imports["codependix-file-imports"]
|
|
156
|
+
codependix_nestjs_modules["codependix-nestjs-modules"]
|
|
157
|
+
codependix_nx_projects["codependix-nx-projects"]
|
|
158
|
+
codependix_output["codependix-output"]
|
|
159
|
+
codependix_boundaries --> codependix_configuration
|
|
160
|
+
codependix_boundaries --> codependix_core
|
|
161
|
+
codependix_boundaries --> codependix_file_imports
|
|
162
|
+
codependix_boundaries --> codependix_nestjs_modules
|
|
163
|
+
codependix_boundaries --> codependix_nx_projects
|
|
164
|
+
codependix_cli --> codependix_boundaries
|
|
165
|
+
codependix_examples --> codependix_boundaries
|
|
166
|
+
codependix_output --> codependix_boundaries
|
|
167
|
+
classDef subject fill:#7c3aed,color:#fff,stroke:#4c1d95,stroke-width:2px
|
|
168
|
+
class codependix_boundaries subject
|
|
169
|
+
```
|
|
170
|
+
<!-- codependix:end name="codependix-nx-projects" -->
|
|
171
|
+
|
|
172
|
+
### NestJS Module Graph
|
|
173
|
+
|
|
174
|
+
<!-- codependix:start name="codependix-nestjs-modules" -->
|
|
175
|
+
```mermaid
|
|
176
|
+
flowchart LR
|
|
177
|
+
BoundariesModule
|
|
178
|
+
BoundaryCheckModule
|
|
179
|
+
ConfigurationModule
|
|
180
|
+
InputModule
|
|
181
|
+
LoggerModule([LoggerModule])
|
|
182
|
+
ModuleGraphModule
|
|
183
|
+
NeighborhoodModule
|
|
184
|
+
NestjsProjectModule
|
|
185
|
+
OverrideResolutionModule
|
|
186
|
+
PythonModule
|
|
187
|
+
RunContextModule
|
|
188
|
+
TypescriptModule
|
|
189
|
+
WorkspaceGraphModule
|
|
190
|
+
BoundaryCheckModule --> BoundariesModule
|
|
191
|
+
BoundaryCheckModule --> ModuleGraphModule
|
|
192
|
+
BoundaryCheckModule --> NestjsProjectModule
|
|
193
|
+
BoundaryCheckModule --> PythonModule
|
|
194
|
+
BoundaryCheckModule --> TypescriptModule
|
|
195
|
+
BoundaryCheckModule --> WorkspaceGraphModule
|
|
196
|
+
ConfigurationModule --> InputModule
|
|
197
|
+
ConfigurationModule --> OverrideResolutionModule
|
|
198
|
+
RunContextModule --> ConfigurationModule
|
|
199
|
+
RunContextModule --> NeighborhoodModule
|
|
200
|
+
WorkspaceGraphModule --> NeighborhoodModule
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
_Rounded modules are global: every module can inject them, so their edges are left out._
|
|
204
|
+
<!-- codependix:end name="codependix-nestjs-modules" -->
|
|
205
|
+
|
|
206
|
+
### File Imports
|
|
207
|
+
|
|
208
|
+
<!-- codependix:start name="codependix-file-imports" -->
|
|
209
|
+
```mermaid
|
|
210
|
+
graph LR
|
|
211
|
+
file_callidescope_config_ts["callidescope.config.ts"]
|
|
212
|
+
file_codependix_config_ts["codependix.config.ts"]
|
|
213
|
+
file_codometer_config_ts["codometer.config.ts"]
|
|
214
|
+
file_eslint_config_ts["eslint.config.ts"]
|
|
215
|
+
file_src_index_ts["src/index.ts"]
|
|
216
|
+
file_src_modules_boundaries_boundaries_constants_ts["src/modules/boundaries/boundaries.constants.ts"]
|
|
217
|
+
file_src_modules_boundaries_boundaries_module_ts["src/modules/boundaries/boundaries.module.ts"]
|
|
218
|
+
file_src_modules_boundaries_boundaries_module_unit_test_ts["src/modules/boundaries/boundaries.module.unit.test.ts"]
|
|
219
|
+
file_src_modules_boundaries_boundaries_service_ts["src/modules/boundaries/boundaries.service.ts"]
|
|
220
|
+
file_src_modules_boundaries_boundaries_service_unit_test_ts["src/modules/boundaries/boundaries.service.unit.test.ts"]
|
|
221
|
+
file_src_modules_boundaries_boundaries_types_ts["src/modules/boundaries/boundaries.types.ts"]
|
|
222
|
+
file_src_modules_boundaries_boundary_cycles_service_ts["src/modules/boundaries/boundary-cycles.service.ts"]
|
|
223
|
+
file_src_modules_boundaries_boundary_cycles_service_unit_test_ts["src/modules/boundaries/boundary-cycles.service.unit.test.ts"]
|
|
224
|
+
file_src_modules_boundaries_boundary_report_service_ts["src/modules/boundaries/boundary-report.service.ts"]
|
|
225
|
+
file_src_modules_boundaries_boundary_report_service_unit_test_ts["src/modules/boundaries/boundary-report.service.unit.test.ts"]
|
|
226
|
+
file_src_modules_boundaries_boundary_selector_service_ts["src/modules/boundaries/boundary-selector.service.ts"]
|
|
227
|
+
file_src_modules_boundaries_boundary_selector_service_unit_test_ts["src/modules/boundaries/boundary-selector.service.unit.test.ts"]
|
|
228
|
+
file_src_modules_boundary_check_boundary_check_constants_ts["src/modules/boundary-check/boundary-check.constants.ts"]
|
|
229
|
+
file_src_modules_boundary_check_boundary_check_module_ts["src/modules/boundary-check/boundary-check.module.ts"]
|
|
230
|
+
file_src_modules_boundary_check_boundary_check_module_unit_test_ts["src/modules/boundary-check/boundary-check.module.unit.test.ts"]
|
|
231
|
+
file_src_modules_boundary_check_boundary_check_service_ts["src/modules/boundary-check/boundary-check.service.ts"]
|
|
232
|
+
file_src_modules_boundary_check_boundary_check_service_unit_test_ts["src/modules/boundary-check/boundary-check.service.unit.test.ts"]
|
|
233
|
+
file_src_modules_boundary_check_boundary_check_types_ts["src/modules/boundary-check/boundary-check.types.ts"]
|
|
234
|
+
file_src_modules_boundary_check_boundary_graph_service_ts["src/modules/boundary-check/boundary-graph.service.ts"]
|
|
235
|
+
file_src_modules_boundary_check_boundary_graph_service_unit_test_ts["src/modules/boundary-check/boundary-graph.service.unit.test.ts"]
|
|
236
|
+
file_src_modules_run_context_run_context_constants_ts["src/modules/run-context/run-context.constants.ts"]
|
|
237
|
+
file_src_modules_run_context_run_context_module_ts["src/modules/run-context/run-context.module.ts"]
|
|
238
|
+
file_src_modules_run_context_run_context_module_unit_test_ts["src/modules/run-context/run-context.module.unit.test.ts"]
|
|
239
|
+
file_src_modules_run_context_run_context_service_ts["src/modules/run-context/run-context.service.ts"]
|
|
240
|
+
file_src_modules_run_context_run_context_service_unit_test_ts["src/modules/run-context/run-context.service.unit.test.ts"]
|
|
241
|
+
file_src_modules_run_context_run_context_types_ts["src/modules/run-context/run-context.types.ts"]
|
|
242
|
+
file_testing_mocks_ts["testing/mocks.ts"]
|
|
243
|
+
file_testing_setup_ts["testing/setup.ts"]
|
|
244
|
+
file_vite_config_ts["vite.config.ts"]
|
|
245
|
+
file_vitest_config_ts["vitest.config.ts"]
|
|
246
|
+
file_src_modules_boundaries_boundaries_module_ts --> file_src_modules_boundaries_boundaries_service_ts
|
|
247
|
+
file_src_modules_boundaries_boundaries_module_ts --> file_src_modules_boundaries_boundary_cycles_service_ts
|
|
248
|
+
file_src_modules_boundaries_boundaries_module_ts --> file_src_modules_boundaries_boundary_report_service_ts
|
|
249
|
+
file_src_modules_boundaries_boundaries_module_ts --> file_src_modules_boundaries_boundary_selector_service_ts
|
|
250
|
+
file_src_modules_boundaries_boundaries_module_unit_test_ts --> file_src_modules_boundaries_boundaries_module_ts
|
|
251
|
+
file_src_modules_boundaries_boundaries_module_unit_test_ts --> file_src_modules_boundaries_boundaries_service_ts
|
|
252
|
+
file_src_modules_boundaries_boundaries_module_unit_test_ts --> file_src_modules_boundaries_boundary_cycles_service_ts
|
|
253
|
+
file_src_modules_boundaries_boundaries_module_unit_test_ts --> file_src_modules_boundaries_boundary_report_service_ts
|
|
254
|
+
file_src_modules_boundaries_boundaries_module_unit_test_ts --> file_src_modules_boundaries_boundary_selector_service_ts
|
|
255
|
+
file_src_modules_boundaries_boundaries_service_ts --> file_src_modules_boundaries_boundaries_constants_ts
|
|
256
|
+
file_src_modules_boundaries_boundaries_service_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
257
|
+
file_src_modules_boundaries_boundaries_service_ts --> file_src_modules_boundaries_boundary_cycles_service_ts
|
|
258
|
+
file_src_modules_boundaries_boundaries_service_ts --> file_src_modules_boundaries_boundary_selector_service_ts
|
|
259
|
+
file_src_modules_boundaries_boundaries_service_unit_test_ts --> file_src_modules_boundaries_boundaries_service_ts
|
|
260
|
+
file_src_modules_boundaries_boundaries_service_unit_test_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
261
|
+
file_src_modules_boundaries_boundaries_service_unit_test_ts --> file_src_modules_boundaries_boundary_cycles_service_ts
|
|
262
|
+
file_src_modules_boundaries_boundaries_service_unit_test_ts --> file_src_modules_boundaries_boundary_selector_service_ts
|
|
263
|
+
file_src_modules_boundaries_boundary_cycles_service_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
264
|
+
file_src_modules_boundaries_boundary_cycles_service_unit_test_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
265
|
+
file_src_modules_boundaries_boundary_cycles_service_unit_test_ts --> file_src_modules_boundaries_boundary_cycles_service_ts
|
|
266
|
+
file_src_modules_boundaries_boundary_report_service_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
267
|
+
file_src_modules_boundaries_boundary_report_service_unit_test_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
268
|
+
file_src_modules_boundaries_boundary_report_service_unit_test_ts --> file_src_modules_boundaries_boundary_report_service_ts
|
|
269
|
+
file_src_modules_boundaries_boundary_selector_service_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
270
|
+
file_src_modules_boundaries_boundary_selector_service_unit_test_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
271
|
+
file_src_modules_boundaries_boundary_selector_service_unit_test_ts --> file_src_modules_boundaries_boundary_selector_service_ts
|
|
272
|
+
file_src_modules_boundary_check_boundary_check_constants_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
273
|
+
file_src_modules_boundary_check_boundary_check_module_ts --> file_src_modules_boundaries_boundaries_module_ts
|
|
274
|
+
file_src_modules_boundary_check_boundary_check_module_ts --> file_src_modules_boundary_check_boundary_check_service_ts
|
|
275
|
+
file_src_modules_boundary_check_boundary_check_module_ts --> file_src_modules_boundary_check_boundary_graph_service_ts
|
|
276
|
+
file_src_modules_boundary_check_boundary_check_module_unit_test_ts --> file_src_modules_boundary_check_boundary_check_module_ts
|
|
277
|
+
file_src_modules_boundary_check_boundary_check_module_unit_test_ts --> file_src_modules_boundary_check_boundary_check_service_ts
|
|
278
|
+
file_src_modules_boundary_check_boundary_check_module_unit_test_ts --> file_src_modules_boundary_check_boundary_graph_service_ts
|
|
279
|
+
file_src_modules_boundary_check_boundary_check_service_ts --> file_src_modules_boundaries_boundaries_service_ts
|
|
280
|
+
file_src_modules_boundary_check_boundary_check_service_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
281
|
+
file_src_modules_boundary_check_boundary_check_service_ts --> file_src_modules_boundary_check_boundary_check_constants_ts
|
|
282
|
+
file_src_modules_boundary_check_boundary_check_service_ts --> file_src_modules_boundary_check_boundary_check_types_ts
|
|
283
|
+
file_src_modules_boundary_check_boundary_check_service_ts --> file_src_modules_boundary_check_boundary_graph_service_ts
|
|
284
|
+
file_src_modules_boundary_check_boundary_check_service_unit_test_ts --> file_src_modules_boundaries_boundaries_service_ts
|
|
285
|
+
file_src_modules_boundary_check_boundary_check_service_unit_test_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
286
|
+
file_src_modules_boundary_check_boundary_check_service_unit_test_ts --> file_src_modules_boundary_check_boundary_check_service_ts
|
|
287
|
+
file_src_modules_boundary_check_boundary_check_service_unit_test_ts --> file_src_modules_boundary_check_boundary_check_types_ts
|
|
288
|
+
file_src_modules_boundary_check_boundary_check_service_unit_test_ts --> file_src_modules_boundary_check_boundary_graph_service_ts
|
|
289
|
+
file_src_modules_boundary_check_boundary_check_types_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
290
|
+
file_src_modules_boundary_check_boundary_graph_service_ts --> file_src_modules_boundaries_boundaries_types_ts
|
|
291
|
+
file_src_modules_boundary_check_boundary_graph_service_unit_test_ts --> file_src_modules_boundary_check_boundary_graph_service_ts
|
|
292
|
+
file_src_modules_run_context_run_context_module_ts --> file_src_modules_run_context_run_context_service_ts
|
|
293
|
+
file_src_modules_run_context_run_context_module_unit_test_ts --> file_src_modules_run_context_run_context_module_ts
|
|
294
|
+
file_src_modules_run_context_run_context_module_unit_test_ts --> file_src_modules_run_context_run_context_service_ts
|
|
295
|
+
file_src_modules_run_context_run_context_service_ts --> file_src_modules_run_context_run_context_types_ts
|
|
296
|
+
file_src_modules_run_context_run_context_service_unit_test_ts --> file_src_modules_run_context_run_context_service_ts
|
|
297
|
+
```
|
|
298
|
+
<!-- codependix:end name="codependix-file-imports" -->
|
|
299
|
+
|
|
300
|
+
<!-- codometer:start -->
|
|
301
|
+
|
|
302
|
+
## β²οΈ Codometer
|
|
303
|
+
|
|
304
|
+
### Project
|
|
305
|
+
|
|
306
|
+

|
|
307
|
+

|
|
308
|
+

|
|
309
|
+

|
|
310
|
+
|
|
311
|
+
### Measured Targets
|
|
312
|
+
|
|
313
|
+

|
|
314
|
+
|
|
315
|
+
### TypeScript
|
|
316
|
+
|
|
317
|
+

|
|
318
|
+

|
|
319
|
+

|
|
320
|
+

|
|
321
|
+

|
|
322
|
+

|
|
323
|
+

|
|
324
|
+
|
|
325
|
+
### JavaScript
|
|
326
|
+
|
|
327
|
+

|
|
328
|
+

|
|
329
|
+

|
|
330
|
+

|
|
331
|
+

|
|
332
|
+

|
|
333
|
+

|
|
334
|
+

|
|
335
|
+

|
|
336
|
+

|
|
337
|
+

|
|
338
|
+

|
|
339
|
+

|
|
340
|
+

|
|
341
|
+
|
|
342
|
+
### Python
|
|
343
|
+
|
|
344
|
+

|
|
345
|
+

|
|
346
|
+

|
|
347
|
+

|
|
348
|
+

|
|
349
|
+

|
|
350
|
+

|
|
351
|
+

|
|
352
|
+

|
|
353
|
+

|
|
354
|
+

|
|
355
|
+

|
|
356
|
+
|
|
357
|
+
### JSON
|
|
358
|
+
|
|
359
|
+

|
|
360
|
+

|
|
361
|
+

|
|
362
|
+

|
|
363
|
+

|
|
364
|
+

|
|
365
|
+

|
|
366
|
+

|
|
367
|
+

|
|
368
|
+

|
|
369
|
+

|
|
370
|
+

|
|
371
|
+
|
|
372
|
+
### YAML
|
|
373
|
+
|
|
374
|
+

|
|
375
|
+

|
|
376
|
+

|
|
377
|
+

|
|
378
|
+

|
|
379
|
+

|
|
380
|
+

|
|
381
|
+

|
|
382
|
+

|
|
383
|
+

|
|
384
|
+

|
|
385
|
+
|
|
386
|
+
### TOML
|
|
387
|
+
|
|
388
|
+

|
|
389
|
+

|
|
390
|
+

|
|
391
|
+

|
|
392
|
+

|
|
393
|
+

|
|
394
|
+

|
|
395
|
+
|
|
396
|
+
### Shell
|
|
397
|
+
|
|
398
|
+

|
|
399
|
+

|
|
400
|
+

|
|
401
|
+

|
|
402
|
+

|
|
403
|
+

|
|
404
|
+

|
|
405
|
+

|
|
406
|
+

|
|
407
|
+

|
|
408
|
+

|
|
409
|
+
|
|
410
|
+
### SQL
|
|
411
|
+
|
|
412
|
+

|
|
413
|
+

|
|
414
|
+

|
|
415
|
+

|
|
416
|
+

|
|
417
|
+

|
|
418
|
+

|
|
419
|
+

|
|
420
|
+

|
|
421
|
+

|
|
422
|
+

|
|
423
|
+
|
|
424
|
+
### HCL
|
|
425
|
+
|
|
426
|
+

|
|
427
|
+

|
|
428
|
+

|
|
429
|
+

|
|
430
|
+

|
|
431
|
+

|
|
432
|
+

|
|
433
|
+

|
|
434
|
+

|
|
435
|
+
|
|
436
|
+
### CSS
|
|
437
|
+
|
|
438
|
+

|
|
439
|
+

|
|
440
|
+

|
|
441
|
+

|
|
442
|
+

|
|
443
|
+

|
|
444
|
+

|
|
445
|
+

|
|
446
|
+

|
|
447
|
+
|
|
448
|
+
### Conventions
|
|
449
|
+
|
|
450
|
+

|
|
451
|
+

|
|
452
|
+

|
|
453
|
+

|
|
454
|
+

|
|
455
|
+

|
|
456
|
+

|
|
457
|
+

|
|
458
|
+

|
|
459
|
+

|
|
460
|
+

|
|
461
|
+

|
|
462
|
+

|
|
463
|
+

|
|
464
|
+

|
|
465
|
+

|
|
466
|
+

|
|
467
|
+

|
|
468
|
+
|
|
469
|
+
### Jupyter
|
|
470
|
+
|
|
471
|
+

|
|
472
|
+

|
|
473
|
+

|
|
474
|
+

|
|
475
|
+

|
|
476
|
+

|
|
477
|
+

|
|
478
|
+

|
|
479
|
+

|
|
480
|
+

|
|
481
|
+

|
|
482
|
+

|
|
483
|
+

|
|
484
|
+

|
|
485
|
+

|
|
486
|
+

|
|
487
|
+

|
|
488
|
+

|
|
489
|
+

|
|
490
|
+

|
|
491
|
+
|
|
492
|
+
### Markdown
|
|
493
|
+
|
|
494
|
+

|
|
495
|
+

|
|
496
|
+

|
|
497
|
+

|
|
498
|
+

|
|
499
|
+

|
|
500
|
+

|
|
501
|
+

|
|
502
|
+

|
|
503
|
+

|
|
504
|
+

|
|
505
|
+

|
|
506
|
+

|
|
507
|
+

|
|
508
|
+

|
|
509
|
+

|
|
510
|
+

|
|
511
|
+

|
|
512
|
+

|
|
513
|
+

|
|
514
|
+
<!-- codometer:end -->
|
|
515
|
+
|
|
516
|
+
<!-- callidescope:start -->
|
|
517
|
+
|
|
518
|
+
## π Callidescope
|
|
519
|
+
|
|
520
|
+
Call stacks traced through `packages/ic-suite/codependix/codependix-boundaries`, deepest first. Each frame shows what it takes, what it returns, and what its documentation says.
|
|
521
|
+
|
|
522
|
+
| Measure | Value |
|
|
523
|
+
| --- | --- |
|
|
524
|
+
| Callables | 77 |
|
|
525
|
+
| Files | 23 |
|
|
526
|
+
| Calls traced | 83 |
|
|
527
|
+
| Call stacks | 7 |
|
|
528
|
+
| Deepest stack | 12 |
|
|
529
|
+
| Stacks through recursion | 0 |
|
|
530
|
+
| Unfollowable calls | 2 |
|
|
531
|
+
|
|
532
|
+
### Limits
|
|
533
|
+
|
|
534
|
+
What this project is judged against, as declared in its own `callidescope.config.ts`.
|
|
535
|
+
|
|
536
|
+
| Limit | Value |
|
|
537
|
+
| --- | --- |
|
|
538
|
+
| `maximumDepth` | 12 |
|
|
539
|
+
| `maximumBreadth` | 7 |
|
|
540
|
+
|
|
541
|
+
### Call stacks (depth)
|
|
542
|
+
|
|
543
|
+
**1. `BoundaryCheckService.nestjsModules`** β depth β₯ 12 Β· orphan-root
|
|
544
|
+
|
|
545
|
+
```text
|
|
546
|
+
π BoundaryCheckService.nestjsModules(levelArguments: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:145]
|
|
547
|
+
ββ> BoundaryCheckService.runNestjsLevel(args: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:158]
|
|
548
|
+
β³ Judges every `framework:nestjs` project's module graph.
|
|
549
|
+
ββ> BoundaryCheckService.runProjectLevel(β¦): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:213]
|
|
550
|
+
β³ Judges every project at one level, isolating each project's failure.
|
|
551
|
+
ββ> BoundariesService.evaluate(args: EvaluateBoundariesArguments): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:222]
|
|
552
|
+
β³ Every violation one graph's rules report, in the order the rules were declared.
|
|
553
|
+
ββ> BoundariesService.flatMap(β¦)(this: undefined, rule: CodependixBoundaryRule): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:223]
|
|
554
|
+
ββ> BoundariesService.evaluateAcyclicRule(β¦): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:140]
|
|
555
|
+
β³ Reports every cycle an `acyclic` rule's selected nodes still form.
|
|
556
|
+
ββ> BoundarySelectorService.selectIds(β¦): Set<string> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:106]
|
|
557
|
+
β³ The ids of every node a selector claims.
|
|
558
|
+
ββ> BoundarySelectorService.filter(β¦)(node: BoundaryNode): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:116]
|
|
559
|
+
ββ> BoundarySelectorService.matches(node: BoundaryNode, selector: CodependixBoundarySelector): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:86]
|
|
560
|
+
β³ Whether a selector claims a node.
|
|
561
|
+
ββ> BoundarySelectorService.matchesTags(β¦): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:59]
|
|
562
|
+
β³ Whether a node carries a tag matching one of a list of globs.
|
|
563
|
+
ββ> BoundarySelectorService.some(β¦)(glob: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:71]
|
|
564
|
+
ββ> BoundarySelectorService.some(β¦)(tag: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:72]
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
**2. `BoundaryCheckService.python`** β depth β₯ 12 Β· orphan-root
|
|
568
|
+
|
|
569
|
+
```text
|
|
570
|
+
π BoundaryCheckService.python(levelArguments: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:148]
|
|
571
|
+
ββ> BoundaryCheckService.runPythonImportsLevel(args: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:237]
|
|
572
|
+
β³ Judges every `language:python` project's file-level import graph.
|
|
573
|
+
ββ> BoundaryCheckService.runProjectLevel(β¦): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:213]
|
|
574
|
+
β³ Judges every project at one level, isolating each project's failure.
|
|
575
|
+
ββ> BoundariesService.evaluate(args: EvaluateBoundariesArguments): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:222]
|
|
576
|
+
β³ Every violation one graph's rules report, in the order the rules were declared.
|
|
577
|
+
ββ> BoundariesService.flatMap(β¦)(this: undefined, rule: CodependixBoundaryRule): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:223]
|
|
578
|
+
ββ> BoundariesService.evaluateAcyclicRule(β¦): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:140]
|
|
579
|
+
β³ Reports every cycle an `acyclic` rule's selected nodes still form.
|
|
580
|
+
ββ> BoundarySelectorService.selectIds(β¦): Set<string> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:106]
|
|
581
|
+
β³ The ids of every node a selector claims.
|
|
582
|
+
ββ> BoundarySelectorService.filter(β¦)(node: BoundaryNode): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:116]
|
|
583
|
+
ββ> BoundarySelectorService.matches(node: BoundaryNode, selector: CodependixBoundarySelector): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:86]
|
|
584
|
+
β³ Whether a selector claims a node.
|
|
585
|
+
ββ> BoundarySelectorService.matchesTags(β¦): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:59]
|
|
586
|
+
β³ Whether a node carries a tag matching one of a list of globs.
|
|
587
|
+
ββ> BoundarySelectorService.some(β¦)(glob: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:71]
|
|
588
|
+
ββ> BoundarySelectorService.some(β¦)(tag: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:72]
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
**3. `BoundaryCheckService.typescript`** β depth β₯ 12 Β· orphan-root
|
|
592
|
+
|
|
593
|
+
```text
|
|
594
|
+
π BoundaryCheckService.typescript(levelArguments: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:150]
|
|
595
|
+
ββ> BoundaryCheckService.runTypescriptImportsLevel(args: LevelCheckArguments): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:253]
|
|
596
|
+
β³ Judges every TypeScript project's file-level import graph.
|
|
597
|
+
ββ> BoundaryCheckService.runProjectLevel(β¦): Promise<BoundaryCheckOutcome> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:213]
|
|
598
|
+
β³ Judges every project at one level, isolating each project's failure.
|
|
599
|
+
ββ> BoundariesService.evaluate(args: EvaluateBoundariesArguments): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:222]
|
|
600
|
+
β³ Every violation one graph's rules report, in the order the rules were declared.
|
|
601
|
+
ββ> BoundariesService.flatMap(β¦)(this: undefined, rule: CodependixBoundaryRule): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:223]
|
|
602
|
+
ββ> BoundariesService.evaluateAcyclicRule(β¦): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:140]
|
|
603
|
+
β³ Reports every cycle an `acyclic` rule's selected nodes still form.
|
|
604
|
+
ββ> BoundarySelectorService.selectIds(β¦): Set<string> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:106]
|
|
605
|
+
β³ The ids of every node a selector claims.
|
|
606
|
+
ββ> BoundarySelectorService.filter(β¦)(node: BoundaryNode): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:116]
|
|
607
|
+
ββ> BoundarySelectorService.matches(node: BoundaryNode, selector: CodependixBoundarySelector): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:86]
|
|
608
|
+
β³ Whether a selector claims a node.
|
|
609
|
+
ββ> BoundarySelectorService.matchesTags(β¦): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:59]
|
|
610
|
+
β³ Whether a node carries a tag matching one of a list of globs.
|
|
611
|
+
ββ> BoundarySelectorService.some(β¦)(glob: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:71]
|
|
612
|
+
ββ> BoundarySelectorService.some(β¦)(tag: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:72]
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
<details>
|
|
616
|
+
<summary>4 more call stacks</summary>
|
|
617
|
+
|
|
618
|
+
**4. `BoundaryCheckService.nxProjects`** β depth 11 Β· orphan-root
|
|
619
|
+
|
|
620
|
+
```text
|
|
621
|
+
π BoundaryCheckService.nxProjects(levelArguments: LevelCheckArguments): BoundaryCheckOutcome [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:147]
|
|
622
|
+
ββ> BoundaryCheckService.runNxLevel(args: LevelCheckArguments): BoundaryCheckOutcome [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:177]
|
|
623
|
+
β³ Judges the whole-workspace Nx project graph.
|
|
624
|
+
ββ> BoundariesService.evaluate(args: EvaluateBoundariesArguments): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:222]
|
|
625
|
+
β³ Every violation one graph's rules report, in the order the rules were declared.
|
|
626
|
+
ββ> BoundariesService.flatMap(β¦)(this: undefined, rule: CodependixBoundaryRule): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:223]
|
|
627
|
+
ββ> BoundariesService.evaluateAcyclicRule(β¦): BoundaryViolation[] [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:140]
|
|
628
|
+
β³ Reports every cycle an `acyclic` rule's selected nodes still form.
|
|
629
|
+
ββ> BoundarySelectorService.selectIds(β¦): Set<string> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:106]
|
|
630
|
+
β³ The ids of every node a selector claims.
|
|
631
|
+
ββ> BoundarySelectorService.filter(β¦)(node: BoundaryNode): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:116]
|
|
632
|
+
ββ> BoundarySelectorService.matches(node: BoundaryNode, selector: CodependixBoundarySelector): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:86]
|
|
633
|
+
β³ Whether a selector claims a node.
|
|
634
|
+
ββ> BoundarySelectorService.matchesTags(β¦): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:59]
|
|
635
|
+
β³ Whether a node carries a tag matching one of a list of globs.
|
|
636
|
+
ββ> BoundarySelectorService.some(β¦)(glob: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:71]
|
|
637
|
+
ββ> BoundarySelectorService.some(β¦)(tag: string): boolean [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:72]
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
**5. `BoundaryCheckService.buildGraph`** β depth 9 Β· orphan-root
|
|
641
|
+
|
|
642
|
+
```text
|
|
643
|
+
π BoundaryCheckService.buildGraph(project: PythonProject): BoundaryGraph [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:241]
|
|
644
|
+
ββ> PythonService.buildGraph(project: PythonProject): PythonImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python.service.ts:39]
|
|
645
|
+
β³ Builds a Python project's internal file-level import Graph.
|
|
646
|
+
ββ> PythonImportGraphService.buildGraph(project: PythonProject): PythonImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:180]
|
|
647
|
+
β³ Builds a Python project's internal file-level import Graph.
|
|
648
|
+
ββ> PythonImportGraphService.flatMap(β¦)(this: undefined, sourceFileName: string): PythonImportGraphEdge[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:185]
|
|
649
|
+
ββ> PythonImportGraphService.collectEdgesForFile(β¦): PythonImportGraphEdge[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-graph.service.ts:64]
|
|
650
|
+
β³ Collects every internal import edge one source file declares.
|
|
651
|
+
ββ> PythonImportParserService.parseImportSpecifiers(source: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:158]
|
|
652
|
+
β³ Parses every module-level import statement in a Python source file.
|
|
653
|
+
ββ> PythonImportParserService.parseStatement(statement: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:126]
|
|
654
|
+
β³ Parses one joined statement into the module(s) it names.
|
|
655
|
+
ββ> PythonImportParserService.parseImportStatement(statement: string): PythonImportSpecifier[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:105]
|
|
656
|
+
β³ Parses a joined `import <specifiers>` statement.
|
|
657
|
+
ββ> PythonImportParserService.map(β¦)(modulePath: string): { level: number; modulePath: string; } [packages/ic-suite/codependix/codependix-file-imports/src/modules/python/python-import-parser.service.ts:122]
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
**6. `BoundaryCheckService.buildGraph`** β depth β₯ 7 Β· orphan-root
|
|
661
|
+
|
|
662
|
+
```text
|
|
663
|
+
π BoundaryCheckService.buildGraph(project: TypescriptProject): BoundaryGraph [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:257]
|
|
664
|
+
ββ> TypescriptService.buildGraph(projectProgram: TypescriptProjectProgram): TypescriptImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript.service.ts:44]
|
|
665
|
+
β³ Builds a project's internal file-level import Graph from its program.
|
|
666
|
+
ββ> TypescriptImportGraphService.buildGraph(projectProgram: TypescriptProjectProgram): TypescriptImportGraph [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript-import-graph.service.ts:185]
|
|
667
|
+
β³ Builds a project's internal file-level import Graph from its program.
|
|
668
|
+
ββ> TypescriptImportGraphService.listOwnedSourceFileNames(projectProgram: TypescriptProjectProgram): string[] [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript-import-graph.service.ts:122]
|
|
669
|
+
β³ Lists a program's own source files, excluding declaration files. `program.getRootFileNames()` is the same file listβ¦
|
|
670
|
+
ββ> TypescriptImportGraphService.resolveOwnedFileNames(projectProgram: TypescriptProjectProgram): Set<string> [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript-import-graph.service.ts:156]
|
|
671
|
+
β³ Resolves the real, absolute file names a program owns.
|
|
672
|
+
ββ> TypescriptImportGraphService.map(β¦)(fileName: string): string [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript-import-graph.service.ts:162]
|
|
673
|
+
ββ> TypescriptProjectService.toRealPath(filePath: string): string [packages/ic-suite/codependix/codependix-file-imports/src/modules/typescript/typescript-project.service.ts:122]
|
|
674
|
+
β³ Resolves a path through symlinks, which is how pnpm workspaces link.
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
**7. `BoundaryCheckService.buildGraph`** β depth β₯ 6 Β· orphan-root
|
|
678
|
+
|
|
679
|
+
```text
|
|
680
|
+
π BoundaryCheckService.buildGraph(project: NestjsProject): Promise<BoundaryGraph> [packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:162]
|
|
681
|
+
ββ> NestjsProjectService.exploreProject(project: NestjsProject): Promise<NestjsExploredModule[]> [packages/ic-suite/codependix/codependix-nestjs-modules/src/modules/nestjs-project/nestjs-project.service.ts:232]
|
|
682
|
+
β³ Explores a project's container in preview mode and returns its tree.
|
|
683
|
+
ββ> NestjsProjectService.buildSyntheticRootModule(project: NestjsProject): Promise<DynamicModule> [packages/ic-suite/codependix/codependix-nestjs-modules/src/modules/nestjs-project/nestjs-project.service.ts:59]
|
|
684
|
+
β³ Roots a package that bootstraps nothing in every module it defines.
|
|
685
|
+
ββ> NestjsProjectService.map(β¦)(file: string): Promise<Type<unknown>[]> [packages/ic-suite/codependix/codependix-nestjs-modules/src/modules/nestjs-project/nestjs-project.service.ts:66]
|
|
686
|
+
ββ> NestjsProjectService.loadModuleClasses(file: string): Promise<Type<unknown>[]> [packages/ic-suite/codependix/codependix-nestjs-modules/src/modules/nestjs-project/nestjs-project.service.ts:166]
|
|
687
|
+
β³ Imports a module file and returns every module class it exports.
|
|
688
|
+
ββ> NestjsProjectService.map(β¦)([, moduleClass]: [string, Type<unknown>]): Type<unknown> [packages/ic-suite/codependix/codependix-nestjs-modules/src/modules/nestjs-project/nestjs-project.service.ts:177]
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
</details>
|
|
692
|
+
|
|
693
|
+
### Breadth
|
|
694
|
+
|
|
695
|
+
| Callable | Breadth | Calls directly | Location |
|
|
696
|
+
| --- | --- | --- | --- |
|
|
697
|
+
| `RunContextService.build` | 7 | `ConfigurationService.loadConfiguration`, `NeighborhoodService.readProjectGraph`, `RunContextService.resolveProjectGraphPath`, `NeighborhoodService.readProjects`, `RunContextService.loadProjectConfigurations`, `RunContextService.resolveEnabledGraphTypes`, `RunContextService.selectProjects` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:139` |
|
|
698
|
+
| `BoundariesService.evaluateAccessRule` | 5 | `BoundariesService.indexNodes`, `BoundariesService.judgesEdge`, `BoundariesService.resolveNode`, `BoundarySelectorService.matches`, `BoundariesService.buildAccessViolation` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:107` |
|
|
699
|
+
| `BoundaryCheckService.run` | 5 | `BoundaryCheckService.graphTypeForLevel`, `BoundaryCheckService.rulesForLevel`, `BoundaryCheckService.runLevel`, `BoundaryCheckService.flatMap(β¦)`, `BoundaryCheckService.flatMap(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:284` |
|
|
700
|
+
|
|
701
|
+
<details>
|
|
702
|
+
<summary>40 more callables</summary>
|
|
703
|
+
|
|
704
|
+
| Callable | Breadth | Calls directly | Location |
|
|
705
|
+
| --- | --- | --- | --- |
|
|
706
|
+
| `BoundaryCheckService.runNxLevel` | 4 | `BoundaryGraphService.buildNxGraph`, `WorkspaceGraphService.buildWorkspaceGraph`, `BoundariesService.evaluate`, `BoundaryCheckService.collectProjectFailure` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:177` |
|
|
707
|
+
| `BoundarySelectorService.selectIds` | 3 | `BoundarySelectorService.map(β¦)`, `BoundarySelectorService.map(β¦)`, `BoundarySelectorService.filter(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:106` |
|
|
708
|
+
| `BoundariesService.evaluateAcyclicRule` | 3 | `BoundarySelectorService.selectIds`, `BoundaryCyclesService.findCycles`, `BoundariesService.map(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:140` |
|
|
709
|
+
| `BoundaryCheckService.buildGraph` | 3 | `BoundaryGraphService.buildNestjsGraph`, `ModuleGraphService.buildGraph`, `NestjsProjectService.exploreProject` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:162` |
|
|
710
|
+
| `BoundaryCheckService.buildGraph` | 3 | `BoundaryGraphService.buildTypescriptImportGraph`, `TypescriptService.buildGraph`, `TypescriptService.buildProgram` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:257` |
|
|
711
|
+
| `BoundaryCyclesService.findCycles` | 2 | `BoundaryCyclesService.buildAdjacency`, `BoundaryCyclesService.walk` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-cycles.service.ts:127` |
|
|
712
|
+
| `BoundarySelectorService.matches` | 2 | `BoundarySelectorService.matchesGlobs`, `BoundarySelectorService.matchesTags` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:86` |
|
|
713
|
+
| `BoundariesService.map(β¦)` | 2 | `BoundariesService.buildMessage`, `describeCycle` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:151` |
|
|
714
|
+
| `BoundariesService.flatMap(β¦)` | 2 | `BoundariesService.evaluateAcyclicRule`, `BoundariesService.evaluateAccessRule` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:223` |
|
|
715
|
+
| `BoundaryGraphService.buildNxGraph` | 2 | `BoundaryGraphService.map(β¦)`, `BoundaryGraphService.map(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:101` |
|
|
716
|
+
| `BoundaryCheckService.runNestjsLevel` | 2 | `BoundaryCheckService.runProjectLevel`, `NestjsProjectService.discoverProjects` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:158` |
|
|
717
|
+
| `BoundaryCheckService.runProjectLevel` | 2 | `BoundariesService.evaluate`, `BoundaryCheckService.collectProjectFailure` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:213` |
|
|
718
|
+
| `BoundaryCheckService.runPythonImportsLevel` | 2 | `BoundaryCheckService.runProjectLevel`, `PythonService.discoverProjects` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:237` |
|
|
719
|
+
| `BoundaryCheckService.buildGraph` | 2 | `BoundaryGraphService.buildPythonImportGraph`, `PythonService.buildGraph` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:241` |
|
|
720
|
+
| `BoundaryCheckService.runTypescriptImportsLevel` | 2 | `BoundaryCheckService.runProjectLevel`, `TypescriptService.discoverProjects` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:253` |
|
|
721
|
+
| `BoundaryCyclesService.recordCycle` | 1 | `BoundaryCyclesService.buildCycleKey` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-cycles.service.ts:73` |
|
|
722
|
+
| `BoundaryCyclesService.walk` | 1 | `BoundaryCyclesService.recordCycle` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-cycles.service.ts:91` |
|
|
723
|
+
| `BoundarySelectorService.matchesGlobs` | 1 | `BoundarySelectorService.some(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:37` |
|
|
724
|
+
| `BoundarySelectorService.matchesTags` | 1 | `BoundarySelectorService.some(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:59` |
|
|
725
|
+
| `BoundarySelectorService.some(β¦)` | 1 | `BoundarySelectorService.some(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:71` |
|
|
726
|
+
| `BoundarySelectorService.filter(β¦)` | 1 | `BoundarySelectorService.matches` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-selector.service.ts:116` |
|
|
727
|
+
| `BoundariesService.buildAccessViolation` | 1 | `BoundariesService.buildMessage` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:54` |
|
|
728
|
+
| `BoundariesService.indexNodes` | 1 | `BoundariesService.map(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:166` |
|
|
729
|
+
| `BoundariesService.evaluate` | 1 | `BoundariesService.flatMap(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundaries.service.ts:222` |
|
|
730
|
+
| `BoundaryReportService.renderSummary` | 1 | `BoundaryReportService.map(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-report.service.ts:36` |
|
|
731
|
+
| `BoundaryReportService.renderViolations` | 1 | `BoundaryReportService.map(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundaries/boundary-report.service.ts:56` |
|
|
732
|
+
| `BoundaryGraphService.buildFileNodes` | 1 | `BoundaryGraphService.map(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:45` |
|
|
733
|
+
| `BoundaryGraphService.buildNestjsGraph` | 1 | `BoundaryGraphService.map(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:77` |
|
|
734
|
+
| `BoundaryGraphService.map(β¦)` | 1 | `BoundaryGraphService.resolveProjectRoot` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:114` |
|
|
735
|
+
| `BoundaryGraphService.buildPythonImportGraph` | 1 | `BoundaryGraphService.buildFileNodes` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:128` |
|
|
736
|
+
| `BoundaryGraphService.buildTypescriptImportGraph` | 1 | `BoundaryGraphService.buildFileNodes` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-graph.service.ts:141` |
|
|
737
|
+
| `BoundaryCheckService.nestjsModules` | 1 | `BoundaryCheckService.runNestjsLevel` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:145` |
|
|
738
|
+
| `BoundaryCheckService.nxProjects` | 1 | `BoundaryCheckService.runNxLevel` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:147` |
|
|
739
|
+
| `BoundaryCheckService.python` | 1 | `BoundaryCheckService.runPythonImportsLevel` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:148` |
|
|
740
|
+
| `BoundaryCheckService.typescript` | 1 | `BoundaryCheckService.runTypescriptImportsLevel` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/boundary-check/boundary-check.service.ts:150` |
|
|
741
|
+
| `RunContextService.loadProjectConfigurations` | 1 | `RunContextService.map(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:52` |
|
|
742
|
+
| `RunContextService.map(β¦)` | 1 | `ConfigurationService.loadProjectConfiguration` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:57` |
|
|
743
|
+
| `RunContextService.resolveEnabledGraphTypes` | 1 | `RunContextService.filter(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:79` |
|
|
744
|
+
| `RunContextService.selectProjects` | 1 | `RunContextService.filter(β¦)` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:114` |
|
|
745
|
+
| `RunContextService.filter(β¦)` | 1 | `ConfigurationService.isProjectSelected` | `packages/ic-suite/codependix/codependix-boundaries/src/modules/run-context/run-context.service.ts:119` |
|
|
746
|
+
|
|
747
|
+
</details>
|
|
748
|
+
<!-- callidescope:end -->
|