@callidescope/configuration 0.0.0-stage → 0.0.4
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 +1068 -2
- package/dist/src/index.d.ts +1755 -0
- package/dist/src/index.js +900 -0
- package/package.json +63 -3
package/README.md
CHANGED
|
@@ -1,3 +1,1069 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 🔭 Callidescope Configuration
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Reads `callidescope.config.ts` and resolves the limits callidescope enforces.**
|
|
4
|
+
|
|
5
|
+
This package is the configuration reader for
|
|
6
|
+
[`@callidescope/cli`](../callidescope-cli/README.md). It finds a configuration
|
|
7
|
+
file, validates it, and fills in every field the file left out, so that no
|
|
8
|
+
analyzer has to know which options are optional.
|
|
9
|
+
|
|
10
|
+
It knows nothing about call graphs. What a threshold means, and which decorator
|
|
11
|
+
marks a stack root, live in the CLI. This package only answers "what did the repository ask for".
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install --save-dev @callidescope/configuration
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Configuration File
|
|
18
|
+
|
|
19
|
+
Any of `callidescope.config.{ts,mts,cts,js,mjs,cjs,json,jsonc}`, searched for
|
|
20
|
+
upward from the working directory. TypeScript is tried first, because that is
|
|
21
|
+
the form that gets type checking. A repository with no configuration file is
|
|
22
|
+
traced with the defaults rather than told to write one.
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import { type CallidescopeConfiguration } from "@callidescope/configuration";
|
|
26
|
+
|
|
27
|
+
const callidescopeConfiguration: CallidescopeConfiguration = {
|
|
28
|
+
excludeFrom: ["configuration/.callidescopeignore"],
|
|
29
|
+
limits: { maximumBreadth: 5, maximumDepth: 6 },
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export default callidescopeConfiguration;
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
That file is the **workspace** configuration, and every section below describes
|
|
36
|
+
it. A project may also configure itself, from a much smaller surface —
|
|
37
|
+
see [Project Configuration](#project-configuration).
|
|
38
|
+
|
|
39
|
+
## Limits
|
|
40
|
+
|
|
41
|
+
There are two, both per project, both gated. A limit the schema does not name is
|
|
42
|
+
refused rather than ignored, so a number nothing reads cannot sit in a file
|
|
43
|
+
looking as though it were in force.
|
|
44
|
+
|
|
45
|
+
| Limit | Default | Meaning |
|
|
46
|
+
| ----- | ------- | ------- |
|
|
47
|
+
| `maximumDepth` | `6` | Frames a call stack may hold, entry point inclusive |
|
|
48
|
+
| `maximumBreadth` | **none** | Callables one callable may call directly |
|
|
49
|
+
|
|
50
|
+
`maximumBreadth` is the one limit with no default — a project that wants it
|
|
51
|
+
gated has to declare its own measured number, since a workspace-wide guess
|
|
52
|
+
would either gate nothing or fail on the first callable that happens to be
|
|
53
|
+
widest. Every traced project now does: see
|
|
54
|
+
[Project Configuration](#project-configuration).
|
|
55
|
+
|
|
56
|
+
The **implementation-candidate cap** is deliberately not here. It decides where
|
|
57
|
+
structural interface resolution stops guessing rather than what a run judges, so
|
|
58
|
+
it is a constant in [`@callidescope/graph`](../callidescope-graph/README.md)
|
|
59
|
+
instead — see [the decision record](../../../../docs/adr/0006-narrow-callidescope-to-depth-and-breadth.md).
|
|
60
|
+
|
|
61
|
+
## Entry Points
|
|
62
|
+
|
|
63
|
+
A depth measurement is only as meaningful as its roots, so which callables count
|
|
64
|
+
as roots is configurable.
|
|
65
|
+
|
|
66
|
+
| Option | Default | Meaning |
|
|
67
|
+
| ------ | ------- | ------- |
|
|
68
|
+
| `addresses` | none | Callables named outright as roots, each `<file>#<qualified-name>` |
|
|
69
|
+
| `decorators` | 13 framework decorators | Decorators whose methods a framework invokes |
|
|
70
|
+
| `includeExportedFunctions` | `true` | Treat every `src/index.ts` export as a root |
|
|
71
|
+
| `includeOrphans` | `true` | Promote callables nothing in the repository calls |
|
|
72
|
+
| `includeTests` | `false` | Trace test files too |
|
|
73
|
+
|
|
74
|
+
`addresses` takes the same `<file>#<qualified-name>` form the `depth` and
|
|
75
|
+
`breadth` commands accept and every stack frame prints, so an address can be
|
|
76
|
+
copied out of a report straight into a configuration. A trailing `:<line>`
|
|
77
|
+
disambiguates a file holding two declarations under one qualified name.
|
|
78
|
+
Declared addresses are **additive**: the rules below keep running, orphan
|
|
79
|
+
promotion still catches whatever nobody named, and an address landing on a
|
|
80
|
+
callable a rule already rooted is one root rather than two. An address that
|
|
81
|
+
resolves to nothing, to more than one declaration, or to nothing parseable
|
|
82
|
+
fails the run — see [Refusals](#refusals).
|
|
83
|
+
|
|
84
|
+
`includeOrphans` is a safety net rather than a feature. Without it, a missing
|
|
85
|
+
entry-point rule silently removes whole subtrees from every measurement; with
|
|
86
|
+
it, they surface as orphan roots — which is itself worth knowing, since an
|
|
87
|
+
orphan is either dead code or a rule that needs adding.
|
|
88
|
+
|
|
89
|
+
## Exclusions
|
|
90
|
+
|
|
91
|
+
`exclude` globs are **additive** to the built-in defaults (`node_modules`,
|
|
92
|
+
`dist`, `coverage`, `output`, `.nx`, `.conformetry`), so a configuration naming
|
|
93
|
+
its own noise does not have to restate them.
|
|
94
|
+
|
|
95
|
+
`excludeFrom` names gitignore-syntax files, which is how a long exclusion list
|
|
96
|
+
stays out of the configuration file itself.
|
|
97
|
+
|
|
98
|
+
### An exclusion drops the callables, not the file
|
|
99
|
+
|
|
100
|
+
`exclude` decides what is **collected**, and nothing else. The file is still in
|
|
101
|
+
the `ts.Program`, so it is still compiled and still type-checked — what changes
|
|
102
|
+
is that its callables are never collected, and a call reaching into it becomes
|
|
103
|
+
an unfollowable call rather than disappearing. A stack therefore stops at the
|
|
104
|
+
excluded boundary instead of routing around it.
|
|
105
|
+
|
|
106
|
+
Two consequences worth knowing before reaching for `exclude`:
|
|
107
|
+
|
|
108
|
+
- **It cannot un-project a directory.** A project is the directory holding a
|
|
109
|
+
`tsconfig.json`, and discovery has already happened by the time collection is
|
|
110
|
+
filtered — so a project cannot exclude its own `tsconfig.json`, and excluding
|
|
111
|
+
every file it holds leaves it a project that traced nothing rather than no
|
|
112
|
+
project at all.
|
|
113
|
+
- **A `tsconfig.json` that will not parse still ends the run**, because it is
|
|
114
|
+
opened before any of this. Use the run's `exclude` to drop such a project,
|
|
115
|
+
which is settled early enough to keep discovery from opening it at all.
|
|
116
|
+
|
|
117
|
+
### Excluding callees
|
|
118
|
+
|
|
119
|
+
`excludeCallees` is a different filter from `exclude`: it names globs matched
|
|
120
|
+
against a callable's display name (`Type.member`) rather than against a file
|
|
121
|
+
path. A call landing on a match is dropped from the graph entirely, counting
|
|
122
|
+
toward neither the caller's depth nor its breadth — the shape a cross-cutting
|
|
123
|
+
callable like a logger needs, since every call site into it is a fact about
|
|
124
|
+
instrumentation rather than about how deep or wide the code around it is.
|
|
125
|
+
|
|
126
|
+
## Write
|
|
127
|
+
|
|
128
|
+
Every destination is optional, and unconfigured is the normal case: a run that
|
|
129
|
+
names no destination reports to the console and exits non-zero on violations, so
|
|
130
|
+
nothing it writes can go stale.
|
|
131
|
+
|
|
132
|
+
| Destination | Purpose |
|
|
133
|
+
| ----------- | ------- |
|
|
134
|
+
| `write.json` | A machine-readable report at `path`, indented by `indentation` |
|
|
135
|
+
| `write.markdown` | A marker-delimited block spliced into `path` |
|
|
136
|
+
| `write.mermaid` | The same block with its call stacks drawn as one mermaid flowchart |
|
|
137
|
+
|
|
138
|
+
`write.mermaid` takes the same keys as `write.markdown` — they differ in what
|
|
139
|
+
goes between the anchors, not in how a block is placed or overridden — and is a
|
|
140
|
+
separate destination so a repository can publish the printed trees and the
|
|
141
|
+
diagram from one run.
|
|
142
|
+
|
|
143
|
+
The console format — `markdown`, `mermaid`, or `json`, defaulting to `markdown`
|
|
144
|
+
— is a command-line concern rather than a configuration field: it decides what
|
|
145
|
+
one invocation prints, never what a run writes to a file, so it is selected
|
|
146
|
+
only by the CLI's own `--format` flag. Writing to a file and printing to a
|
|
147
|
+
terminal are independent, so both can be on at once.
|
|
148
|
+
|
|
149
|
+
`write.markdown` and `write.mermaid` each take a `description`, placed under
|
|
150
|
+
the heading, and a `heading`, which defaults to `# 🔭 Callidescope`. Set it
|
|
151
|
+
whenever the block is spliced into a file that already has a title: a second
|
|
152
|
+
first-level heading is something most markdown linters reject. The block's
|
|
153
|
+
subsections follow the level down on their own, so an `##` heading writes
|
|
154
|
+
`###` subsections.
|
|
155
|
+
|
|
156
|
+
Each also takes `previewCount`, how many stacks are shown before the rest go
|
|
157
|
+
behind a disclosure. It belongs to the destination rather than to the run
|
|
158
|
+
because it is a fact about the document the block lands in: a project's README
|
|
159
|
+
wants three and a whole-workspace report file wants all of them, and one number
|
|
160
|
+
for both could only ever be wrong for one of them. A run that only prints to a
|
|
161
|
+
terminal uses the tool's own default of three, that being nobody's document.
|
|
162
|
+
|
|
163
|
+
**There is no fan-out that writes a section into every project's readme.** Each
|
|
164
|
+
project declares its own `write.markdown` in its own file, so a project decides
|
|
165
|
+
where its section lands, whether it publishes one at all, and whether it wants
|
|
166
|
+
a diagram beside it — see [What a project may set](#what-a-project-may-set).
|
|
167
|
+
The workspace's own `write.markdown` is the block that really is about the
|
|
168
|
+
workspace: it carries the summary counts, one row per project against that
|
|
169
|
+
project's own depth limit, and a scoreboard of how many sit over, on, or clear
|
|
170
|
+
of theirs.
|
|
171
|
+
|
|
172
|
+
A markdown destination may supply `render` to replace the built-in tables, or
|
|
173
|
+
`writeBlock` to place the block itself. A `writeBlock` function is handed
|
|
174
|
+
`syncAnchoredBlock` and `wrapInAnchors`, so a custom writer reuses the same
|
|
175
|
+
splice rather than reimplementing it. Returning `false` reports the destination
|
|
176
|
+
as stale; anything else, `undefined` included, counts as current.
|
|
177
|
+
|
|
178
|
+
## Flags and Precedence
|
|
179
|
+
|
|
180
|
+
Every combination of a command-line value with a configured one happens in this
|
|
181
|
+
package, in `FlagResolutionService`, under one rule:
|
|
182
|
+
|
|
183
|
+
> A flag that changes **what a run judges or writes** may only override a value
|
|
184
|
+
> the configuration already declares. A flag that selects **mode or
|
|
185
|
+
> presentation** is command-line only, because neither can make an
|
|
186
|
+
> under-configured run legal.
|
|
187
|
+
|
|
188
|
+
| Flag | Role | What resolution does with it |
|
|
189
|
+
| ---- | ---- | ---------------------------- |
|
|
190
|
+
| `--check` | Mode | Command-line only. Nothing in the configuration corresponds to it |
|
|
191
|
+
| `--write` | Mode | Command-line only, for the same reason |
|
|
192
|
+
| `--format` | Presentation | Command-line only, and validated. It is returned beside the configuration rather than written into it |
|
|
193
|
+
| `--directories` | Override | Replaces `directories` when it named any. An empty value is absent, not a scope |
|
|
194
|
+
| `--entry-point-addresses` | Override | Replaces `entryPoints.addresses` when it named any |
|
|
195
|
+
| `--entry-point-decorators` | Override | Replaces `entryPoints.decorators` when it named any |
|
|
196
|
+
| `--exclude` | Override | Replaces the **authored** `exclude` when it named any, and the default globs are folded back in — resolution adds them to a configured `exclude` too, so a flag that dropped them would start tracing `node_modules` |
|
|
197
|
+
| `--exclude-callees` | Override | Replaces `excludeCallees` when it named any |
|
|
198
|
+
| `--include-exported-functions` | Override | Replaces `entryPoints.includeExportedFunctions`. Takes `true` or `false`, or the flag alone for `true` |
|
|
199
|
+
| `--include-orphans` | Override | Replaces `entryPoints.includeOrphans`, the same way |
|
|
200
|
+
| `--include-tests` | Override | Replaces `entryPoints.includeTests`, the same way |
|
|
201
|
+
| `--maximum-depth` | Override | Replaces `limits.maximumDepth`, in the run's own configuration and in every project's. A value that is not a positive whole number is refused |
|
|
202
|
+
| `--maximum-breadth` | Override | Replaces `limits.maximumBreadth` the same way — and is refused when the run's configuration declares none, there being nothing to override |
|
|
203
|
+
| `--json` | Override | Replaces `write.json.path`, and no other property of that destination |
|
|
204
|
+
| `--markdown` | Override | Replaces `write.markdown.path`, and no other property of that destination |
|
|
205
|
+
| `--mermaid` | Override | Replaces `write.mermaid.path`, and no other property of that destination |
|
|
206
|
+
| `--config` | Neither | It chooses the file everything else is resolved against, so it has already done its whole job by the time resolution runs |
|
|
207
|
+
|
|
208
|
+
**Every configured field has an overriding flag, save one.** `excludeFrom`
|
|
209
|
+
names the ignore files a run reads, which is what the run _is_ rather than a
|
|
210
|
+
value it judges by — and it is workspace-only for that same reason, a project
|
|
211
|
+
being no more able to redirect it than a command line is.
|
|
212
|
+
|
|
213
|
+
**A limit override reaches the number each project is really gated by.** A
|
|
214
|
+
limit is enforced per project, out of that project's own file, so an override
|
|
215
|
+
left in the run's copy alone would be a flag no gate ever looks at — the
|
|
216
|
+
`--format mermiad` failure in a different costume. It is applied to every
|
|
217
|
+
project that declared the limit being overridden, and to no project that
|
|
218
|
+
declared none: `--maximum-breadth` cannot gate a project that wrote
|
|
219
|
+
`maximumBreadth: undefined`, because overriding a decision and reversing one
|
|
220
|
+
are not the same act. The file each project's row names is still that project's
|
|
221
|
+
own — an override changes a number for one invocation, not where it was
|
|
222
|
+
written.
|
|
223
|
+
|
|
224
|
+
Which flags a command accepts follows from what that command does.
|
|
225
|
+
`callidescope` accepts every row above. `depth` and `breadth` accept the ones
|
|
226
|
+
that shape the graph — the scope, the entry-point rules, and the two exclusion
|
|
227
|
+
lists — and none of the limits or destinations, because a lookup gates nothing
|
|
228
|
+
and writes nothing, so there is no number it reads and no file it touches for
|
|
229
|
+
one of those to change.
|
|
230
|
+
|
|
231
|
+
Four consequences are worth stating outright, because each replaced an
|
|
232
|
+
ad-hoc merge that got them wrong:
|
|
233
|
+
|
|
234
|
+
- **An empty `--directories` is absent.** `--directories ""` and a
|
|
235
|
+
`--directories` nobody typed are the same value, and reading either as
|
|
236
|
+
"every project" silently overrode a configured scope.
|
|
237
|
+
- **A path override keeps its siblings.** A destination carries a heading, a
|
|
238
|
+
description, its anchors, its indentation, and its render and write hooks;
|
|
239
|
+
re-resolving it from a path alone replaced every one of them with a default.
|
|
240
|
+
- **A path override cannot invent a destination.** `--json` against a
|
|
241
|
+
configuration declaring no `write.json` is refused, because a flag that could
|
|
242
|
+
conjure one would let any command line write a report the configuration never
|
|
243
|
+
asked for. `--maximum-breadth` is refused the same way and for the same
|
|
244
|
+
reason: it is the one judged value resolution supplies no default for, so a
|
|
245
|
+
flag that could supply one would gate a workspace on a number no
|
|
246
|
+
configuration ever chose — which is exactly what `--check breadth` refuses to
|
|
247
|
+
do.
|
|
248
|
+
- **An unrecognized `--format` is refused.** A run that quietly printed
|
|
249
|
+
markdown for `--format mermiad` exited 0 having taught its reader that the
|
|
250
|
+
flag does nothing.
|
|
251
|
+
|
|
252
|
+
Every complaint is collected rather than thrown at the first one, so a command
|
|
253
|
+
line with two mistakes in it is two mistakes to fix rather than two runs.
|
|
254
|
+
Nothing has been traced or written by the time resolution returns.
|
|
255
|
+
|
|
256
|
+
## Project Configuration
|
|
257
|
+
|
|
258
|
+
Everything above describes the file a run is pointed at — the **workspace**
|
|
259
|
+
configuration. A second `callidescope.config.ts` may also sit at any traced
|
|
260
|
+
project's own root, the directory holding the `tsconfig.json` that makes it a
|
|
261
|
+
project. It is found by name in that directory alone, with no upward walk, and
|
|
262
|
+
may use any of the same eight extensions.
|
|
263
|
+
|
|
264
|
+
**Every traced project has one, and every one of them is complete.** A traced
|
|
265
|
+
project with no file at all is refused by name, and so is a file that leaves a
|
|
266
|
+
field out. A project's file is meant to be readable as the whole statement of
|
|
267
|
+
how that project is traced and judged, which a shape with optional fields
|
|
268
|
+
cannot be: an absent field and a field set to the value it would have defaulted
|
|
269
|
+
to look identical in a diff, and only one of them was a decision. Completeness
|
|
270
|
+
costs one line rather than twenty, because a project spreads the workspace's
|
|
271
|
+
`projectDefaults` and overrides what it means to — see
|
|
272
|
+
[Spread the defaults, then override](#spread-the-defaults-then-override) and
|
|
273
|
+
[ADR 0007](../../../../docs/adr/0007-complete-project-configurations.md).
|
|
274
|
+
|
|
275
|
+
One file, one role per run: the file a run was pointed at is never also read as
|
|
276
|
+
a project's. A package whose task names its own configuration and then traces
|
|
277
|
+
itself would otherwise have that file judged as a project's — a refusal for the
|
|
278
|
+
workspace-only fields it legitimately sets.
|
|
279
|
+
|
|
280
|
+
### What a project may set
|
|
281
|
+
|
|
282
|
+
| Field | What it does |
|
|
283
|
+
| ----- | ------------ |
|
|
284
|
+
| `entryPoints` | Which of that project's callables root a stack, `addresses` included |
|
|
285
|
+
| `limits.maximumDepth` | The depth every stack rooted in that project is judged against |
|
|
286
|
+
| `limits.maximumBreadth` | The breadth every callable that project declares is judged against |
|
|
287
|
+
| `exclude` | Globs naming that project's own files to leave untraced |
|
|
288
|
+
| `write.markdown` | Where that project's own published section goes |
|
|
289
|
+
| `write.mermaid` | Where that project's own diagram goes, when it wants one |
|
|
290
|
+
|
|
291
|
+
**A project's written destinations are anchored to its root** the same way its
|
|
292
|
+
`exclude` globs are: `write: { markdown: { path: "docs/CALLS.md" } }` in
|
|
293
|
+
`packages/thing`'s own file writes `packages/thing/docs/CALLS.md`, and there is
|
|
294
|
+
no spelling of it that reaches a sibling. A destination left `undefined`
|
|
295
|
+
publishes nothing.
|
|
296
|
+
|
|
297
|
+
Nothing else writes into a project's documents. There is no workspace-level
|
|
298
|
+
fan-out to be left out of or reached by: a project publishes what its own file
|
|
299
|
+
says it publishes, and `undefined` is how it says nothing.
|
|
300
|
+
|
|
301
|
+
`write.json` stays workspace-only: it is the run's single report, not a
|
|
302
|
+
project's to redirect.
|
|
303
|
+
|
|
304
|
+
**A project's `exclude` globs are anchored to that project's root**, never to
|
|
305
|
+
the workspace: `exclude: ["src/generated/**"]` in `packages/thing`'s own file
|
|
306
|
+
names `packages/thing/src/generated/**`, and there is no spelling of it that
|
|
307
|
+
reaches a sibling. Write the path as the project sees it — a workspace-relative
|
|
308
|
+
glob here matches nothing, and the files it meant to drop stay traced.
|
|
309
|
+
|
|
310
|
+
The run's own `exclude` keeps its workspace-relative meaning and is layered
|
|
311
|
+
underneath, so a project can leave more out and can never put back what the run
|
|
312
|
+
left out. Noise spanning several projects still belongs in the workspace file.
|
|
313
|
+
|
|
314
|
+
It also filters **collection** and nothing else, exactly as the run's own does —
|
|
315
|
+
see [An exclusion drops the callables, not the file](#an-exclusion-drops-the-callables-not-the-file).
|
|
316
|
+
A project cannot exclude its own `tsconfig.json`, and a call into a file it
|
|
317
|
+
excluded becomes an unfollowable call rather than vanishing.
|
|
318
|
+
|
|
319
|
+
Every other field is refused by name before anything is traced.
|
|
320
|
+
|
|
321
|
+
### Spread the defaults, then override
|
|
322
|
+
|
|
323
|
+
A workspace configuration exports `projectDefaults` beside its default export.
|
|
324
|
+
A project spreads it and overrides what it means to, which is what makes a
|
|
325
|
+
complete file cost one line:
|
|
326
|
+
|
|
327
|
+
```ts
|
|
328
|
+
import { projectDefaults } from "../../configuration/callidescope.config.js";
|
|
329
|
+
|
|
330
|
+
export default {
|
|
331
|
+
...projectDefaults,
|
|
332
|
+
limits: { maximumBreadth: undefined, maximumDepth: 10 },
|
|
333
|
+
};
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Both limits are named even though only one is a real number. `maximumBreadth:
|
|
337
|
+
undefined` is this project saying outright that it gates depth and not breadth
|
|
338
|
+
— the one statement an absent field could never distinguish from a project that
|
|
339
|
+
forgot. The same holds for `write.mermaid: undefined` and publishing no
|
|
340
|
+
diagram.
|
|
341
|
+
|
|
342
|
+
**Spread `projectDefaults`, never the workspace's default export.** The two are
|
|
343
|
+
different objects on purpose: the default export carries `directories`,
|
|
344
|
+
`excludeFrom`, `write.json`, and the rest of what only a run may set, so
|
|
345
|
+
spreading it earns a refusal naming the first such field. `projectDefaults`
|
|
346
|
+
holds exactly the surface a project is entitled to, so a project spreading it
|
|
347
|
+
cannot adopt an output destination or an ignore file by accident, because none
|
|
348
|
+
of them is in there to adopt.
|
|
349
|
+
|
|
350
|
+
Nothing is resolved across two files. Every number a project is judged by is
|
|
351
|
+
written in that project's own file — there is no per-field fallback to the
|
|
352
|
+
workspace, and no record of whether a limit was declared here or handed down,
|
|
353
|
+
because the spread already put it here where a reader can see it.
|
|
354
|
+
|
|
355
|
+
The workspace number is a **default rather than a ceiling**. A project declaring
|
|
356
|
+
a higher limit than the workspace keeps its own — a workspace number pinned by
|
|
357
|
+
the single worst stack anywhere in it gates nothing for the projects nowhere
|
|
358
|
+
near it, which is the whole reason a project gets to say.
|
|
359
|
+
|
|
360
|
+
`entryPoints` is replaced whole rather than merged member by member: a project
|
|
361
|
+
writing an `entryPoints` object of its own replaces the spread one outright, so
|
|
362
|
+
a project that declares `addresses` and wants the workspace's decorator list has
|
|
363
|
+
to carry it across — `...projectDefaults.entryPoints` inside its own object is
|
|
364
|
+
the one line that does it.
|
|
365
|
+
|
|
366
|
+
`includeTests` is the one field in that set that decides which of a project's
|
|
367
|
+
files are **collected** rather than which of its callables root a stack, so it
|
|
368
|
+
takes effect at the same layer `exclude` does: a project that asks for its test
|
|
369
|
+
files gets them walked in a run that left every other project's out, and a
|
|
370
|
+
project that refuses them keeps them out of a run that asked for everyone's.
|
|
371
|
+
|
|
372
|
+
### Why the workspace-only fields cannot vary per project
|
|
373
|
+
|
|
374
|
+
`maximumDepth` and `maximumBreadth` **judge** a call graph: the graph is built
|
|
375
|
+
once, and each project asks a different question of the same edges. Two answers
|
|
376
|
+
are two opinions about one artifact, which is coherent.
|
|
377
|
+
|
|
378
|
+
`excludeCallees`, `directories`, `excludeFrom`, and `write.json` are
|
|
379
|
+
different. They name what a run reads, where the
|
|
380
|
+
run's own report lands, or how it partitions the workspace, and a project
|
|
381
|
+
cannot answer those differently from the run tracing it — so they stay in the
|
|
382
|
+
workspace file. `<field>` in the refusal above is the name as it has to be
|
|
383
|
+
typed to fix the file, dot path and all, so a project setting `write.json`
|
|
384
|
+
alongside a destination it is entitled to keep is told which half to move.
|
|
385
|
+
|
|
386
|
+
### Reading the resolved set
|
|
387
|
+
|
|
388
|
+
A ratchet written one file per project is no longer reviewable in the single
|
|
389
|
+
file it used to live in. `@callidescope/cli`'s `limits` command is where it is
|
|
390
|
+
reviewable as a set instead — every project in scope, the number it is judged
|
|
391
|
+
against, and the file that number is written in. There is nothing to say
|
|
392
|
+
beyond that: every traced project's configuration is complete, so a limit has
|
|
393
|
+
exactly one reachable value rather than a declared-or-inherited pair, and the
|
|
394
|
+
listing names only the file it came from. It resolves configuration and
|
|
395
|
+
measures nothing, so it costs milliseconds rather than a trace.
|
|
396
|
+
|
|
397
|
+
It is also the answer to a limit that seems not to have taken effect. A
|
|
398
|
+
misspelled `limits.maxDepth` is refused outright — the schema is strict, so an
|
|
399
|
+
unrecognized field never loads cleanly in the first place — and the listing's
|
|
400
|
+
`Value` column is where a number that took hold but reads wrong shows itself.
|
|
401
|
+
|
|
402
|
+
### Refusals
|
|
403
|
+
|
|
404
|
+
Each of these ends the run before anything is printed or written, so a checkout
|
|
405
|
+
is left exactly as the run found it. `<project>` is the workspace-relative
|
|
406
|
+
project root; the workspace configuration's own declared addresses are labelled
|
|
407
|
+
`the workspace configuration` instead.
|
|
408
|
+
|
|
409
|
+
Five of them. Each is shown under the headline it is logged with — four of the
|
|
410
|
+
five share one — and quoted as the tool writes it.
|
|
411
|
+
|
|
412
|
+
**`🔭 Rejected a project configuration` — the file could not be read.**
|
|
413
|
+
|
|
414
|
+
```text
|
|
415
|
+
Failed to read the callidescope configuration for <project> at <path>: <reason>
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
The read failed or the shape did not pass the schema. `<reason>` is the
|
|
419
|
+
underlying failure, which is also kept as the error's `cause`. Fix the named
|
|
420
|
+
file; nothing else was traced.
|
|
421
|
+
|
|
422
|
+
**`🔭 Rejected a project configuration` — a workspace-only field.**
|
|
423
|
+
|
|
424
|
+
```text
|
|
425
|
+
<project> sets <field>, which only the workspace configuration may set. A project configuration may set entryPoints, exclude, limits, write.markdown, and write.mermaid.
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
Move that field to the workspace file. A retired limit is a different refusal:
|
|
429
|
+
the schema names it, because `limits` accepts `maximumDepth` and
|
|
430
|
+
`maximumBreadth` and nothing else.
|
|
431
|
+
|
|
432
|
+
**`🔭 Rejected a project configuration` — a declared address resolved to
|
|
433
|
+
nothing.**
|
|
434
|
+
|
|
435
|
+
```text
|
|
436
|
+
<project> declares an entryPoints.addresses entry that resolves to nothing: "<address>". Check the file path and the qualified name callidescope prints for it in a stack.
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
The callable was renamed, moved, or excluded from the run. Correct the address
|
|
440
|
+
or drop it. This refusal is the point of the field rather than an
|
|
441
|
+
inconvenience: a rename that silently dropped a declared root would lower the
|
|
442
|
+
project's measured depth with nothing in the output to say so, and loosen a gate
|
|
443
|
+
in the one commit nobody would think to check it in.
|
|
444
|
+
|
|
445
|
+
**`🔭 Rejected a project configuration` — a declared address was ambiguous.**
|
|
446
|
+
|
|
447
|
+
```text
|
|
448
|
+
<project> declares an entryPoints.addresses entry that matches more than one declaration: "<address>". Candidates: <address>:<line>, <address>:<line>. Add ":<line>" to the address to pick one.
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
Every candidate is rendered as an address that would have picked it, so the fix
|
|
452
|
+
is a copy rather than a file location to translate back. Two declarations on one
|
|
453
|
+
line are the case no address can separate; those name their column instead and
|
|
454
|
+
the advice changes to `Two declarations on one line cannot be told apart by
|
|
455
|
+
":<line>" — rename one, or name a different callable.`
|
|
456
|
+
|
|
457
|
+
**`🔭 Rejected a project configuration` — a declared address was malformed.**
|
|
458
|
+
|
|
459
|
+
```text
|
|
460
|
+
<project> declares an invalid entryPoints.addresses entry. "<address>" is not a callable address. It needs a file path and a qualified name joined by "#", as in "src/foo.service.ts#FooService.bar", optionally followed by ":<line>" to disambiguate.
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
A run collects **every** unresolved address before it refuses, so several
|
|
464
|
+
mistakes are fixed from one message rather than one refusal at a time. More
|
|
465
|
+
than one arrives numbered, behind
|
|
466
|
+
`<count> declared entry points did not resolve.`
|
|
467
|
+
|
|
468
|
+
The headlines belong to the command rather than to the message. The first two
|
|
469
|
+
reach the `limits` command as well, where they are printed under
|
|
470
|
+
`🔭 Rejected a configuration`; a listing that quietly skipped the one project
|
|
471
|
+
whose configuration is wrong would be at its least trustworthy exactly when it
|
|
472
|
+
is most wanted. The three address refusals need a resolved call graph, so only
|
|
473
|
+
a trace raises those.
|
|
474
|
+
|
|
475
|
+
### Worked examples
|
|
476
|
+
|
|
477
|
+
Three runnable examples in
|
|
478
|
+
[`@callidescope/examples`](../callidescope-examples/README.md) demonstrate the
|
|
479
|
+
whole of this, each against real traced code:
|
|
480
|
+
|
|
481
|
+
| Example | What it shows |
|
|
482
|
+
| ------- | ------------- |
|
|
483
|
+
| [`declared-entry-points`](../callidescope-examples/examples/declared-entry-points/README.md) | `entryPoints.addresses`, what declaring adds, and the refusals |
|
|
484
|
+
| [`project-depth-limit`](../callidescope-examples/examples/project-depth-limit/README.md) | One run, two depth limits, and why the two files at that package's root are separate |
|
|
485
|
+
| [`gated-leaf`](../callidescope-examples/examples/gated-leaf/README.md) | A leaf gated at three, and both halves of the `--check breadth` rule side by side |
|
|
486
|
+
|
|
487
|
+
## Call Graph Types
|
|
488
|
+
|
|
489
|
+
The result types define the JSON report's shape, so a consumer types against
|
|
490
|
+
this package rather than reverse-engineering the output. Each reported
|
|
491
|
+
`StackFrame` carries a `CallableSignature` (parameter names, types, optional and
|
|
492
|
+
rest flags, return type, and the one-line rendering) and a
|
|
493
|
+
`CallableDocumentation` (the whole comment as its summary, tag names, and a
|
|
494
|
+
deprecation flag — shortening belongs to whatever renders it). Both are
|
|
495
|
+
`undefined` when the callable has neither — and `undefined` fields are absent
|
|
496
|
+
from the JSON entirely rather than present and null.
|
|
497
|
+
|
|
498
|
+
## Exports
|
|
499
|
+
|
|
500
|
+
`ConfigurationModule` and `ConfigurationService` for NestJS consumers, the zod
|
|
501
|
+
schema and every default constant, and the type surface — both the configuration
|
|
502
|
+
types and the `CallGraphResult` types that define the JSON report's shape.
|
|
503
|
+
|
|
504
|
+
`loadConfiguration` does the file I/O; `resolveConfiguration` is pure
|
|
505
|
+
defaulting. They are split so that a host embedding callidescope can hand over a
|
|
506
|
+
configuration object it assembled itself and get the same resolved shape a file
|
|
507
|
+
produces, without touching the disk.
|
|
508
|
+
|
|
509
|
+
`ProjectConfigurationService` is the second service, and the only place a
|
|
510
|
+
per-project refusal is raised: `loadProjectConfigurations` reads the file beside
|
|
511
|
+
each traced project and rejects the ones setting a workspace-only field, and
|
|
512
|
+
`resolveLimits` says what every project is judged against, each number carrying
|
|
513
|
+
the file it was written in. One resolver rather than one per reader — a gate
|
|
514
|
+
and a listing that each read a flag override its own way could disagree about
|
|
515
|
+
the same number, and a limit two answers can be given for is worse than no
|
|
516
|
+
limit.
|
|
517
|
+
|
|
518
|
+
## Test
|
|
519
|
+
|
|
520
|
+
```bash
|
|
521
|
+
nx run callidescope-configuration:vitest
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
## License
|
|
525
|
+
|
|
526
|
+
MIT — see [LICENSE](../../../../LICENSE).
|
|
527
|
+
|
|
528
|
+
## 👔 Conformetry
|
|
529
|
+
|
|
530
|
+
This project was generated from the [nestjs-service-project](../../../../configuration/conformetry-templates/nestjs-service-project) conformetry template.
|
|
531
|
+
|
|
532
|
+
<!-- callidescope:start -->
|
|
533
|
+
|
|
534
|
+
## 🔭 Callidescope
|
|
535
|
+
|
|
536
|
+
Call stacks traced through `packages/ic-suite/callidescope/callidescope-configuration`, deepest first. Each frame shows what it takes, what it returns, and what its documentation says.
|
|
537
|
+
|
|
538
|
+
| Measure | Value |
|
|
539
|
+
| --- | --- |
|
|
540
|
+
| Callables | 112 |
|
|
541
|
+
| Files | 27 |
|
|
542
|
+
| Calls traced | 112 |
|
|
543
|
+
| Call stacks | 6 |
|
|
544
|
+
| Deepest stack | 5 |
|
|
545
|
+
| Stacks through recursion | 0 |
|
|
546
|
+
| Unfollowable calls | 11 |
|
|
547
|
+
|
|
548
|
+
### Limits
|
|
549
|
+
|
|
550
|
+
What this project is judged against, as declared in its own `callidescope.config.ts`.
|
|
551
|
+
|
|
552
|
+
| Limit | Value |
|
|
553
|
+
| --- | --- |
|
|
554
|
+
| `maximumDepth` | 8 |
|
|
555
|
+
| `maximumBreadth` | 8 |
|
|
556
|
+
|
|
557
|
+
### Call stacks (depth)
|
|
558
|
+
|
|
559
|
+
**1. `ConfigurationFileService.loadConfiguration`** — depth ≥ 5 · orphan-root
|
|
560
|
+
|
|
561
|
+
```text
|
|
562
|
+
🚀 ConfigurationFileService.loadConfiguration(args?: LoadConfigurationArguments): Promise<ResolvedCallidescopeConfiguration> [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:298]
|
|
563
|
+
↳ Loads and validates a callidescope configuration file.
|
|
564
|
+
└─> ConfigurationFileService.loadConfigurationFile(args?: LoadConfigurationArguments): Promise<LoadedCallidescopeConfiguration> [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:326]
|
|
565
|
+
↳ Loads a configuration, and says what the file itself declared and which file answered.
|
|
566
|
+
└─> ConfigurationFileService.resolveConfigurationPath(configurationPath: string): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:158]
|
|
567
|
+
↳ Resolves a configuration path against the cwd, then the repository root.
|
|
568
|
+
└─> ConfigurationFileService.findRepositoryRoot(): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:97]
|
|
569
|
+
↳ Walks upward from the process cwd looking for the repository root.
|
|
570
|
+
└─> ConfigurationFileService.some(…)(marker: ".git" | "pnpm-workspace.yaml"): boolean [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:102]
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
**2. `flatMap(…)`** — depth 3 · orphan-root
|
|
574
|
+
|
|
575
|
+
```text
|
|
576
|
+
🚀 flatMap(…)(…): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:227]
|
|
577
|
+
└─> readPermittedNames(…): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:146]
|
|
578
|
+
↳ Reads the names one classified field contributes to the permitted set.
|
|
579
|
+
└─> map(…)([member]: [string, ProjectFieldPermission]): string [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:156]
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
**3. `InputService.suggest`** — depth 3 · orphan-root
|
|
583
|
+
|
|
584
|
+
```text
|
|
585
|
+
🚀 InputService.suggest(input: string): Promise<{ title: string; value: string; }[]> [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:137]
|
|
586
|
+
└─> InputService.completeSuggestions(args: { input: string; suggestions: readonly string[]; }): string[] [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:55]
|
|
587
|
+
↳ Narrows a suggestion list to what has been typed so far.
|
|
588
|
+
└─> InputService.filter(…)(suggestion: string): boolean [packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:60]
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
<details>
|
|
592
|
+
<summary>3 more call stacks</summary>
|
|
593
|
+
|
|
594
|
+
**4. `ConfigurationService.resolveConfiguration`** — depth 3 · orphan-root
|
|
595
|
+
|
|
596
|
+
```text
|
|
597
|
+
🚀 ConfigurationService.resolveConfiguration(configuration: CallidescopeConfiguration): ResolvedCallidescopeConfiguration [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:146]
|
|
598
|
+
↳ Fills in every field a configuration file may leave out.
|
|
599
|
+
└─> ConfigurationFileService.resolveConfiguration(configuration: CallidescopeConfiguration): ResolvedCallidescopeConfiguration [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:369]
|
|
600
|
+
↳ Fills in every field a configuration file may leave out.
|
|
601
|
+
└─> ConfigurationFileService.resolveEntryPoints(…): ResolvedCallidescopeEntryPoints [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:190]
|
|
602
|
+
↳ Applies defaults to the entry-point rules.
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
**5. `callbackSchema`** — depth 2 · orphan-root
|
|
606
|
+
|
|
607
|
+
```text
|
|
608
|
+
🚀 callbackSchema<TCallback>(): z.ZodType<TCallback> [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:296]
|
|
609
|
+
↳ Accepts a function-valued option without inspecting its signature.
|
|
610
|
+
└─> custom(…)(value: unknown): value is Function [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:297]
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
**6. `ConfigurationService.findConfigurationFileAt`** — depth 2 · orphan-root
|
|
614
|
+
|
|
615
|
+
```text
|
|
616
|
+
🚀 ConfigurationService.findConfigurationFileAt(directory: string): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:73]
|
|
617
|
+
↳ Finds a configuration file sitting directly at one directory.
|
|
618
|
+
└─> ConfigurationFileService.findConfigurationFileAt(directory: string): string | undefined [packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:278]
|
|
619
|
+
↳ Finds a configuration file sitting directly at one directory.
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
</details>
|
|
623
|
+
|
|
624
|
+
### Breadth
|
|
625
|
+
|
|
626
|
+
| Callable | Breadth | Calls directly | Location |
|
|
627
|
+
| --- | --- | --- | --- |
|
|
628
|
+
| `FlagResolutionService.resolveRunFlags` | 7 | `FlagResolutionService.resolveFormat`, `FlagResolutionService.resolveLimitOverrides`, `FlagResolutionService.resolveList`, `FlagResolutionService.resolveEntryPoints`, `FlagResolutionService.resolveExclude`, `FlagResolutionService.resolveLimits`, `FlagResolutionService.resolveWrite` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:426` |
|
|
629
|
+
| `ConfigurationFileService.loadConfigurationFile` | 5 | `ConfigurationFileService.findConfigurationFile`, `ConfigurationFileService.resolveConfigurationPath`, `ConfigurationFileService.resolveConfiguration`, `UnknownConfigurationFileTypeError.constructor`, `ConfigurationFileService.loadConfigurationModule` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:326` |
|
|
630
|
+
| `ConfigurationFileService.resolveConfiguration` | 5 | `ConfigurationFileService.resolveEntryPoints`, `ConfigurationFileService.resolveExclude`, `ConfigurationFileService.resolveLimits`, `ConfigurationFileService.resolveJsonOutput`, `ConfigurationFileService.resolveMarkdownDestination` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:369` |
|
|
631
|
+
|
|
632
|
+
<details>
|
|
633
|
+
<summary>53 more callables</summary>
|
|
634
|
+
|
|
635
|
+
| Callable | Breadth | Calls directly | Location |
|
|
636
|
+
| --- | --- | --- | --- |
|
|
637
|
+
| `InputService.promptForAutocompleteMultiselect` | 4 | `InputService.assertCanPrompt`, `InputService.map(…)`, `promptCancelledError`, `InputService.filter(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:126` |
|
|
638
|
+
| `InputService.promptForSelect` | 4 | `InputService.assertCanPrompt`, `InputService.map(…)`, `promptCancelledError`, `InputService.find(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:175` |
|
|
639
|
+
| `RunPlanService.readCheckNames` | 4 | `RunPlanService.describeAcceptedCheckNames`, `RunPlanService.filter(…)`, `RunPlanService.map(…)`, `RunPlanService.validateCheckNames` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:68` |
|
|
640
|
+
| `ProjectConfigurationService.loadProjectConfigurations` | 4 | `ProjectConfigurationMissingError.constructor`, `ProjectConfigurationService.loadProjectConfiguration`, `ProjectConfigurationService.assertNoForbiddenFields`, `ProjectConfigurationService.assertComplete` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:362` |
|
|
641
|
+
| `RunPlanService.selectMode` | 3 | `RunPlanService.readCheckNames`, `RunPlanService.filter(…)`, `RunPlanService.map(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:271` |
|
|
642
|
+
| `ProjectConfigurationService.resolveLimits` | 3 | `ProjectConfigurationService.buildWorkspaceLimits`, `ProjectConfigurationService.map(…)`, `ProjectConfigurationService.map(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:417` |
|
|
643
|
+
| `readPermittedNames` | 2 | `map(…)`, `filter(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:146` |
|
|
644
|
+
| `InputService.assertCanPrompt` | 2 | `InputService.isAtTerminal`, `missingInputError` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:38` |
|
|
645
|
+
| `InputService.suggest` | 2 | `InputService.map(…)`, `InputService.completeSuggestions` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:137` |
|
|
646
|
+
| `FlagResolutionService.resolveCount` | 2 | `buildUndeclaredValueMessage`, `buildUnreadableCountMessage` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:93` |
|
|
647
|
+
| `FlagResolutionService.resolveEntryPoints` | 2 | `FlagResolutionService.resolveList`, `FlagResolutionService.resolveSwitch` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:168` |
|
|
648
|
+
| `FlagResolutionService.resolveFormat` | 2 | `FlagResolutionService.find(…)`, `buildUnknownFormatMessage` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:240` |
|
|
649
|
+
| `RunPlanService.prepareLookup` | 2 | `FlagResolutionService.resolveRunFlags`, `flagResolutionError` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:133` |
|
|
650
|
+
| `RunPlanService.prepareRun` | 2 | `RunPlanService.selectMode`, `FlagResolutionService.resolveRunFlags` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:194` |
|
|
651
|
+
| `ConfigurationFileService.resolveConfigurationPath` | 2 | `ConfigurationFileService.findRepositoryRoot`, `ConfigurationFileNotFoundError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:158` |
|
|
652
|
+
| `ProjectConfigurationService.assertComplete` | 2 | `ProjectConfigurationService.findMissingField`, `ProjectConfigurationIncompleteError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:55` |
|
|
653
|
+
| `ProjectConfigurationService.assertNoForbiddenFields` | 2 | `ProjectConfigurationService.findForbiddenField`, `ProjectConfigurationFieldNotPermittedError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:74` |
|
|
654
|
+
| `ProjectConfigurationService.findForbiddenField` | 2 | `ProjectConfigurationService.findForbiddenMember`, `ProjectConfigurationService.readForbiddenField` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:163` |
|
|
655
|
+
| `ConfigurationService.resolveFormatOption` | 2 | `InputService.isAtTerminal`, `ConfigurationService.promptForSelect` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:165` |
|
|
656
|
+
| `flatMap(…)` | 1 | `readPermittedNames` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:227` |
|
|
657
|
+
| `callbackSchema` | 1 | `custom(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.constants.ts:296` |
|
|
658
|
+
| `missingInputError` | 1 | `InputError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.constants.ts:27` |
|
|
659
|
+
| `promptCancelledError` | 1 | `InputError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.constants.ts:39` |
|
|
660
|
+
| `InputService.completeSuggestions` | 1 | `InputService.filter(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:55` |
|
|
661
|
+
| `InputService.parseCommaDelimitedOption` | 1 | `InputService.map(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/input/input.service.ts:98` |
|
|
662
|
+
| `buildUnknownFormatMessage` | 1 | `map(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.constants.ts:19` |
|
|
663
|
+
| `flagResolutionError` | 1 | `InputError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.constants.ts:87` |
|
|
664
|
+
| `FlagResolutionService.resolveDestination` | 1 | `buildUndeclaredDestinationMessage` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:137` |
|
|
665
|
+
| `FlagResolutionService.resolveLimitOverrides` | 1 | `FlagResolutionService.resolveCount` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:271` |
|
|
666
|
+
| `FlagResolutionService.resolveSwitch` | 1 | `buildUnknownSwitchMessage` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:354` |
|
|
667
|
+
| `FlagResolutionService.resolveWrite` | 1 | `FlagResolutionService.resolveDestination` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/flag-resolution/flag-resolution.service.ts:383` |
|
|
668
|
+
| `RunPlanService.describeAcceptedCheckNames` | 1 | `RunPlanService.map(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:56` |
|
|
669
|
+
| `RunPlanService.validateCheckNames` | 1 | `RunPlanService.describeAcceptedCheckNames` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/run-plan/run-plan.service.ts:100` |
|
|
670
|
+
| `ConfigurationFileService.findConfigurationFile` | 1 | `ConfigurationFileService.findConfigurationFileAt` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:70` |
|
|
671
|
+
| `ConfigurationFileService.findRepositoryRoot` | 1 | `ConfigurationFileService.some(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:97` |
|
|
672
|
+
| `ConfigurationFileService.loadConfigurationModule` | 1 | `ConfigurationFileService.loadJsonConfiguration` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:121` |
|
|
673
|
+
| `ConfigurationFileService.loadConfiguration` | 1 | `ConfigurationFileService.loadConfigurationFile` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration-file.service.ts:298` |
|
|
674
|
+
| `ProjectConfigurationService.buildProjectLimits` | 1 | `ProjectConfigurationService.overrideLimit` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:97` |
|
|
675
|
+
| `ProjectConfigurationService.findMissingField` | 1 | `ProjectConfigurationService.find(…)` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:239` |
|
|
676
|
+
| `ProjectConfigurationService.loadProjectConfiguration` | 1 | `ProjectConfigurationError.constructor` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:281` |
|
|
677
|
+
| `ProjectConfigurationService.map(…)` | 1 | `ProjectConfigurationService.buildProjectLimits` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/project-configuration.service.ts:422` |
|
|
678
|
+
| `ConfigurationService.findConfigurationFileAt` | 1 | `ConfigurationFileService.findConfigurationFileAt` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:73` |
|
|
679
|
+
| `ConfigurationService.loadConfigurationFile` | 1 | `ConfigurationFileService.loadConfigurationFile` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:87` |
|
|
680
|
+
| `ConfigurationService.loadProjectConfigurations` | 1 | `ProjectConfigurationService.loadProjectConfigurations` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:94` |
|
|
681
|
+
| `ConfigurationService.parseCommaDelimitedOption` | 1 | `InputService.parseCommaDelimitedOption` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:104` |
|
|
682
|
+
| `ConfigurationService.parseOptionalOption` | 1 | `InputService.parseOptionalOption` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:109` |
|
|
683
|
+
| `ConfigurationService.prepareLookup` | 1 | `RunPlanService.prepareLookup` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:114` |
|
|
684
|
+
| `ConfigurationService.prepareRun` | 1 | `RunPlanService.prepareRun` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:121` |
|
|
685
|
+
| `ConfigurationService.promptForAutocompleteMultiselect` | 1 | `InputService.promptForAutocompleteMultiselect` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:128` |
|
|
686
|
+
| `ConfigurationService.promptForSelect` | 1 | `InputService.promptForSelect` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:137` |
|
|
687
|
+
| `ConfigurationService.resolveConfiguration` | 1 | `ConfigurationFileService.resolveConfiguration` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:146` |
|
|
688
|
+
| `ConfigurationService.resolveLimits` | 1 | `ProjectConfigurationService.resolveLimits` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:182` |
|
|
689
|
+
| `ConfigurationService.touchesFiles` | 1 | `RunPlanService.touchesFiles` | `packages/ic-suite/callidescope/callidescope-configuration/src/modules/configuration/configuration.service.ts:189` |
|
|
690
|
+
|
|
691
|
+
</details>
|
|
692
|
+
<!-- callidescope:end -->
|
|
693
|
+
|
|
694
|
+
## 🕸️ Codependix
|
|
695
|
+
|
|
696
|
+
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`.
|
|
697
|
+
|
|
698
|
+
### Nx Neighborhood
|
|
699
|
+
|
|
700
|
+
<!-- codependix:start name="codependix-nx-projects" -->
|
|
701
|
+
```mermaid
|
|
702
|
+
graph LR
|
|
703
|
+
callidescope_cli["callidescope-cli"]
|
|
704
|
+
callidescope_configuration["callidescope-configuration"]
|
|
705
|
+
callidescope_core["callidescope-core"]
|
|
706
|
+
callidescope_examples["callidescope-examples"]
|
|
707
|
+
callidescope_graph["callidescope-graph"]
|
|
708
|
+
callidescope_nx["callidescope-nx"]
|
|
709
|
+
callidescope_output["callidescope-output"]
|
|
710
|
+
callidescope_cli --> callidescope_configuration
|
|
711
|
+
callidescope_configuration --> callidescope_core
|
|
712
|
+
callidescope_examples --> callidescope_configuration
|
|
713
|
+
callidescope_graph --> callidescope_configuration
|
|
714
|
+
callidescope_nx --> callidescope_configuration
|
|
715
|
+
callidescope_output --> callidescope_configuration
|
|
716
|
+
classDef subject fill:#7c3aed,color:#fff,stroke:#4c1d95,stroke-width:2px
|
|
717
|
+
class callidescope_configuration subject
|
|
718
|
+
```
|
|
719
|
+
<!-- codependix:end name="codependix-nx-projects" -->
|
|
720
|
+
|
|
721
|
+
### NestJS Module Graph
|
|
722
|
+
|
|
723
|
+
<!-- codependix:start name="codependix-nestjs-modules" -->
|
|
724
|
+
```mermaid
|
|
725
|
+
flowchart LR
|
|
726
|
+
ConfigurationFileModule
|
|
727
|
+
ConfigurationModule
|
|
728
|
+
FlagResolutionModule
|
|
729
|
+
InputModule
|
|
730
|
+
RunPlanModule
|
|
731
|
+
ConfigurationModule --> ConfigurationFileModule
|
|
732
|
+
ConfigurationModule --> InputModule
|
|
733
|
+
ConfigurationModule --> RunPlanModule
|
|
734
|
+
RunPlanModule --> FlagResolutionModule
|
|
735
|
+
```
|
|
736
|
+
<!-- codependix:end name="codependix-nestjs-modules" -->
|
|
737
|
+
|
|
738
|
+
### File Imports
|
|
739
|
+
|
|
740
|
+
<!-- codependix:start name="codependix-file-imports" -->
|
|
741
|
+
```mermaid
|
|
742
|
+
graph LR
|
|
743
|
+
file_callidescope_config_ts["callidescope.config.ts"]
|
|
744
|
+
file_codependix_config_ts["codependix.config.ts"]
|
|
745
|
+
file_codometer_config_ts["codometer.config.ts"]
|
|
746
|
+
file_eslint_config_ts["eslint.config.ts"]
|
|
747
|
+
file_src_index_ts["src/index.ts"]
|
|
748
|
+
file_src_index_unit_test_ts["src/index.unit.test.ts"]
|
|
749
|
+
file_src_modules_configuration_configuration_file_module_ts["src/modules/configuration/configuration-file.module.ts"]
|
|
750
|
+
file_src_modules_configuration_configuration_file_service_ts["src/modules/configuration/configuration-file.service.ts"]
|
|
751
|
+
file_src_modules_configuration_configuration_file_service_unit_test_ts["src/modules/configuration/configuration-file.service.unit.test.ts"]
|
|
752
|
+
file_src_modules_configuration_configuration_file_types_ts["src/modules/configuration/configuration-file.types.ts"]
|
|
753
|
+
file_src_modules_configuration_configuration_constants_ts["src/modules/configuration/configuration.constants.ts"]
|
|
754
|
+
file_src_modules_configuration_configuration_module_ts["src/modules/configuration/configuration.module.ts"]
|
|
755
|
+
file_src_modules_configuration_configuration_module_unit_test_ts["src/modules/configuration/configuration.module.unit.test.ts"]
|
|
756
|
+
file_src_modules_configuration_configuration_service_ts["src/modules/configuration/configuration.service.ts"]
|
|
757
|
+
file_src_modules_configuration_configuration_service_unit_test_ts["src/modules/configuration/configuration.service.unit.test.ts"]
|
|
758
|
+
file_src_modules_configuration_configuration_types_ts["src/modules/configuration/configuration.types.ts"]
|
|
759
|
+
file_src_modules_configuration_project_configuration_service_ts["src/modules/configuration/project-configuration.service.ts"]
|
|
760
|
+
file_src_modules_configuration_project_configuration_service_unit_test_ts["src/modules/configuration/project-configuration.service.unit.test.ts"]
|
|
761
|
+
file_src_modules_flag_resolution_flag_resolution_constants_ts["src/modules/flag-resolution/flag-resolution.constants.ts"]
|
|
762
|
+
file_src_modules_flag_resolution_flag_resolution_module_ts["src/modules/flag-resolution/flag-resolution.module.ts"]
|
|
763
|
+
file_src_modules_flag_resolution_flag_resolution_service_ts["src/modules/flag-resolution/flag-resolution.service.ts"]
|
|
764
|
+
file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts["src/modules/flag-resolution/flag-resolution.service.unit.test.ts"]
|
|
765
|
+
file_src_modules_flag_resolution_flag_resolution_types_ts["src/modules/flag-resolution/flag-resolution.types.ts"]
|
|
766
|
+
file_src_modules_input_input_constants_ts["src/modules/input/input.constants.ts"]
|
|
767
|
+
file_src_modules_input_input_module_ts["src/modules/input/input.module.ts"]
|
|
768
|
+
file_src_modules_input_input_service_ts["src/modules/input/input.service.ts"]
|
|
769
|
+
file_src_modules_input_input_service_unit_test_ts["src/modules/input/input.service.unit.test.ts"]
|
|
770
|
+
file_src_modules_input_input_types_ts["src/modules/input/input.types.ts"]
|
|
771
|
+
file_src_modules_run_plan_run_plan_constants_ts["src/modules/run-plan/run-plan.constants.ts"]
|
|
772
|
+
file_src_modules_run_plan_run_plan_module_ts["src/modules/run-plan/run-plan.module.ts"]
|
|
773
|
+
file_src_modules_run_plan_run_plan_service_ts["src/modules/run-plan/run-plan.service.ts"]
|
|
774
|
+
file_src_modules_run_plan_run_plan_service_unit_test_ts["src/modules/run-plan/run-plan.service.unit.test.ts"]
|
|
775
|
+
file_src_modules_run_plan_run_plan_types_ts["src/modules/run-plan/run-plan.types.ts"]
|
|
776
|
+
file_testing_mocks_ts["testing/mocks.ts"]
|
|
777
|
+
file_testing_setup_ts["testing/setup.ts"]
|
|
778
|
+
file_vite_config_ts["vite.config.ts"]
|
|
779
|
+
file_vitest_config_ts["vitest.config.ts"]
|
|
780
|
+
file_src_index_unit_test_ts --> file_src_index_ts
|
|
781
|
+
file_src_modules_configuration_configuration_file_module_ts --> file_src_modules_configuration_configuration_file_service_ts
|
|
782
|
+
file_src_modules_configuration_configuration_file_service_ts --> file_src_modules_configuration_configuration_constants_ts
|
|
783
|
+
file_src_modules_configuration_configuration_file_service_ts --> file_src_modules_configuration_configuration_types_ts
|
|
784
|
+
file_src_modules_configuration_configuration_file_service_unit_test_ts --> file_src_modules_configuration_configuration_file_service_ts
|
|
785
|
+
file_src_modules_configuration_configuration_file_service_unit_test_ts --> file_src_modules_configuration_configuration_constants_ts
|
|
786
|
+
file_src_modules_configuration_configuration_file_types_ts --> file_src_modules_configuration_configuration_types_ts
|
|
787
|
+
file_src_modules_configuration_configuration_constants_ts --> file_src_modules_configuration_configuration_types_ts
|
|
788
|
+
file_src_modules_configuration_configuration_module_ts --> file_src_modules_configuration_configuration_file_module_ts
|
|
789
|
+
file_src_modules_configuration_configuration_module_ts --> file_src_modules_configuration_configuration_service_ts
|
|
790
|
+
file_src_modules_configuration_configuration_module_ts --> file_src_modules_configuration_project_configuration_service_ts
|
|
791
|
+
file_src_modules_configuration_configuration_module_ts --> file_src_modules_input_input_module_ts
|
|
792
|
+
file_src_modules_configuration_configuration_module_ts --> file_src_modules_run_plan_run_plan_module_ts
|
|
793
|
+
file_src_modules_configuration_configuration_module_unit_test_ts --> file_src_modules_configuration_configuration_module_ts
|
|
794
|
+
file_src_modules_configuration_configuration_module_unit_test_ts --> file_src_modules_configuration_configuration_service_ts
|
|
795
|
+
file_src_modules_configuration_configuration_module_unit_test_ts --> file_src_modules_configuration_project_configuration_service_ts
|
|
796
|
+
file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_file_service_ts
|
|
797
|
+
file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_file_types_ts
|
|
798
|
+
file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_constants_ts
|
|
799
|
+
file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_types_ts
|
|
800
|
+
file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_project_configuration_service_ts
|
|
801
|
+
file_src_modules_configuration_configuration_service_ts --> file_src_modules_input_input_service_ts
|
|
802
|
+
file_src_modules_configuration_configuration_service_ts --> file_src_modules_input_input_types_ts
|
|
803
|
+
file_src_modules_configuration_configuration_service_ts --> file_src_modules_run_plan_run_plan_service_ts
|
|
804
|
+
file_src_modules_configuration_configuration_service_ts --> file_src_modules_run_plan_run_plan_types_ts
|
|
805
|
+
file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_file_service_ts
|
|
806
|
+
file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_service_ts
|
|
807
|
+
file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_types_ts
|
|
808
|
+
file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_project_configuration_service_ts
|
|
809
|
+
file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_input_input_service_ts
|
|
810
|
+
file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_input_input_types_ts
|
|
811
|
+
file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_run_plan_run_plan_service_ts
|
|
812
|
+
file_src_modules_configuration_project_configuration_service_ts --> file_src_modules_configuration_configuration_file_types_ts
|
|
813
|
+
file_src_modules_configuration_project_configuration_service_ts --> file_src_modules_configuration_configuration_constants_ts
|
|
814
|
+
file_src_modules_configuration_project_configuration_service_ts --> file_src_modules_configuration_configuration_types_ts
|
|
815
|
+
file_src_modules_configuration_project_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_file_service_ts
|
|
816
|
+
file_src_modules_configuration_project_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_constants_ts
|
|
817
|
+
file_src_modules_configuration_project_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_types_ts
|
|
818
|
+
file_src_modules_configuration_project_configuration_service_unit_test_ts --> file_src_modules_configuration_project_configuration_service_ts
|
|
819
|
+
file_src_modules_flag_resolution_flag_resolution_constants_ts --> file_src_modules_configuration_configuration_constants_ts
|
|
820
|
+
file_src_modules_flag_resolution_flag_resolution_constants_ts --> file_src_modules_input_input_constants_ts
|
|
821
|
+
file_src_modules_flag_resolution_flag_resolution_module_ts --> file_src_modules_flag_resolution_flag_resolution_service_ts
|
|
822
|
+
file_src_modules_flag_resolution_flag_resolution_service_ts --> file_src_modules_configuration_configuration_constants_ts
|
|
823
|
+
file_src_modules_flag_resolution_flag_resolution_service_ts --> file_src_modules_configuration_configuration_types_ts
|
|
824
|
+
file_src_modules_flag_resolution_flag_resolution_service_ts --> file_src_modules_flag_resolution_flag_resolution_constants_ts
|
|
825
|
+
file_src_modules_flag_resolution_flag_resolution_service_ts --> file_src_modules_flag_resolution_flag_resolution_types_ts
|
|
826
|
+
file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts --> file_src_modules_configuration_configuration_file_service_ts
|
|
827
|
+
file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts --> file_src_modules_configuration_configuration_constants_ts
|
|
828
|
+
file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts --> file_src_modules_configuration_configuration_types_ts
|
|
829
|
+
file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts --> file_src_modules_flag_resolution_flag_resolution_service_ts
|
|
830
|
+
file_src_modules_flag_resolution_flag_resolution_service_unit_test_ts --> file_src_modules_flag_resolution_flag_resolution_types_ts
|
|
831
|
+
file_src_modules_flag_resolution_flag_resolution_types_ts --> file_src_modules_configuration_configuration_types_ts
|
|
832
|
+
file_src_modules_input_input_module_ts --> file_src_modules_input_input_service_ts
|
|
833
|
+
file_src_modules_input_input_service_ts --> file_src_modules_input_input_constants_ts
|
|
834
|
+
file_src_modules_input_input_service_ts --> file_src_modules_input_input_types_ts
|
|
835
|
+
file_src_modules_input_input_service_unit_test_ts --> file_src_modules_input_input_service_ts
|
|
836
|
+
file_src_modules_run_plan_run_plan_module_ts --> file_src_modules_flag_resolution_flag_resolution_module_ts
|
|
837
|
+
file_src_modules_run_plan_run_plan_module_ts --> file_src_modules_run_plan_run_plan_service_ts
|
|
838
|
+
file_src_modules_run_plan_run_plan_service_ts --> file_src_modules_configuration_configuration_file_types_ts
|
|
839
|
+
file_src_modules_run_plan_run_plan_service_ts --> file_src_modules_flag_resolution_flag_resolution_constants_ts
|
|
840
|
+
file_src_modules_run_plan_run_plan_service_ts --> file_src_modules_flag_resolution_flag_resolution_service_ts
|
|
841
|
+
file_src_modules_run_plan_run_plan_service_ts --> file_src_modules_run_plan_run_plan_constants_ts
|
|
842
|
+
file_src_modules_run_plan_run_plan_service_ts --> file_src_modules_run_plan_run_plan_types_ts
|
|
843
|
+
file_src_modules_run_plan_run_plan_service_unit_test_ts --> file_src_modules_configuration_configuration_file_service_ts
|
|
844
|
+
file_src_modules_run_plan_run_plan_service_unit_test_ts --> file_src_modules_configuration_configuration_types_ts
|
|
845
|
+
file_src_modules_run_plan_run_plan_service_unit_test_ts --> file_src_modules_flag_resolution_flag_resolution_service_ts
|
|
846
|
+
file_src_modules_run_plan_run_plan_service_unit_test_ts --> file_src_modules_run_plan_run_plan_service_ts
|
|
847
|
+
file_src_modules_run_plan_run_plan_types_ts --> file_src_modules_configuration_configuration_types_ts
|
|
848
|
+
```
|
|
849
|
+
<!-- codependix:end name="codependix-file-imports" -->
|
|
850
|
+
|
|
851
|
+
<!-- codometer:start -->
|
|
852
|
+
|
|
853
|
+
## ⏲️ Codometer
|
|
854
|
+
|
|
855
|
+
### Project
|
|
856
|
+
|
|
857
|
+

|
|
858
|
+

|
|
859
|
+

|
|
860
|
+

|
|
861
|
+
|
|
862
|
+
### Measured Targets
|
|
863
|
+
|
|
864
|
+

|
|
865
|
+
|
|
866
|
+
### TypeScript
|
|
867
|
+
|
|
868
|
+

|
|
869
|
+

|
|
870
|
+

|
|
871
|
+

|
|
872
|
+

|
|
873
|
+

|
|
874
|
+

|
|
875
|
+
|
|
876
|
+
### JavaScript
|
|
877
|
+
|
|
878
|
+

|
|
879
|
+

|
|
880
|
+

|
|
881
|
+

|
|
882
|
+

|
|
883
|
+

|
|
884
|
+

|
|
885
|
+

|
|
886
|
+

|
|
887
|
+

|
|
888
|
+

|
|
889
|
+

|
|
890
|
+

|
|
891
|
+

|
|
892
|
+
|
|
893
|
+
### Python
|
|
894
|
+
|
|
895
|
+

|
|
896
|
+

|
|
897
|
+

|
|
898
|
+

|
|
899
|
+

|
|
900
|
+

|
|
901
|
+

|
|
902
|
+

|
|
903
|
+

|
|
904
|
+

|
|
905
|
+

|
|
906
|
+

|
|
907
|
+
|
|
908
|
+
### JSON
|
|
909
|
+
|
|
910
|
+

|
|
911
|
+

|
|
912
|
+

|
|
913
|
+

|
|
914
|
+

|
|
915
|
+

|
|
916
|
+

|
|
917
|
+

|
|
918
|
+

|
|
919
|
+

|
|
920
|
+

|
|
921
|
+

|
|
922
|
+
|
|
923
|
+
### YAML
|
|
924
|
+
|
|
925
|
+

|
|
926
|
+

|
|
927
|
+

|
|
928
|
+

|
|
929
|
+

|
|
930
|
+

|
|
931
|
+

|
|
932
|
+

|
|
933
|
+

|
|
934
|
+

|
|
935
|
+

|
|
936
|
+
|
|
937
|
+
### TOML
|
|
938
|
+
|
|
939
|
+

|
|
940
|
+

|
|
941
|
+

|
|
942
|
+

|
|
943
|
+

|
|
944
|
+

|
|
945
|
+

|
|
946
|
+
|
|
947
|
+
### Shell
|
|
948
|
+
|
|
949
|
+

|
|
950
|
+

|
|
951
|
+

|
|
952
|
+

|
|
953
|
+

|
|
954
|
+

|
|
955
|
+

|
|
956
|
+

|
|
957
|
+

|
|
958
|
+

|
|
959
|
+

|
|
960
|
+
|
|
961
|
+
### SQL
|
|
962
|
+
|
|
963
|
+

|
|
964
|
+

|
|
965
|
+

|
|
966
|
+

|
|
967
|
+

|
|
968
|
+

|
|
969
|
+

|
|
970
|
+

|
|
971
|
+

|
|
972
|
+

|
|
973
|
+

|
|
974
|
+
|
|
975
|
+
### HCL
|
|
976
|
+
|
|
977
|
+

|
|
978
|
+

|
|
979
|
+

|
|
980
|
+

|
|
981
|
+

|
|
982
|
+

|
|
983
|
+

|
|
984
|
+

|
|
985
|
+

|
|
986
|
+
|
|
987
|
+
### CSS
|
|
988
|
+
|
|
989
|
+

|
|
990
|
+

|
|
991
|
+

|
|
992
|
+

|
|
993
|
+

|
|
994
|
+

|
|
995
|
+

|
|
996
|
+

|
|
997
|
+

|
|
998
|
+
|
|
999
|
+
### Conventions
|
|
1000
|
+
|
|
1001
|
+

|
|
1002
|
+

|
|
1003
|
+

|
|
1004
|
+

|
|
1005
|
+

|
|
1006
|
+

|
|
1007
|
+

|
|
1008
|
+

|
|
1009
|
+

|
|
1010
|
+

|
|
1011
|
+

|
|
1012
|
+

|
|
1013
|
+

|
|
1014
|
+

|
|
1015
|
+

|
|
1016
|
+

|
|
1017
|
+

|
|
1018
|
+

|
|
1019
|
+
|
|
1020
|
+
### Jupyter
|
|
1021
|
+
|
|
1022
|
+

|
|
1023
|
+

|
|
1024
|
+

|
|
1025
|
+

|
|
1026
|
+

|
|
1027
|
+

|
|
1028
|
+

|
|
1029
|
+

|
|
1030
|
+

|
|
1031
|
+

|
|
1032
|
+

|
|
1033
|
+

|
|
1034
|
+

|
|
1035
|
+

|
|
1036
|
+

|
|
1037
|
+

|
|
1038
|
+

|
|
1039
|
+

|
|
1040
|
+

|
|
1041
|
+

|
|
1042
|
+
|
|
1043
|
+
### Markdown
|
|
1044
|
+
|
|
1045
|
+

|
|
1046
|
+

|
|
1047
|
+

|
|
1048
|
+

|
|
1049
|
+

|
|
1050
|
+

|
|
1051
|
+

|
|
1052
|
+

|
|
1053
|
+

|
|
1054
|
+

|
|
1055
|
+

|
|
1056
|
+

|
|
1057
|
+

|
|
1058
|
+

|
|
1059
|
+

|
|
1060
|
+

|
|
1061
|
+

|
|
1062
|
+

|
|
1063
|
+

|
|
1064
|
+

|
|
1065
|
+
<!-- codometer:end -->
|
|
1066
|
+
|
|
1067
|
+
<!-- A deliberate misspelling: the example of a `--format` value nobody
|
|
1068
|
+
recognizes, which is exactly what this refusal is about.
|
|
1069
|
+
cspell:ignore mermiad -->
|