npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@codometer/configuration

v0.0.34

Published

Configuration loader, limit definitions, and counter resolution for Codometer

Readme

⏲️ Codometer Configuration

npm

The configuration reference for Codometer.

@codometer/configuration reads a repository's codometer.config.ts and hands back a fully defaulted configuration object. It is the only package that knows anything about a particular repository; @codometer/cli measures whatever the configuration describes.

npm install --save-dev @codometer/configuration

Install it directly when you are typing a configuration file. @codometer/cli already depends on it.

Configuration File

A codometer.config.{ts,mts,cts,js,mjs,cjs,json,jsonc} file is read from the path the run is given with --config <path>, which is required: nothing is searched for and there is no default file. format is the one field every configuration must set — there is no code-level fallback for it — and every other field is optional.

import { type CodometerConfiguration } from "@codometer/configuration";

const codometerConfiguration: CodometerConfiguration = {
  // Which report shape this run produces. Required; no default.
  format: "markdown",
  // Appended to the built-in exclusions (node_modules, dist, build, coverage,
  // .nx), matched against repository-relative paths with `path.matchesGlob`.
  exclude: ["notepads/**", "**/templates/**"],
  // Ignore files in gitignore syntax, whose patterns exclude as well.
  excludeFrom: ["projects/configuration/.codometerignore"],
  // Named sets of files measured alongside the codebase itself. The built-in
  // `codebase` whole-tree scan is always present unless one of these entries
  // replaces it by name.
  inputs: [
    {
      analyses: ["size"],
      compression: "gzip",
      include: ["dist/**/*.js", "!dist/**/*.map.js"],
      name: "compiled",
    },
  ],
  // Target an unqualified limit path belongs to.
  defaultInput: "codebase",
  // How high each measured metric may go.
  limits: [
    { metric: "compiled.size", value: "8 KB" },
    { metric: "typescript.interfaces", severity: "warn", value: 500 },
  ],
  // Destinations the measured statistics are written to.
  outputs: [
    { indentation: 2, path: "output/codometer.json", type: "json" },
    {
      description: "Measured on every push.",
      // Named something other than the defaults on purpose: a file holding the
      // default start marker anywhere — a document like this one, explaining
      // it — reads as already carrying the block, and gets no block of its own.
      endMarker: "<!-- STATISTICS_END -->",
      path: "README.md",
      startMarker: "<!-- STATISTICS_START -->",
      type: "markdown",
    },
  ],
  // Interpreter used for Python analysis; defaults to `python3`.
  python: { command: "uv run python" },
};

export default codometerConfiguration;

Output paths are resolved relative to the process's working directory, not to the configuration file, so a configuration kept in a projects/configuration/ folder still writes to the repository root.

Resolution

The configuration path is required: ConfigurationService.loadConfiguration takes a configurationPath and nothing else, and the CLI refuses a run without --config. A relative path is resolved against the working directory, then the repository root; a path naming no file fails with a not-found error.

The named file answers alone: no ancestor's configuration is folded into it. Merging would leave a limit that never applied looking exactly like one that did, and telling them apart would mean knowing which of several files each field came from. A configuration file is always read as a plain object — one exported as a function is not recognized, and falls back to an empty configuration, the same way a file exporting 42 does.

What Gets Measured

Discovery walks the directory itself and reads every .gitignore it passes, so .gitignore is already in force: a build directory or a virtual environment is pruned where its ignore file names it, and no exclusion has to name it again. Git is never invoked, so a directory that is not a repository at all is measured the same way as one that is, and what is measured is the working tree rather than the index — a file that exists and is not ignored counts, whether or not it has been committed yet. What the two exclusion options are for is the opposite case: files that are kept but that nobody wrote.

| Option | Syntax | Use it for | | ------ | ------ | ---------- | | exclude | Globs, matched with path.matchesGlob | A handful of paths named inline, appended to the built-in defaults | | excludeFrom | Paths to ignore files, in gitignore syntax | Lockfiles, vendored bundles, generated documentation — the list a repository would rather keep in a file |

excludeFrom files are read as gitignore syntax and matched natively, so negations, anchoring, and directory patterns behave exactly as they do in a .gitignore, and pointing codometer at a file another tool already reads gives the same answer that tool gets. Matching is case-sensitive on every platform, deliberately: git takes that from whichever filesystem it finds itself on, and a measurement that disagrees with itself between a laptop and CI is worse than a strict one.

One caution when reusing an existing ignore file: most are written for one tool's concerns, not for measurement. A .prettierignore typically ignores all markdown because a markdown linter handles it — point codometer at that and the prose metrics vanish. A dedicated .codometerignore is usually the better answer.

Inputs

An input is a named set of files, declared by include and exclude globs, together with the analyses run over it. inputs is an array — replacing what used to be called targets — and one entry is always there whether or not a configuration declares any: the built-in codebase scan, which measures everything the ignore files leave behind and runs language analysis over it.

inputs: [
  {
    analyses: ["size"],
    compression: "gzip",
    exclude: ["dist/vendor/**"],
    include: ["dist/**/*.js", "!dist/**/*.map.js"],
    name: "compiled",
  },
],

| Field | Required | Default | Meaning | | ----- | -------- | ------- | ------- | | name | yes | — | What the input is called. Two inputs may not share one | | include | yes | — | Globs that add files. At least one must add rather than remove | | exclude | no | none | Globs that remove files | | analyses | yes | — | language, size, or both. At least one | | compression | no | gzip | gzip, brotli, or none for the bytes on disk | | directory | no | . | Where the input's globs start, relative to the process's working directory |

language runs the same analyzers the codebase gets. size compresses each matched file on its own and sums the results — never all of them together, which would find matches across file boundaries and report a total no client ever receives. Gzip compresses at level 9 and brotli at quality 11, both stated explicitly rather than left to a library default.

A ! prefix in include removes files instead of adding them. Negations are collected into one set applied to the whole input rather than in the order they were written, so rearranging the array cannot change which files the input holds. A ! in exclude is rejected: that list already removes files, so there is nothing there to negate.

Ignore files are not consulted for a declared input. That is deliberate, and it is what lets one measure compiled output — a directory every .gitignore claims, which is exactly why no ignore rule may reach it. A file an input matched but cannot be read fails the run rather than counting as zero bytes: a total quietly short by one file is worse than no total at all.

Replacing The Built-In Codebase Input

Declaring an input named codebase replaces the built-in whole-tree scan rather than adding beside it:

inputs: [
  { analyses: ["language", "size"], compression: "none", include: ["**/*"], name: "codebase" },
],

Only its compression and analyses are read. Its include and exclude globs are not consulted at all — the whole-tree scan is discovered by walking the repository's ignore files rather than by matching globs, so the include: ["**/*"] above is a placeholder, and narrowing it to src/** would not narrow anything. To measure a subset of the tree, declare an input under some other name.

This is the only way to measure the whole tree under a different compression or set of analyses than the built-in entry runs.

Limits

A limit is how high one measured metric may go. Any metric can carry one — a compressed size, a line count, a counter for one of the conventions below — and a metric nothing limits is measured and reported exactly as before, gated by nothing.

defaultInput: "codebase",
limits: [
  { metric: "Compiled JavaScript.size", value: "8 KB" },
  { label: "Interfaces", metric: "typescript.interfaces", value: 500 },
  { metric: "linesOfCode", severity: "warn", value: 100_000 },
],

| Field | Required | Default | Meaning | | ----- | -------- | ------- | ------- | | metric | yes | — | Dotted path of the metric this limits | | value | yes | — | How high the metric may go, as a number or a string with a unit | | severity | no | fail | fail stops the run on a breach; warn reports it | | label | no | the path | What to call the limit in a report |

A metric is addressed by the input's name followed by its path within that input — codebase.typescript.interfaces, codebase.markdown.files, Compiled JavaScript.size. Every input carries files, an input running size analysis carries size, and one running language analysis carries every counter the codebase measurement lists, with configured counters under custom.<label>. Set defaultInput and a path naming no input is read as that input's.

Where a defaultInput is set, a path is read as that input's whenever no input name prefixes it — so with defaultInput: "codebase" and an input called typescript, typescript.interfaces is the codebase's, because the typescript input has no interfaces metric of its own to compete with it. Write the input name in full wherever an input and a metric group share one.

Ambiguity is refused, never resolved. A path that could name two metrics — an input called markdown beside the codebase's own markdown.files — fails the run naming both readings, as does a path naming none, or one naming a metric from an analysis the input never ran. A limit that quietly bound to the wrong metric would look exactly like one that works.

A value written as a string carries a decimal unit whose trailing b is required: "8 KB" is 8000 bytes and "1 MB" is 1000000, while "8 K" is not a size and is refused rather than read as anything. A value nothing can read fails the run instead of being taken as zero.

An input that matched no files fails the run if and only if a limit is written against it. Declaring a limit asserts the files are there, so an empty match is a glob that stopped matching or a build that never ran — while an input nobody limited simply measured zero, which is unremarkable.

Custom Statistics

A repository that names files by convention has a vocabulary no language analyzer knows about. The top-level custom array is what measures these counters, regardless of whether — or where — any output renders them:

custom: [
  { label: "Service Files", patterns: ["**/*.service.ts"] },
  { label: "Unit Tests", patterns: ["**/*.unit.test.ts"] },
  { color: "16a34a", label: "Migrations", patterns: ["**/migrations/*.sql"] },
],

Each entry becomes one badge, in the order it was configured, everywhere it is selected. Globs are matched against repository-relative paths with path.matchesGlob over the same discovered files everything else measures, so exclusions apply. A file matching several of one entry's globs counts once. color is a shields.io hexadecimal triplet; entries that omit it take the next color from a built-in palette, cycling so a counter's color stays the same between runs.

A counter selects what it counts with one of three fields — patterns, symbols, or comment — and needs at least one of them, or it is rejected as counting nothing.

An output's own custom array is a separate, later concern: it selects, by label, which of the top-level counters that destination renders — it never declares a counter of its own. A JSON report and a markdown report may still select entirely different labels:

custom: [
  { label: "Service Files", patterns: ["**/*.service.ts"] },
  { label: "Unit Tests", patterns: ["**/*.unit.test.ts"] },
],
outputs: [
  { custom: ["Service Files"], path: "codometer-report.json", type: "json" },
  { custom: ["Unit Tests"], path: "README.md", type: "markdown" },
],

A label an output selects that the top-level custom never declared is refused when the configuration loads — selection cannot conjure a counter that was never measured. A counter the top level declares but no output selects is still measured and still gates a limit; it simply renders nowhere.

Counting Declarations

symbols counts declarations in TypeScript and JavaScript sources instead of files. It asks for one or more kinds, optionally narrowed to declarations carrying every named modifier:

custom: [
  {
    group: "typescript",
    label: "Static Methods",
    symbols: { kinds: ["method"], modifiers: ["static"] },
  },
  { label: "Abstract Classes", symbols: { kinds: ["class"], modifiers: ["abstract"] } },
],

kinds are class, enum, function, getter, interface, method, property, and setter. modifiers are abstract, async, export, override, private, protected, public, readonly, and static.

Both are read literally, from the syntax. A callable written as a class member is a method; one written anywhere else is a function, arrow functions included. A class field holding an arrow function is a property, and the arrow carries none of the field's modifiers — so a static build = () => {} is found by asking for static properties, not static methods. public matches members annotated public, not members that are public by omission, and private does not match a #name field, which carries no modifier at all.

A symbol counter may also carry patterns, which then narrows which files are searched rather than being what is counted — patterns: ["packages/**"] with a symbols matcher counts declarations in packages/. Counting happens during the walk the TypeScript analyzer already makes, so any number of these costs one pass over the sources.

Selecting A Comment Budget

comment selects a comment budget for a counter to measure, rather than counting files or declarations:

custom: [
  { comment: { language: "yaml", maximumWords: 128 }, label: "YAML Comment Budget" },
  { comment: { kind: "class", maximumLines: 24 }, label: "Class Comment Budget" },
],

| Field | Required | Default | Meaning | | ----- | -------- | ------- | ------- | | language | no | every language with comments | Narrows the budget to one of css, hcl, python, shell, sql, toml, typescript, yaml | | kind | no | a plain comment block | Narrows to a documented declaration's JSDoc-style comment for this declaration kind | | maximumCharacters | no | — | How many characters a block may hold, markers and newlines and all | | maximumLines | no | — | How many lines a block may span | | maximumWords | no | — | How many words of prose a block may hold, once markers are stripped | | severity | no | fail | fail stops the run on a breach; warn reports it |

Its value is a count — how many blocks broke the selector's own maximumCharacters/maximumLines/maximumWords — and its instances names each breaching block's file and 1-indexed line, plus how much it measured. A block that stayed within budget contributes to neither.

An entry with none of patterns, symbols, or comment is rejected rather than reported as a permanent zero.

Where A Counter Renders

group names the badge group a counter is rendered into, after that group's built-in badges. It defaults to conventions — a group that exists only for these counters and is omitted entirely when none belong to it. Any rendered group may be named instead: css, hcl, json, jupyter, markdown, python, repository, shell, sql, toml, typescript, or yaml. A name outside that set fails the configuration rather than rendering nowhere.

The default palette runs per group over the top-level custom array, so adding a counter to one group never recolors the badges of another. A counter's color is settled once there — an output selecting it back out by label renders whichever color that resolution gave it, rather than cycling its own palette.

Outputs

outputs is an array of typed destinations, replacing what used to be one fixed-key output object. Declare as many as you like, including more than one of a kind:

outputs: [
  { indentation: 2, path: "output/codometer.json", type: "json" },
  { path: "README.md", type: "markdown" },
],

A JSON entry needs path; indentation defaults to 2. A markdown entry needs a path, a write function, or both — a destination naming neither is rejected when the configuration loads.

Writing Markdown

The default markdown report is a description paragraph followed by shields.io badges under one ### heading per language, spliced between two anchor markers. write is the whole of the customizable behavior — it both decides what the report says and where it lands, replacing what used to be two separate render and write callbacks:

{
  path: "README.md",
  type: "markdown",
  write: ({ anchors, renderBadges, statistics }) =>
    anchors.syncAnchoredBlock({
      content: `Lines of code: ${statistics.linesOfCode}\n\n${renderBadges()}`,
    }),
}

| Argument | Meaning | | -------- | ------- | | description | The configured description, for a writer that wants to place it itself | | renderBadges() | The built-in badge rendering of these same statistics — call it to build the default content, or to add to it | | statistics | The measured statistics | | check | True when nothing may be written and the file is only being inspected | | path | The configured path, resolved against the process's working directory | | anchors | The marker mechanics, so choosing a different file does not mean reimplementing the splice |

| Anchor helper | Does | | ------------- | ---- | | anchors.syncAnchoredBlock({ content?, path? }) | Splices the block into a file, appending when the markers are absent and creating the file when it is missing. In check mode it compares instead of writing and returns whether the file is current. | | anchors.wrapInAnchors(content?) | Returns the content wrapped in the markers, for a writer placing it somewhere itself. | | anchors.startMarker / anchors.endMarker | The configured markers. |

Leaving write unset keeps the built-in rendering and writing. A write function returns false to report its destination as stale, which is what fails a --check run; anything else counts as up to date.

Exports

ConfigurationService and ConfigurationModule, plus the CodometerConfiguration type you author your config as and the resolved shapes the CLI reads.

Test

nx run codometer-configuration:vitest

License

MIT — see LICENSE.

👔 Conformetry

This project was generated from the nestjs-service-project conformetry template.

🔭 Callidescope

Call stacks traced through projects/ic-suite/codometer/codometer-configuration, deepest first. Each frame shows what it takes, what it returns, and what its documentation says.

| Measure | Value | | --- | --- | | Callables | 75 | | Files | 19 | | Calls traced | 67 | | Call stacks | 6 | | Deepest stack | 3 | | Stacks through recursion | 0 | | Unfollowable calls | 1 |

Limits

What this project is judged against, as declared in its own callidescope.config.ts.

| Limit | Value | | --- | --- | | maximumDepth | 9 | | maximumBreadth | 7 |

Call stacks (depth)

1. superRefine(…) — depth 3 · orphan-root

🚀 superRefine(…)(…): void [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:209]
  └─> find(…)(…): boolean [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:211]
    └─> findIndex(…)(…): boolean [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:212]

2. callbackSchema — depth 2 · orphan-root

🚀 callbackSchema<CallbackType>(): z.ZodType<CallbackType> [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:36]
   ↳ Accepts a configured callback.
  └─> custom(…)(value: unknown): value is Function [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:37]

3. superRefine(…) — depth 2 · orphan-root

🚀 superRefine(…)(…): void [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:107]
  └─> some(…)(pattern: string): boolean [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:109]

4. refine(…) — depth 2 · orphan-root

🚀 refine(…)(…): boolean [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:166]
  └─> map(…)(…): string [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:167]

5. refine(…) — depth 2 · orphan-root

🚀 refine(…)(…): boolean [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:182]
  └─> map(…)(…): string [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:183]

6. superRefine(…) — depth 2 · orphan-root

🚀 superRefine(…)(…): void [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:227]
  └─> map(…)(…): string [projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:229]

Breadth

| Callable | Breadth | Calls directly | Location | | --- | --- | --- | --- | | ConfigurationFlagsService.readCheckNames | 4 | ConfigurationFlagsService.describeAcceptedCheckNames, ConfigurationFlagsService.filter(…), ConfigurationFlagsService.map(…), ConfigurationFlagsService.validateCheckNames | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-flags.service.ts:58 | | ConfigurationResolverService.resolveConfiguration | 4 | ConfigurationResolverService.resolveCustomStatistics, ConfigurationResolverService.resolveInputs, ConfigurationResolverService.resolveLimits, ConfigurationResolverService.resolveOutputs | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:336 | | ConfigurationLoaderService.load | 3 | ConfigurationLoaderService.resolveConfigurationPath, UnknownConfigurationFileTypeError.constructor, ConfigurationLoaderService.loadConfigurationModule | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-loader.service.ts:162 |

| Callable | Breadth | Calls directly | Location | | --- | --- | --- | --- | | ConfigurationResolverService.resolveInput | 3 | ConfigurationResolverService.map(…), ConfigurationResolverService.filter(…), ConfigurationResolverService.filter(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:196 | | ConfigurationService.loadConfigurationFile | 3 | ConfigurationLoaderService.load, ConfigurationService.resolveConfiguration, ConfigurationService.parseConfiguration | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration.service.ts:78 | | ConfigurationFlagsService.resolveFormat | 2 | ConfigurationFlagsService.find(…), ConfigurationFlagsService.map(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-flags.service.ts:173 | | ConfigurationLoaderService.loadConfigurationModule | 2 | ConfigurationLoaderService.loadJsonConfiguration, ConfigurationLoaderService.readDefaultExport | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-loader.service.ts:75 | | ConfigurationLoaderService.resolveConfigurationPath | 2 | ConfigurationLoaderService.findRepositoryRoot, ConfigurationFileNotFoundError.constructor | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-loader.service.ts:126 | | ConfigurationResolverService.parseLimitValue | 2 | ConfigurationResolverService.parseLimitValueText, InvalidLimitValueError.constructor | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:94 | | ConfigurationResolverService.resolveInputs | 2 | ConfigurationResolverService.some(…), ConfigurationResolverService.map(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:224 | | ConfigurationResolverService.map(…) | 2 | ConfigurationResolverService.resolveJsonOutput, ConfigurationResolverService.resolveMarkdownOutput | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:292 | | ConfigurationResolverService.selectCustomStatistics | 2 | ConfigurationResolverService.map(…), ConfigurationResolverService.flatMap(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:308 | | callbackSchema | 1 | custom(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:36 | | superRefine(…) | 1 | some(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:107 | | refine(…) | 1 | map(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:166 | | refine(…) | 1 | map(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:182 | | superRefine(…) | 1 | find(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:209 | | find(…) | 1 | findIndex(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:211 | | superRefine(…) | 1 | map(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-schema.constants.ts:227 | | ConfigurationFlagsService.describeAcceptedCheckNames | 1 | ConfigurationFlagsService.map(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-flags.service.ts:47 | | ConfigurationFlagsService.validateCheckNames | 1 | ConfigurationFlagsService.describeAcceptedCheckNames | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-flags.service.ts:90 | | ConfigurationFlagsService.parseDefaultedOption | 1 | ConfigurationFlagsService.parseOptionalOption | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-flags.service.ts:116 | | ConfigurationFlagsService.parseDirectoryOption | 1 | ConfigurationFlagsService.parseDefaultedOption | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-flags.service.ts:127 | | ConfigurationFlagsService.requireConfigurationPath | 1 | ConfigurationPathRequiredError.constructor | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-flags.service.ts:154 | | ConfigurationFlagsService.selectMode | 1 | ConfigurationFlagsService.readCheckNames | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-flags.service.ts:203 | | ConfigurationLoaderService.findRepositoryRoot | 1 | ConfigurationLoaderService.some(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-loader.service.ts:51 | | ConfigurationResolverService.parseConfigurationInternal | 1 | InvalidConfigurationError.constructor | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:75 | | ConfigurationResolverService.parseLimitValueText | 1 | InvalidLimitValueError.constructor | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:114 | | ConfigurationResolverService.resolveCustomStatistics | 1 | ConfigurationResolverService.map(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:150 | | ConfigurationResolverService.map(…) | 1 | ConfigurationResolverService.resolveInput | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:235 | | ConfigurationResolverService.resolveJsonOutput | 1 | ConfigurationResolverService.selectCustomStatistics | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:239 | | ConfigurationResolverService.resolveLimits | 1 | ConfigurationResolverService.map(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:258 | | ConfigurationResolverService.map(…) | 1 | ConfigurationResolverService.parseLimitValue | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:261 | | ConfigurationResolverService.resolveMarkdownOutput | 1 | ConfigurationResolverService.selectCustomStatistics | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:270 | | ConfigurationResolverService.resolveOutputs | 1 | ConfigurationResolverService.map(…) | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:288 | | ConfigurationResolverService.parseConfiguration | 1 | ConfigurationResolverService.parseConfigurationInternal | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration-resolver.service.ts:326 | | ConfigurationService.loadConfiguration | 1 | ConfigurationService.loadConfigurationFile | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration.service.ts:63 | | ConfigurationService.parseConfiguration | 1 | ConfigurationResolverService.parseConfiguration | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration.service.ts:92 | | ConfigurationService.parseDefaultedOption | 1 | ConfigurationFlagsService.parseDefaultedOption | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration.service.ts:97 | | ConfigurationService.parseDirectoryOption | 1 | ConfigurationFlagsService.parseDirectoryOption | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration.service.ts:102 | | ConfigurationService.parseOptionalOption | 1 | ConfigurationFlagsService.parseOptionalOption | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration.service.ts:107 | | ConfigurationService.requireConfigurationPath | 1 | ConfigurationFlagsService.requireConfigurationPath | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration.service.ts:112 | | ConfigurationService.resolveConfiguration | 1 | ConfigurationResolverService.resolveConfiguration | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration.service.ts:123 | | ConfigurationService.resolveFormat | 1 | ConfigurationFlagsService.resolveFormat | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration.service.ts:132 | | ConfigurationService.selectMode | 1 | ConfigurationFlagsService.selectMode | projects/ic-suite/codometer/codometer-configuration/src/modules/configuration/configuration.service.ts:145 |

🕸️ Codependix

Dependency graphs exported by codependix, regenerated by nx run configuration:codependix:write.

Nx Neighborhood

graph LR
  codometer_cli["codometer-cli"]
  codometer_configuration["codometer-configuration"]
  codometer_core["codometer-core"]
  codometer_examples["codometer-examples"]
  codometer_languages["codometer-languages"]
  codometer_measurement["codometer-measurement"]
  codometer_output["codometer-output"]
  codometer_cli --> codometer_configuration
  codometer_configuration --> codometer_core
  codometer_examples --> codometer_configuration
  codometer_languages --> codometer_configuration
  codometer_measurement --> codometer_configuration
  codometer_output --> codometer_configuration
  classDef subject fill:#7c3aed,color:#fff,stroke:#4c1d95,stroke-width:2px
  class codometer_configuration subject

NestJS Module Graph

flowchart LR
  ConfigurationModule

File Imports

graph LR
  file_callidescope_config_ts["callidescope.config.ts"]
  file_codependix_config_ts["codependix.config.ts"]
  file_codometer_config_ts["codometer.config.ts"]
  file_eslint_config_ts["eslint.config.ts"]
  file_src_index_ts["src/index.ts"]
  file_src_index_unit_test_ts["src/index.unit.test.ts"]
  file_src_modules_configuration_configuration_flags_constants_ts["src/modules/configuration/configuration-flags.constants.ts"]
  file_src_modules_configuration_configuration_flags_service_ts["src/modules/configuration/configuration-flags.service.ts"]
  file_src_modules_configuration_configuration_flags_service_unit_test_ts["src/modules/configuration/configuration-flags.service.unit.test.ts"]
  file_src_modules_configuration_configuration_loader_service_ts["src/modules/configuration/configuration-loader.service.ts"]
  file_src_modules_configuration_configuration_loader_service_unit_test_ts["src/modules/configuration/configuration-loader.service.unit.test.ts"]
  file_src_modules_configuration_configuration_loader_types_ts["src/modules/configuration/configuration-loader.types.ts"]
  file_src_modules_configuration_configuration_resolver_service_ts["src/modules/configuration/configuration-resolver.service.ts"]
  file_src_modules_configuration_configuration_resolver_service_unit_test_ts["src/modules/configuration/configuration-resolver.service.unit.test.ts"]
  file_src_modules_configuration_configuration_schema_constants_ts["src/modules/configuration/configuration-schema.constants.ts"]
  file_src_modules_configuration_configuration_constants_ts["src/modules/configuration/configuration.constants.ts"]
  file_src_modules_configuration_configuration_module_ts["src/modules/configuration/configuration.module.ts"]
  file_src_modules_configuration_configuration_module_unit_test_ts["src/modules/configuration/configuration.module.unit.test.ts"]
  file_src_modules_configuration_configuration_service_ts["src/modules/configuration/configuration.service.ts"]
  file_src_modules_configuration_configuration_service_unit_test_ts["src/modules/configuration/configuration.service.unit.test.ts"]
  file_src_modules_configuration_configuration_types_ts["src/modules/configuration/configuration.types.ts"]
  file_src_modules_configuration_output_types_ts["src/modules/configuration/output.types.ts"]
  file_src_modules_configuration_resolved_types_ts["src/modules/configuration/resolved.types.ts"]
  file_testing_mocks_ts["testing/mocks.ts"]
  file_testing_setup_ts["testing/setup.ts"]
  file_vite_config_ts["vite.config.ts"]
  file_vitest_config_ts["vitest.config.ts"]
  file_src_index_unit_test_ts --> file_src_index_ts
  file_src_modules_configuration_configuration_flags_service_ts --> file_src_modules_configuration_configuration_flags_constants_ts
  file_src_modules_configuration_configuration_flags_service_ts --> file_src_modules_configuration_configuration_types_ts
  file_src_modules_configuration_configuration_flags_service_unit_test_ts --> file_src_modules_configuration_configuration_flags_constants_ts
  file_src_modules_configuration_configuration_flags_service_unit_test_ts --> file_src_modules_configuration_configuration_flags_service_ts
  file_src_modules_configuration_configuration_flags_service_unit_test_ts --> file_src_modules_configuration_configuration_types_ts
  file_src_modules_configuration_configuration_loader_service_ts --> file_src_modules_configuration_configuration_loader_types_ts
  file_src_modules_configuration_configuration_loader_service_ts --> file_src_modules_configuration_configuration_constants_ts
  file_src_modules_configuration_configuration_loader_service_ts --> file_src_modules_configuration_configuration_types_ts
  file_src_modules_configuration_configuration_loader_service_unit_test_ts --> file_src_modules_configuration_configuration_loader_service_ts
  file_src_modules_configuration_configuration_resolver_service_ts --> file_src_modules_configuration_configuration_schema_constants_ts
  file_src_modules_configuration_configuration_resolver_service_ts --> file_src_modules_configuration_configuration_constants_ts
  file_src_modules_configuration_configuration_resolver_service_ts --> file_src_modules_configuration_configuration_types_ts
  file_src_modules_configuration_configuration_resolver_service_ts --> file_src_modules_configuration_resolved_types_ts
  file_src_modules_configuration_configuration_resolver_service_unit_test_ts --> file_src_modules_configuration_configuration_resolver_service_ts
  file_src_modules_configuration_configuration_schema_constants_ts --> file_src_modules_configuration_configuration_constants_ts
  file_src_modules_configuration_configuration_schema_constants_ts --> file_src_modules_configuration_output_types_ts
  file_src_modules_configuration_configuration_constants_ts --> file_src_modules_configuration_configuration_types_ts
  file_src_modules_configuration_configuration_module_ts --> file_src_modules_configuration_configuration_flags_service_ts
  file_src_modules_configuration_configuration_module_ts --> file_src_modules_configuration_configuration_loader_service_ts
  file_src_modules_configuration_configuration_module_ts --> file_src_modules_configuration_configuration_resolver_service_ts
  file_src_modules_configuration_configuration_module_ts --> file_src_modules_configuration_configuration_service_ts
  file_src_modules_configuration_configuration_module_unit_test_ts --> file_src_modules_configuration_configuration_loader_service_ts
  file_src_modules_configuration_configuration_module_unit_test_ts --> file_src_modules_configuration_configuration_module_ts
  file_src_modules_configuration_configuration_module_unit_test_ts --> file_src_modules_configuration_configuration_service_ts
  file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_flags_service_ts
  file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_loader_service_ts
  file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_resolver_service_ts
  file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_configuration_types_ts
  file_src_modules_configuration_configuration_service_ts --> file_src_modules_configuration_resolved_types_ts
  file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_flags_service_ts
  file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_loader_service_ts
  file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_resolver_service_ts
  file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_constants_ts
  file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_service_ts
  file_src_modules_configuration_configuration_service_unit_test_ts --> file_src_modules_configuration_configuration_types_ts
  file_src_modules_configuration_configuration_types_ts --> file_src_modules_configuration_configuration_flags_constants_ts
  file_src_modules_configuration_configuration_types_ts --> file_src_modules_configuration_output_types_ts
  file_src_modules_configuration_resolved_types_ts --> file_src_modules_configuration_configuration_types_ts
  file_src_modules_configuration_resolved_types_ts --> file_src_modules_configuration_output_types_ts

⏲️ Codometer

Project

Lines of Code Repository Size Folders Source Files

Measured Targets

Compiled JavaScript Size

TypeScript

TypeScript Files Interfaces Generic Declarations Enums Decorators Doc Comments Static Methods

JavaScript

JavaScript Files Test Files External Packages Classes Functions Methods Sync Functions Async Functions Constants Imports Exported Symbols Comments Comment Lines TODO Comments

Python

Python Files Python Lines Python Classes Python Functions Python Protocols Python Constants Python Imports Python Decorators Docstrings Docstring Lines Python Comments Python Comment Lines

JSON

JSON Files JSON Lines JSON Objects JSON Arrays JSON Properties JSON Strings JSON Numbers JSON Booleans JSON Nulls JSON Items JSON Nodes JSON Max Depth

YAML

YAML Files YAML Lines YAML Documents YAML Mappings YAML Sequences YAML Keys YAML Scalars YAML Anchors YAML Aliases YAML Comments YAML Max Depth

TOML

TOML Files TOML Lines TOML Tables TOML Array Tables TOML Keys TOML Arrays TOML Comments

Shell

Shell Files Shell Lines Shell Functions Shell Variables Shell Exports Shell Conditionals Shell Loops Shell Pipelines Shebangs Shell Comments Shell Comment Lines

SQL

SQL Files SQL Lines SQL Statements SQL Selects SQL Inserts SQL Updates SQL Deletes SQL Creates SQL Joins SQL CTEs SQL Comments

HCL

HCL Files HCL Lines HCL Blocks HCL Resources HCL Variables HCL Outputs HCL Attributes HCL Interpolations HCL Comments

CSS

CSS Files CSS Lines CSS Rules CSS Selectors CSS Declarations CSS At Rules CSS Media Queries CSS Custom Properties CSS Comments

Conventions

Module Files Service Files Command Files Constants Files Types Files Utilities Files TypeORM Entities Unit Tests Integration Tests End To End Tests CSS Comment Budget HCL Comment Budget Python Comment Budget SQL Comment Budget TOML Comment Budget TypeScript Comment Budget YAML Comment Budget Shell Comment Budget

Jupyter

Notebooks Notebook Cells Code Cells Markdown Cells Raw Cells Executed Cells Cell Outputs Notebook Code Lines Notebook Classes Notebook Functions Notebook Imports Notebook Decorators Notebook Prose Lines Notebook Headings Notebook Links Notebook Images Notebook Code Blocks Notebook Properties Notebook Nodes Notebook Max Depth

Markdown

Markdown Files Markdown Lines H1 H2 H3 H4 H5 H6 Paragraphs Lists List Items Task List Items Tables Table Rows Links Images Code Blocks Inline Code Block Quotes Thematic Breaks