Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-23 22:27 UTC

mattiasw / ExifReader

A JavaScript Exif info parser.

JavaScriptMPL-2.0★ 992 stars⑂ 106 forkssince Jan 2012View on GitHub ↗

mattiasw/ExifReader holds a health index of 75 out of 100, placing it in the Good band. It scores highest on Vitality (95/100) and lowest on Sustainability & Governance (60/100). It was last updated 1 day ago. A single contributor accounts for most of its recent work.

75
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

75
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Mattias WallanderPersonal account
28 followers17 public repossince Jan 2011

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
npmexifreader4.41.3854,9051305 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

95Excellent · 22% of overall
How it's scored
36/36Push recency — last push 1 days ago
33.9/36Commit cadence — 49/52 weeks with commits
18/18Commit volume — 194 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year194
human_commit_share0.82
days_since_last_push1
active_weeks_last_year49
How it's scored
27/27Ships releases — 100 releases published
36/36Release recency — latest release 5 days ago
27/27Release cadence — a release every ~5.6 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count100
latest_release_tagv4.41.3
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases5.6

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

88Excellent · 18% of overall
How it's scored
48.6/60Stars — 992 stars
16.8/25Forks — 106 forks
6/15Watchers — 13 watchers
Inputs used
forks106
stars992
watchers13
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

Community health

100Excellent
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MPL-2.0)
18/18CONTRIBUTING guide
13.5/13.5Code of conduct
7.2/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingyes
has_issue_templateyes
has_code_of_conductyes
has_pull_request_templateyes
How it's scored
79.1/80Monthly downloads — 854,905 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesexifreader
dependents
ecosystemsnpm
total_downloads
monthly_downloads854,905
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

60Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
1.3/22.5Commit distribution — top contributor authored 94% of commits
13.5/13.5Contributor breadth — 26 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled26
top_contributor_share0.941
How it's scored
45.7/46.8Issue resolution — 98% of issues closed
32.8/38.3PR acceptance — 424/494 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/11 approved changesets -- score normalized to 0
Inputs used
merged_prs424
open_issues4
closed_issues174
issue_closed_ratio0.978
closed_unmerged_prs70
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
10.5/25Owner reach — 28 followers of mattiasw
21.1/25Track record — 17 public repos, account ~15 yr old
Inputs used
followers28
owner_typeUser
is_verified
owner_loginmattiasw
public_repos17
account_age_days5,669
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 5 days ago
20/20Version history — 130 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesexifreader
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Engineering Quality

Are baseline engineering and documentation practices in place?

70Good · 20% of overall
How it's scored
24/24CI workflows — 5 workflow(s)
24/24Tests present
16/16Linter config — eslint.config.mjs
0/9.6Pre-commit hooks
6.4/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 4 out of 4 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigyes
has_linter_configyes
has_precommit_configno

Documentation

40At risk
How it's scored
30/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
0/10Wiki
Inputs used
topics
has_wikino
homepage
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

62Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
2.5/2.5CI-Tests — 4 out of 4 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/11 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
5/5SAST — SAST tool is run on all commits
2/5Security-Policy — security policy file detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 12 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5.2
Excluded from scoring (no data or not applicable): branch_protection. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages1
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:exifreader@4.41.3 runtime dependency closure — what installing the published package pulls in — 1 packages. Reachability is not analyzed.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

66Moderate · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md, CLAUDE.md
0/15Machine-readable docs (llms.txt)
28/40Legible commit history — 43 of 82 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.524
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes7,089
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — eslint.config.mjs
11/11Static type checking — test/types/tsconfig.json
10/10Reproducible environment — Dockerfile, lockfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
8/8Automated maintenance — 18 of the last 100 commits are automated dependency updates
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileyes
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configstest/types/tsconfig.json
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0.18
How it's scored
27/45Type-checkable code — JavaScript with type-check config (test/types/tsconfig.json)
54.6/55Manageable file sizes — 1/149 source files over 60KB
Inputs used
primary_languageJavaScript
largest_source_bytes84,419
source_files_sampled149
oversized_source_files1
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

992GitHub stars
26contributors
194commits, last 12 months
1days since last push
100releases
1bus factor
4open issues
npmpackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

More detail

Star and fork history 0 ★ / 106 ⇿
0Stars
106Forks
97Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

02040608010012010422013-042019-112026-07
Major 1Minor 49Patch 47

Each point covers 13 days.

OpenSSF Scorecard 5.2 / 10
5.2aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-23 22:26 UTC

10Binary-Artifactsno binaries found in the repo
n/aBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
10CI-Tests4 out of 4 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/11 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
3Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 3
10SASTSAST tool is run on all commits
4Security-Policysecurity policy file detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities12 existing vulnerabilities detected
All dependencies 730

Full resolved dependency set from the GitHub dependency graph: 0 direct and 730 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
npm@aashutoshrathi/word-wrap1.2.6indirect
npm@babel/code-frame7.29.7indirect
npm@babel/compat-data7.29.7indirect
npm@babel/core7.29.7indirect
npm@babel/generator7.29.7indirect
npm@babel/helper-annotate-as-pure7.29.7indirect
npm@babel/helper-compilation-targets7.29.7indirect
npm@babel/helper-create-class-features-plugin7.29.7indirect
npm@babel/helper-create-regexp-features-plugin7.29.7indirect
npm@babel/helper-define-polyfill-provider0.6.6indirect
npm@babel/helper-globals7.29.7indirect
npm@babel/helper-member-expression-to-functions7.29.7indirect
npm@babel/helper-module-imports7.29.7indirect
npm@babel/helper-module-transforms7.29.7indirect
npm@babel/helper-optimise-call-expression7.29.7indirect
npm@babel/helper-plugin-utils7.29.7indirect
npm@babel/helper-remap-async-to-generator7.29.7indirect
npm@babel/helper-replace-supers7.29.7indirect
npm@babel/helper-skip-transparent-expression-wrappers7.29.7indirect
npm@babel/helper-string-parser7.29.7indirect
npm@babel/helper-validator-identifier7.29.7indirect
npm@babel/helper-validator-option7.29.7indirect
npm@babel/helper-wrap-function7.29.7indirect
npm@babel/helpers7.29.7indirect
npm@babel/parser7.29.7indirect
npm@babel/plugin-bugfix-firefox-class-in-computed-class-key7.29.7indirect
npm@babel/plugin-bugfix-safari-class-field-initializer-scope7.29.7indirect
npm@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression7.29.7indirect
npm@babel/plugin-bugfix-safari-rest-destructuring-rhs-array7.29.7indirect
npm@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining7.29.7indirect
npm@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly7.29.7indirect
npm@babel/plugin-proposal-private-property-in-object7.21.0-placeholder-for-preset-env.2indirect
npm@babel/plugin-syntax-import-assertions7.29.7indirect
npm@babel/plugin-syntax-import-attributes7.29.7indirect
npm@babel/plugin-syntax-unicode-sets-regex7.18.6indirect
npm@babel/plugin-transform-arrow-functions7.29.7indirect
npm@babel/plugin-transform-async-generator-functions7.29.7indirect
npm@babel/plugin-transform-async-to-generator7.29.7indirect
npm@babel/plugin-transform-block-scoped-functions7.29.7indirect
npm@babel/plugin-transform-block-scoping7.29.7indirect
npm@babel/plugin-transform-class-properties7.29.7indirect
npm@babel/plugin-transform-class-static-block7.29.7indirect
npm@babel/plugin-transform-classes7.29.7indirect
npm@babel/plugin-transform-computed-properties7.29.7indirect
npm@babel/plugin-transform-destructuring7.29.7indirect
npm@babel/plugin-transform-dotall-regex7.29.7indirect
npm@babel/plugin-transform-duplicate-keys7.29.7indirect
npm@babel/plugin-transform-duplicate-named-capturing-groups-regex7.29.7indirect
npm@babel/plugin-transform-dynamic-import7.29.7indirect
npm@babel/plugin-transform-explicit-resource-management7.29.7indirect
npm@babel/plugin-transform-exponentiation-operator7.29.7indirect
npm@babel/plugin-transform-export-namespace-from7.29.7indirect
npm@babel/plugin-transform-for-of7.29.7indirect
npm@babel/plugin-transform-function-name7.29.7indirect
npm@babel/plugin-transform-json-strings7.29.7indirect
npm@babel/plugin-transform-literals7.29.7indirect
npm@babel/plugin-transform-logical-assignment-operators7.29.7indirect
npm@babel/plugin-transform-member-expression-literals7.29.7indirect
npm@babel/plugin-transform-modules-amd7.29.7indirect
npm@babel/plugin-transform-modules-commonjs7.29.7indirect
npm@babel/plugin-transform-modules-systemjs7.29.7indirect
npm@babel/plugin-transform-modules-umd7.29.7indirect
npm@babel/plugin-transform-named-capturing-groups-regex7.29.7indirect
npm@babel/plugin-transform-new-target7.29.7indirect
npm@babel/plugin-transform-nullish-coalescing-operator7.29.7indirect
npm@babel/plugin-transform-numeric-separator7.29.7indirect
npm@babel/plugin-transform-object-rest-spread7.29.7indirect
npm@babel/plugin-transform-object-super7.29.7indirect
npm@babel/plugin-transform-optional-catch-binding7.29.7indirect
npm@babel/plugin-transform-optional-chaining7.29.7indirect
npm@babel/plugin-transform-parameters7.29.7indirect
npm@babel/plugin-transform-private-methods7.29.7indirect
npm@babel/plugin-transform-private-property-in-object7.29.7indirect
npm@babel/plugin-transform-property-literals7.29.7indirect
npm@babel/plugin-transform-regenerator7.29.7indirect
npm@babel/plugin-transform-regexp-modifiers7.29.7indirect
npm@babel/plugin-transform-reserved-words7.29.7indirect
npm@babel/plugin-transform-shorthand-properties7.29.7indirect
npm@babel/plugin-transform-spread7.29.7indirect
npm@babel/plugin-transform-sticky-regex7.29.7indirect
npm@babel/plugin-transform-template-literals7.29.7indirect
npm@babel/plugin-transform-typeof-symbol7.29.7indirect
npm@babel/plugin-transform-unicode-escapes7.29.7indirect
npm@babel/plugin-transform-unicode-property-regex7.29.7indirect
npm@babel/plugin-transform-unicode-regex7.29.7indirect
npm@babel/plugin-transform-unicode-sets-regex7.29.7indirect
npm@babel/preset-env7.29.7indirect
npm@babel/preset-modules0.1.6-no-external-pluginsindirect
npm@babel/template7.29.7indirect
npm@babel/traverse7.29.7indirect
npm@babel/types7.29.7indirect
npm@bcoe/v8-coverage1.0.2indirect
npm@cypress/request4.0.0indirect
npm@cypress/xvfb1.2.4indirect
npm@discoveryjs/json-ext1.1.0indirect
npm@epic-web/invariant1.0.0indirect
npm@eslint-community/eslint-utils4.9.1indirect
npm@eslint-community/regexpp4.12.2indirect
npm@eslint/config-array0.21.2indirect
npm@eslint/config-helpers0.4.2indirect
npm@eslint/core0.17.0indirect
npm@eslint/eslintrc3.3.5indirect
npm@eslint/js9.39.4indirect
npm@eslint/js9.39.5indirect
npm@eslint/object-schema2.1.7indirect
npm@eslint/plugin-kit0.4.1indirect
npm@humanfs/core0.19.2indirect
npm@humanfs/node0.16.8indirect
npm@humanfs/types0.15.0indirect
npm@humanwhocodes/module-importer1.0.1indirect
npm@humanwhocodes/retry0.4.3indirect
npm@isaacs/cliui8.0.2indirect
npm@istanbuljs/schema0.1.6indirect
npm@jridgewell/gen-mapping0.3.12indirect
npm@jridgewell/remapping2.3.5indirect
npm@jridgewell/resolve-uri3.1.0indirect
npm@jridgewell/source-map0.3.6indirect
npm@jridgewell/sourcemap-codec1.5.4indirect
npm@jridgewell/trace-mapping0.3.29indirect
npm@jsonjoy.com/base641.1.2indirect
npm@jsonjoy.com/json-pack1.1.0indirect
npm@jsonjoy.com/util1.3.0indirect
npm@leichtgewicht/ip-codec2.0.5indirect
npm@noble/hashes1.4.0indirect
npm@peculiar/asn1-cms2.6.0indirect
npm@peculiar/asn1-csr2.6.0indirect
npm@peculiar/asn1-ecc2.6.0indirect
npm@peculiar/asn1-pfx2.6.0indirect
npm@peculiar/asn1-pkcs82.6.0indirect
npm@peculiar/asn1-pkcs92.6.0indirect
npm@peculiar/asn1-rsa2.6.0indirect
npm@peculiar/asn1-schema2.6.0indirect
npm@peculiar/asn1-x5092.6.0indirect
npm@peculiar/asn1-x509-attr2.6.0indirect
npm@peculiar/x5091.14.3indirect
npm@pkgjs/parseargs0.11.0indirect
npm@types/body-parser1.19.4indirect
npm@types/bonjour3.5.13indirect
npm@types/connect3.4.37indirect
npm@types/connect-history-api-fallback1.5.4indirect
npm@types/estree1.0.9indirect
npm@types/express4.17.25indirect
npm@types/express-serve-static-core4.17.39indirect
npm@types/http-errors2.0.3indirect
npm@types/http-proxy1.17.15indirect
npm@types/istanbul-lib-coverage2.0.6indirect
npm@types/json-schema7.0.15indirect
npm@types/mime1.3.4indirect
npm@types/node26.1.1indirect
npm@types/qs6.9.9indirect
npm@types/range-parser1.2.6indirect
npm@types/retry0.12.2indirect
npm@types/send0.17.3indirect
npm@types/serve-index1.9.4indirect
npm@types/serve-static1.15.7indirect
npm@types/sinonjs__fake-timers8.1.1indirect
npm@types/sizzle2.3.3indirect
npm@types/sockjs0.3.36indirect
npm@types/tmp0.2.6indirect
npm@types/ws8.5.10indirect
npm@typescript/typescript-aix-ppc647.0.2indirect
npm@typescript/typescript-darwin-arm647.0.2indirect
npm@typescript/typescript-darwin-x647.0.2indirect
npm@typescript/typescript-freebsd-arm647.0.2indirect
npm@typescript/typescript-freebsd-x647.0.2indirect
npm@typescript/typescript-linux-arm7.0.2indirect
npm@typescript/typescript-linux-arm647.0.2indirect
npm@typescript/typescript-linux-loong647.0.2indirect
npm@typescript/typescript-linux-mips64el7.0.2indirect
npm@typescript/typescript-linux-ppc647.0.2indirect
npm@typescript/typescript-linux-riscv647.0.2indirect
npm@typescript/typescript-linux-s390x7.0.2indirect
npm@typescript/typescript-linux-x647.0.2indirect
npm@typescript/typescript-netbsd-arm647.0.2indirect
npm@typescript/typescript-netbsd-x647.0.2indirect
npm@typescript/typescript-openbsd-arm647.0.2indirect
npm@typescript/typescript-openbsd-x647.0.2indirect
npm@typescript/typescript-sunos-x647.0.2indirect
npm@typescript/typescript-win32-arm647.0.2indirect
npm@typescript/typescript-win32-x647.0.2indirect
npm@webassemblyjs/ast1.14.1indirect
npm@webassemblyjs/floating-point-hex-parser1.13.2indirect
npm@webassemblyjs/helper-api-error1.13.2indirect
npm@webassemblyjs/helper-buffer1.14.1indirect
npm@webassemblyjs/helper-numbers1.13.2indirect
npm@webassemblyjs/helper-wasm-bytecode1.13.2indirect
npm@webassemblyjs/helper-wasm-section1.14.1indirect
npm@webassemblyjs/ieee7541.13.2indirect
npm@webassemblyjs/leb1281.13.2indirect
npm@webassemblyjs/utf81.13.2indirect
npm@webassemblyjs/wasm-edit1.14.1indirect
npm@webassemblyjs/wasm-gen1.14.1indirect
npm@webassemblyjs/wasm-opt1.14.1indirect
npm@webassemblyjs/wasm-parser1.14.1indirect
npm@webassemblyjs/wast-printer1.14.1indirect
npm@xmldom/xmldom0.9.10indirect
npm@xtuc/ieee7541.2.0indirect
npm@xtuc/long4.2.2indirect
npmaccepts1.3.8indirect
npmacorn8.16.0indirect
npmacorn-import-phases1.0.4indirect
npmacorn-jsx5.3.2indirect
npmajv6.15.0indirect
npmajv8.18.0indirect
npmajv-formats2.1.1indirect
npmajv-keywords5.1.0indirect
npmansi-escapes7.3.0indirect
npmansi-html-community0.0.8indirect
npmansi-regex5.0.1indirect
npmansi-regex6.0.1indirect
npmansi-regex6.2.2indirect
npmansi-styles4.3.0indirect
npmansi-styles6.2.3indirect
npmanymatch3.1.2indirect
npmarch2.2.0indirect
npmargparse2.0.1indirect
npmarray-flatten1.1.1indirect
npmasn10.2.6indirect
npmasn1js3.0.7indirect
npmassert-plus1.0.0indirect
npmasynckit0.4.0indirect
npmat-least-node1.0.0indirect
npmaws-sign20.7.0indirect
npmaws41.13.2indirect
npmbabel-loader10.1.1indirect
npmbabel-plugin-polyfill-corejs20.4.15indirect
npmbabel-plugin-polyfill-corejs30.14.0indirect
npmbabel-plugin-polyfill-regenerator0.6.6indirect
npmbalanced-match1.0.0indirect
npmbalanced-match4.0.4indirect
npmbase64-js1.5.1indirect
npmbaseline-browser-mapping2.9.11indirect
npmbatch0.6.1indirect
npmbcrypt-pbkdf1.0.2indirect
npmbinary-extensions2.2.0indirect
npmblob-util2.0.2indirect
npmbluebird3.7.2indirect
npmbody-parser1.20.4indirect
npmbonjour-service1.2.1indirect
npmboolbase2.0.0indirect
npmbrace-expansion1.1.15indirect
npmbrace-expansion2.0.3indirect
npmbrace-expansion5.0.6indirect
npmbraces3.0.3indirect
npmbrowser-stdout1.3.1indirect
npmbrowserslist4.28.1indirect
npmbuffer5.7.1indirect
npmbuffer-from1.1.1indirect
npmbundle-name4.1.0indirect
npmbytes3.1.2indirect
npmbytestreamjs2.0.1indirect
npmc811.0.0indirect
npmcachedir2.4.0indirect
npmcall-bind-apply-helpers1.0.2indirect
npmcall-bound1.0.4indirect
npmcallsites3.1.0indirect
npmcamelcase6.2.0indirect
npmcaniuse-lite1.0.30001761indirect
npmcaseless0.12.0indirect
npmchai6.2.2indirect
npmchalk4.1.2indirect
npmchokidar3.6.0indirect
npmchokidar4.0.3indirect
npmchrome-trace-event1.0.3indirect
npmci-info4.1.0indirect
npmcli-cursor5.0.0indirect
npmcli-table30.6.1indirect
npmcli-truncate5.2.0indirect
npmcliui8.0.1indirect
npmclone-deep4.0.1indirect
npmcolor-convert2.0.1indirect
npmcolor-name1.1.4indirect
npmcolorette2.0.20indirect
npmcolors1.4.0indirect
npmcombined-stream1.0.8indirect
npmcommander14.0.3indirect
npmcommander2.20.3indirect
npmcommander6.2.1indirect
npmcommon-tags1.8.0indirect
npmcompressible2.0.18indirect
npmcompression1.8.1indirect
npmconcat-map0.0.1indirect
npmconnect-history-api-fallback2.0.0indirect
npmcontent-disposition0.5.4indirect
npmcontent-type1.0.5indirect
npmconvert-source-map2.0.0indirect
npmcookie0.7.1indirect
npmcookie-signature1.0.6indirect
npmcore-js-compat3.48.0indirect
npmcore-util-is1.0.2indirect
npmcross-env10.1.0indirect
npmcross-spawn7.0.6indirect
npmcss-select7.0.0indirect
npmcss-what8.0.0indirect
npmcssom0.5.0indirect
npmcypress15.18.1indirect
npmdashdash1.14.1indirect
npmdayjs1.10.7indirect
npmdebug2.6.9indirect
npmdebug3.2.7indirect
npmdebug4.4.3indirect
npmdecamelize4.0.0indirect
npmdeep-is0.1.4indirect
npmdefault-browser5.2.1indirect
npmdefault-browser-id5.0.0indirect
npmdefine-lazy-prop3.0.0indirect
npmdelayed-stream1.0.0indirect
npmdepd1.1.2indirect
npmdepd2.0.0indirect
npmdestroy1.2.0indirect
npmdetect-node2.1.0indirect
npmdiff7.0.0indirect
npmdns-packet5.6.1indirect
npmdom-serializer2.0.0indirect
npmdom-serializer3.1.1indirect
npmdomelementtype2.3.0indirect
npmdomelementtype3.0.0indirect
npmdomhandler5.0.3indirect
npmdomhandler6.0.1indirect
npmdomutils3.2.2indirect
npmdomutils4.0.2indirect
npmdunder-proto1.0.1indirect
npmeastasianwidth0.2.0indirect
npmecc-jsbn0.1.2indirect
npmee-first1.1.1indirect
npmelectron-to-chromium1.5.267indirect
npmemoji-regex10.6.0indirect
npmemoji-regex8.0.0indirect
npmemoji-regex9.2.2indirect
npmencodeurl1.0.2indirect
npmencodeurl2.0.0indirect
npmend-of-stream1.4.4indirect
npmenhanced-resolve5.24.1indirect
npmentities4.5.0indirect
npmentities7.0.1indirect
npmentities8.0.0indirect
npmenvinfo7.21.0indirect
npmenvironment1.1.0indirect
npmes-define-property1.0.1indirect
npmes-errors1.3.0indirect
npmes-module-lexer2.1.0indirect
npmes-object-atoms1.1.1indirect
npmes-set-tostringtag2.1.0indirect
npmescalade3.2.0indirect
npmescape-html1.0.3indirect
npmescape-string-regexp4.0.0indirect
npmeslint9.39.4indirect
npmeslint-plugin-cypress6.4.1indirect
npmeslint-scope5.1.1indirect
npmeslint-scope8.4.0indirect
npmeslint-visitor-keys3.4.3indirect
npmeslint-visitor-keys4.2.1indirect
npmespree10.4.0indirect
npmesquery1.5.0indirect
npmesrecurse4.3.0indirect
npmestraverse4.3.0indirect
npmestraverse5.2.0indirect
npmestraverse5.3.0indirect
npmesutils2.0.2indirect
npmetag1.8.1indirect
npmeventemitter26.4.7indirect
npmeventemitter34.0.7indirect
npmeventemitter35.0.4indirect
npmevents3.3.0indirect
npmexeca4.1.0indirect
npmexecutable4.1.1indirect
npmexpress4.22.1indirect
npmextend3.0.2indirect
npmextsprintf1.3.0indirect
npmfast-deep-equal3.1.3indirect
npmfast-json-stable-stringify2.1.0indirect
npmfast-levenshtein2.0.6indirect
npmfast-uri3.1.2indirect
npmfaye-websocket0.11.4indirect
npmfile-entry-cache8.0.0indirect
npmfill-range7.1.1indirect
npmfinalhandler1.3.1indirect
npmfind-up4.1.0indirect
npmfind-up5.0.0indirect
npmflat5.0.2indirect
npmflat-cache4.0.1indirect
npmflatted3.4.2indirect
npmfollow-redirects1.16.0indirect
npmforeground-child3.3.1indirect
npmforever-agent0.6.1indirect
npmform-data4.0.6indirect
npmforwarded0.2.0indirect
npmfresh0.5.2indirect
npmfs-extra9.1.0indirect
npmfsevents2.3.2indirect
npmfunction-bind1.1.2indirect
npmgensync1.0.0-beta.2indirect
npmget-caller-file2.0.5indirect
npmget-east-asian-width1.6.0indirect
npmget-intrinsic1.3.0indirect
npmget-proto1.0.1indirect
npmget-stream5.2.0indirect
npmgetpass0.1.7indirect
npmglob10.5.0indirect
npmglob13.0.6indirect
npmglob-parent5.1.2indirect
npmglob-parent6.0.2indirect
npmglobal-dirs3.0.0indirect
npmglobals14.0.0indirect
npmglobals17.7.0indirect
npmgopd1.2.0indirect
npmgraceful-fs4.2.11indirect
npmhandle-thing2.0.1indirect
npmhas-flag4.0.0indirect
npmhas-symbols1.1.0indirect
npmhas-tostringtag1.0.2indirect
npmhasha5.2.2indirect
npmhasown2.0.4indirect
npmhe1.2.0indirect
npmhpack.js2.1.6indirect
npmhtml-escaper2.0.2indirect
npmhtml-escaper3.0.3indirect
npmhtmlparser210.1.0indirect
npmhttp-deceiver1.2.7indirect
npmhttp-errors1.6.3indirect
npmhttp-errors2.0.0indirect
npmhttp-errors2.0.1indirect
npmhttp-parser-js0.5.8indirect
npmhttp-proxy1.18.1indirect
npmhttp-proxy-middleware2.0.9indirect
npmhttp-signature1.4.0indirect
npmhuman-signals1.1.1indirect
npmhusky9.1.7indirect
npmhyperdyperid1.2.0indirect
npmiconv-lite0.4.24indirect
npmieee7541.2.1indirect
npmignore5.3.2indirect
npmimport-fresh3.3.1indirect
npmimport-local3.2.0indirect
npmimurmurhash0.1.4indirect
npminherits2.0.3indirect
npminherits2.0.4indirect
npmini2.0.0indirect
npminterpret3.1.1indirect
npmipaddr.js1.9.1indirect
npmipaddr.js2.1.0indirect
npmis-binary-path2.1.0indirect
npmis-core-module2.16.1indirect
npmis-docker3.0.0indirect
npmis-extglob2.1.1indirect
npmis-fullwidth-code-point3.0.0indirect
npmis-fullwidth-code-point5.1.0indirect
npmis-glob4.0.1indirect
npmis-glob4.0.3indirect
npmis-inside-container1.0.0indirect
npmis-installed-globally0.4.0indirect
npmis-network-error1.1.0indirect
npmis-number7.0.0indirect
npmis-path-inside3.0.3indirect
npmis-plain-obj2.1.0indirect
npmis-plain-obj3.0.0indirect
npmis-plain-object2.0.4indirect
npmis-stream2.0.1indirect
npmis-typedarray1.0.0indirect
npmis-unicode-supported0.1.0indirect
npmis-wsl3.1.0indirect
npmisarray1.0.0indirect
npmisexe2.0.0indirect
npmisexe4.0.0indirect
npmisobject3.0.1indirect
npmisstream0.1.2indirect
npmistanbul-lib-coverage3.2.2indirect
npmistanbul-lib-report3.0.1indirect
npmistanbul-reports3.2.0indirect
npmjackspeak3.4.3indirect
npmjest-worker27.5.1indirect
npmjs-tokens4.0.0indirect
npmjs-yaml4.2.0indirect
npmjsbn0.1.1indirect
npmjsesc3.1.0indirect
npmjson-buffer3.0.1indirect
npmjson-parse-even-better-errors6.0.0indirect
npmjson-schema0.4.0indirect
npmjson-schema-traverse0.4.1indirect
npmjson-schema-traverse1.0.0indirect
npmjson-stable-stringify-without-jsonify1.0.1indirect
npmjson-stringify-safe5.0.1indirect
npmjson52.2.3indirect
npmjsonfile6.1.0indirect
npmjsprim2.0.2indirect
npmkeyv4.5.4indirect
npmkind-of6.0.3indirect
npmlaunch-editor2.14.1indirect
npmlevn0.4.1indirect
npmlinkedom0.18.13indirect
npmlistr29.0.5indirect
npmloader-runner4.3.2indirect
npmlocate-path5.0.0indirect
npmlocate-path6.0.0indirect
npmlodash4.18.1indirect
npmlodash.debounce4.0.8indirect
npmlodash.merge4.6.2indirect
npmlodash.once4.1.1indirect
npmlog-symbols4.1.0indirect
npmlog-update6.1.0indirect
npmlru-cache10.4.3indirect
npmlru-cache11.5.1indirect
npmlru-cache5.1.1indirect
npmmake-dir4.0.0indirect
npmmath-intrinsics1.1.0indirect
npmmedia-typer0.3.0indirect
npmmemfs4.11.1indirect
npmmemorystream0.3.1indirect
npmmerge-descriptors1.0.3indirect
npmmerge-stream2.0.0indirect
npmmethods1.1.2indirect
npmmicromatch4.0.8indirect
npmmime1.6.0indirect
npmmime-db1.52.0indirect
npmmime-db1.54.0indirect
npmmime-types2.1.35indirect
npmmimic-fn2.1.0indirect
npmmimic-function5.0.1indirect
npmminimalistic-assert1.0.1indirect
npmminimatch10.2.5indirect
npmminimatch3.1.5indirect
npmminimatch9.0.9indirect
npmminimist1.2.8indirect
npmminimizer-webpack-plugin5.6.1indirect
npmminipass7.1.3indirect
npmmocha11.7.6indirect
npmms2.0.0indirect
npmms2.1.3indirect
npmmulticast-dns7.2.5indirect
npmnatural-compare1.4.0indirect
npmnegotiator0.6.3indirect
npmnegotiator0.6.4indirect
npmneo-async2.6.2indirect
npmnode-releases2.0.27indirect
npmnormalize-path3.0.0indirect
npmnpm-normalize-package-bin6.0.0indirect
npmnpm-run-all29.0.2indirect
npmnpm-run-path4.0.1indirect
npmnth-check3.0.1indirect
npmobject-inspect1.13.4indirect
npmobuf1.1.2indirect
npmon-finished2.4.1indirect
npmon-headers1.1.0indirect
npmonce1.4.0indirect
npmonetime5.1.2indirect
npmonetime7.0.0indirect
npmopen10.1.0indirect
npmoptionator0.9.3indirect
npmospath1.2.2indirect
npmp-limit2.3.0indirect
npmp-limit3.1.0indirect
npmp-locate4.1.0indirect
npmp-locate5.0.0indirect
npmp-retry6.2.0indirect
npmp-try2.2.0indirect
npmpackage-json-from-dist1.0.1indirect
npmparent-module1.0.1indirect
npmparseurl1.3.3indirect
npmpath-exists4.0.0indirect
npmpath-key3.1.1indirect
npmpath-parse1.0.7indirect
npmpath-scurry1.11.1indirect
npmpath-scurry2.0.2indirect
npmpath-to-regexp0.1.13indirect
npmpend1.2.0indirect
npmperformance-now2.1.0indirect
npmpicocolors1.1.1indirect
npmpicomatch2.3.2indirect
npmpicomatch4.0.4indirect
npmpidtree1.0.0indirect
npmpify2.3.0indirect
npmpkg-dir4.2.0indirect
npmpkijs3.3.3indirect
npmprelude-ls1.2.1indirect
npmpretty-bytes5.6.0indirect
npmprocess0.11.10indirect
npmprocess-nextick-args2.0.1indirect
npmproxy-addr2.0.7indirect
npmproxy-from-env1.0.0indirect
npmpump3.0.0indirect
npmpunycode2.3.1indirect
npmpvtsutils1.3.6indirect
npmpvutils1.1.5indirect
npmqs6.14.2indirect
npmrandombytes2.1.0indirect
npmrange-parser1.2.1indirect
npmraw-body2.5.3indirect
npmread-package-json-fast6.0.0indirect
npmreadable-stream2.3.8indirect
npmreadable-stream3.6.2indirect
npmreaddirp3.6.0indirect
npmreaddirp4.1.2indirect
npmrechoir0.8.0indirect
npmreflect-metadata0.2.2indirect
npmregenerate1.4.2indirect
npmregenerate-unicode-properties10.2.2indirect
npmregexpu-core6.4.0indirect
npmregjsgen0.8.0indirect
npmregjsparser0.13.0indirect
npmrequest-progress3.0.0indirect
npmrequire-directory2.1.1indirect
npmrequire-from-string2.0.2indirect
npmrequires-port1.0.0indirect
npmresolve1.22.11indirect
npmresolve-cwd3.0.0indirect
npmresolve-from4.0.0indirect
npmresolve-from5.0.0indirect
npmrestore-cursor5.1.0indirect
npmretry0.13.1indirect
npmrfdc1.4.1indirect
npmrimraf5.0.10indirect
npmrun-applescript7.0.0indirect
npmsafe-buffer5.1.2indirect
npmsafe-buffer5.2.1indirect
npmsafer-buffer2.1.2indirect
npmschema-utils4.3.3indirect
npmselect-hose2.0.0indirect
npmselfsigned5.5.0indirect
npmsemver6.3.1indirect
npmsemver7.8.2indirect
npmsend0.19.0indirect
npmserialize-javascript6.0.2indirect
npmserve-index1.9.1indirect
npmserve-static1.16.2indirect
npmsetprototypeof1.1.0indirect
npmsetprototypeof1.2.0indirect
npmshallow-clone3.0.1indirect
npmshebang-command2.0.0indirect
npmshebang-regex3.0.0indirect
npmshell-quote1.8.4indirect
npmside-channel1.1.0indirect
npmside-channel-list1.0.0indirect
npmside-channel-map1.0.1indirect
npmside-channel-weakmap1.0.2indirect
npmsignal-exit3.0.7indirect
npmsignal-exit4.1.0indirect
npmslice-ansi7.1.2indirect
npmslice-ansi8.0.0indirect
npmsockjs0.3.24indirect
npmsource-map0.6.1indirect
npmsource-map-support0.5.20indirect
npmspdy4.0.2indirect
npmspdy-transport3.0.0indirect
npmsshpk1.18.0indirect
npmstatuses1.5.0indirect
npmstatuses2.0.1indirect
npmstatuses2.0.2indirect
npmstring-replace-loader3.3.0indirect
npmstring-width4.2.3indirect
npmstring-width5.1.2indirect
npmstring-width7.2.0indirect
npmstring-width8.2.1indirect
npmstring_decoder1.1.1indirect
npmstrip-ansi6.0.1indirect
npmstrip-ansi7.1.0indirect
npmstrip-ansi7.2.0indirect
npmstrip-final-newline2.0.0indirect
npmstrip-json-comments3.1.1indirect
npmsupports-color7.2.0indirect
npmsupports-color8.1.1indirect
npmsupports-preserve-symlinks-flag1.0.0indirect
npmsysteminformation5.31.17indirect
npmtapable2.3.3indirect
npmterser5.37.0indirect
npmterser-webpack-plugin5.6.1indirect
npmtest-exclude8.0.0indirect
npmthingies1.21.0indirect
npmthrottleit1.0.0indirect
npmthunky1.1.0indirect
npmtldts6.1.86indirect
npmtldts-core6.1.86indirect
npmtmp0.2.7indirect
npmto-regex-range5.0.1indirect
npmtoidentifier1.0.1indirect
npmtough-cookie5.1.2indirect
npmtree-dump1.0.2indirect
npmtree-kill1.2.2indirect
npmtslib1.14.1indirect
npmtslib2.7.0indirect
npmtslib2.8.1indirect
npmtsyringe4.10.0indirect
npmtunnel-agent0.6.0indirect
npmtweetnacl0.14.5indirect
npmtype-check0.4.0indirect
npmtype-fest0.8.1indirect
npmtype-is1.6.18indirect
npmtypescript7.0.2indirect
npmuhyphen0.2.0indirect
npmundici-types8.3.0indirect
npmunicode-canonical-property-names-ecmascript2.0.1indirect
npmunicode-match-property-ecmascript2.0.0indirect
npmunicode-match-property-value-ecmascript2.2.1indirect
npmunicode-property-aliases-ecmascript2.2.0indirect
npmuniversalify2.0.0indirect
npmunpipe1.0.0indirect
npmuntildify4.0.0indirect
npmupdate-browserslist-db1.2.3indirect
npmuri-js4.4.1indirect
npmutil-deprecate1.0.2indirect
npmutils-merge1.0.1indirect
npmuuid8.3.2indirect
npmv8-to-istanbul9.3.0indirect
npmvary1.1.2indirect
npmverror1.10.0indirect
npmwatchpack2.5.2indirect
npmwbuf1.7.3indirect
npmwebpack5.108.4indirect
npmwebpack-cli7.2.1indirect
npmwebpack-dev-middleware7.4.2indirect
npmwebpack-dev-server5.2.6indirect
npmwebpack-merge6.0.1indirect
npmwebpack-sources3.5.0indirect
npmwebsocket-driver0.7.5indirect
npmwebsocket-extensions0.1.4indirect
npmwhich2.0.2indirect
npmwhich7.0.0indirect
npmwildcard2.0.1indirect
npmworkerpool9.3.2indirect
npmwrap-ansi7.0.0indirect
npmwrap-ansi8.1.0indirect
npmwrap-ansi9.0.2indirect
npmwrappy1.0.2indirect
npmws8.21.0indirect
npmy18n5.0.8indirect
npmyallist3.1.1indirect
npmyargs17.7.2indirect
npmyargs-parser21.1.1indirect
npmyargs-unparser2.0.0indirect
npmyauzl3.3.2indirect
npmyocto-queue0.1.0indirect
Dependency advisories 0

Installing npm:exifreader@4.41.3 pulls in 1 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 8377,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Dockerfile": 3181,
        "JavaScript": 1076607,
        "TypeScript": 17943
      },
      "pushed_at": "2026-07-22T14:02:52Z",
      "created_at": "2012-01-01T23:05:20Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T14:07:41Z",
      "description": "A JavaScript Exif info parser.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MPL-2.0",
      "default_branch": "main",
      "license_spdx_raw": "MPL-2.0",
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Mattias Wallander",
      "type": "User",
      "login": "mattiasw",
      "company": null,
      "location": "Sweden",
      "followers": 28,
      "avatar_url": "https://avatars.githubusercontent.com/u/564615?v=4",
      "created_at": "2011-01-14T12:54:55Z",
      "is_verified": null,
      "public_repos": 17,
      "account_age_days": 5669
    },
    "license": {
      "state": "standard",
      "spdx_id": "MPL-2.0",
      "raw_spdx": "MPL-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v4.41.3",
          "kind": "patch",
          "published_at": "2026-07-18T14:48:16Z"
        },
        {
          "tag": "v4.41.2",
          "kind": "patch",
          "published_at": "2026-07-18T12:18:41Z"
        },
        {
          "tag": "v4.41.1",
          "kind": "patch",
          "published_at": "2026-07-18T10:14:24Z"
        },
        {
          "tag": "v4.41.0",
          "kind": "minor",
          "published_at": "2026-06-08T09:32:56Z"
        },
        {
          "tag": "v4.40.5",
          "kind": "patch",
          "published_at": "2026-06-03T18:55:02Z"
        },
        {
          "tag": "v4.40.4",
          "kind": "patch",
          "published_at": "2026-06-03T14:18:01Z"
        },
        {
          "tag": "v4.40.3",
          "kind": "patch",
          "published_at": "2026-05-31T18:48:20Z"
        },
        {
          "tag": "v4.40.2",
          "kind": "patch",
          "published_at": "2026-05-30T20:52:39Z"
        },
        {
          "tag": "v4.40.1",
          "kind": "patch",
          "published_at": "2026-05-30T18:47:46Z"
        },
        {
          "tag": "v4.40.0",
          "kind": "minor",
          "published_at": "2026-05-29T13:36:56Z"
        },
        {
          "tag": "v4.39.1",
          "kind": "patch",
          "published_at": "2026-05-19T11:05:08Z"
        },
        {
          "tag": "v4.39.0",
          "kind": "minor",
          "published_at": "2026-05-15T17:49:13Z"
        },
        {
          "tag": "v4.38.1",
          "kind": "patch",
          "published_at": "2026-04-09T09:23:13Z"
        },
        {
          "tag": "v4.38.0",
          "kind": "minor",
          "published_at": "2026-04-07T08:24:50Z"
        },
        {
          "tag": "v4.37.1",
          "kind": "patch",
          "published_at": "2026-04-05T15:06:25Z"
        },
        {
          "tag": "v4.37.0",
          "kind": "minor",
          "published_at": "2026-03-11T13:56:42Z"
        },
        {
          "tag": "v4.36.2",
          "kind": "patch",
          "published_at": "2026-02-19T12:34:30Z"
        },
        {
          "tag": "v4.36.1",
          "kind": "patch",
          "published_at": "2026-01-25T20:03:09Z"
        },
        {
          "tag": "v4.36.0",
          "kind": "minor",
          "published_at": "2026-01-11T14:50:39Z"
        },
        {
          "tag": "v4.35.0",
          "kind": "minor",
          "published_at": "2026-01-09T14:56:56Z"
        },
        {
          "tag": "v4.34.0",
          "kind": "minor",
          "published_at": "2026-01-05T21:24:38Z"
        },
        {
          "tag": "v4.33.1",
          "kind": "patch",
          "published_at": "2025-12-05T15:04:04Z"
        },
        {
          "tag": "v4.32.0",
          "kind": "minor",
          "published_at": "2025-09-20T17:31:45Z"
        },
        {
          "tag": "v4.31.2",
          "kind": "patch",
          "published_at": "2025-08-29T18:05:10Z"
        },
        {
          "tag": "v4.31.1",
          "kind": "patch",
          "published_at": "2025-06-17T21:08:25Z"
        },
        {
          "tag": "v4.31.0",
          "kind": "minor",
          "published_at": "2025-05-27T18:18:44Z"
        },
        {
          "tag": "v4.30.1",
          "kind": "patch",
          "published_at": "2025-05-08T20:41:21Z"
        },
        {
          "tag": "v4.30.0",
          "kind": "minor",
          "published_at": "2025-05-01T07:19:41Z"
        },
        {
          "tag": "v4.29.0",
          "kind": "minor",
          "published_at": "2025-04-21T13:04:55Z"
        },
        {
          "tag": "v4.28.1",
          "kind": "patch",
          "published_at": "2025-04-09T17:50:16Z"
        },
        {
          "tag": "v4.28.0",
          "kind": "minor",
          "published_at": "2025-04-07T15:23:47Z"
        },
        {
          "tag": "v4.27.0",
          "kind": "minor",
          "published_at": "2025-03-24T16:18:59Z"
        },
        {
          "tag": "v4.26.2",
          "kind": "patch",
          "published_at": "2025-03-05T17:55:38Z"
        },
        {
          "tag": "v4.26.1",
          "kind": "patch",
          "published_at": "2025-01-26T20:40:56Z"
        },
        {
          "tag": "v4.26.0",
          "kind": "minor",
          "published_at": "2024-12-25T21:14:51Z"
        },
        {
          "tag": "v4.25.0",
          "kind": "minor",
          "published_at": "2024-10-28T21:34:00Z"
        },
        {
          "tag": "v4.24.0",
          "kind": "minor",
          "published_at": "2024-10-25T12:32:57Z"
        },
        {
          "tag": "v4.23.7",
          "kind": "patch",
          "published_at": "2024-10-07T19:52:57Z"
        },
        {
          "tag": "v4.23.6",
          "kind": "patch",
          "published_at": "2024-10-04T10:44:16Z"
        },
        {
          "tag": "v4.23.5",
          "kind": "patch",
          "published_at": "2024-09-05T17:27:42Z"
        },
        {
          "tag": "v4.23.4",
          "kind": "patch",
          "published_at": "2024-09-05T15:49:42Z"
        },
        {
          "tag": "v4.23.3",
          "kind": "patch",
          "published_at": "2024-06-12T07:51:29Z"
        },
        {
          "tag": "v4.23.2",
          "kind": "patch",
          "published_at": "2024-05-29T10:41:13Z"
        },
        {
          "tag": "v4.23.1",
          "kind": "patch",
          "published_at": "2024-05-04T19:10:36Z"
        },
        {
          "tag": "v4.22.1",
          "kind": "patch",
          "published_at": "2024-04-08T18:55:35Z"
        },
        {
          "tag": "v4.22.0",
          "kind": "minor",
          "published_at": "2024-04-06T14:08:51Z"
        },
        {
          "tag": "v4.21.1",
          "kind": "patch",
          "published_at": "2024-03-10T17:34:25Z"
        },
        {
          "tag": "v4.21.0",
          "kind": "minor",
          "published_at": "2024-02-04T20:39:11Z"
        },
        {
          "tag": "v4.20.0",
          "kind": "minor",
          "published_at": "2023-12-28T19:48:38Z"
        },
        {
          "tag": "v4.19.1",
          "kind": "patch",
          "published_at": "2023-12-18T06:21:43Z"
        },
        {
          "tag": "v4.19.0",
          "kind": "minor",
          "published_at": "2023-12-17T20:46:54Z"
        },
        {
          "tag": "v4.18.0",
          "kind": "minor",
          "published_at": "2023-12-16T22:15:27Z"
        },
        {
          "tag": "v4.17.0",
          "kind": "minor",
          "published_at": "2023-11-19T16:58:03Z"
        },
        {
          "tag": "v4.16.0",
          "kind": "minor",
          "published_at": "2023-10-31T14:49:24Z"
        },
        {
          "tag": "v4.15.0",
          "kind": "minor",
          "published_at": "2023-10-26T17:02:48Z"
        },
        {
          "tag": "v4.14.1",
          "kind": "patch",
          "published_at": "2023-10-21T14:57:21Z"
        },
        {
          "tag": "4.14.0",
          "kind": "minor",
          "published_at": "2023-10-21T13:48:35Z"
        },
        {
          "tag": "4.13.2",
          "kind": "patch",
          "published_at": "2023-10-07T18:29:15Z"
        },
        {
          "tag": "4.13.1",
          "kind": "patch",
          "published_at": "2023-10-03T20:19:05Z"
        },
        {
          "tag": "4.13.0",
          "kind": "minor",
          "published_at": "2023-07-06T20:52:22Z"
        },
        {
          "tag": "4.12.1",
          "kind": "patch",
          "published_at": "2023-06-08T19:05:00Z"
        },
        {
          "tag": "4.12.0",
          "kind": "minor",
          "published_at": "2023-03-28T19:38:45Z"
        },
        {
          "tag": "4.11.1",
          "kind": "patch",
          "published_at": "2023-03-17T21:53:56Z"
        },
        {
          "tag": "4.11.0",
          "kind": "minor",
          "published_at": "2023-03-13T20:41:41Z"
        },
        {
          "tag": "4.10.0",
          "kind": "minor",
          "published_at": "2023-03-10T22:37:39Z"
        },
        {
          "tag": "4.9.2",
          "kind": "patch",
          "published_at": "2023-02-26T17:09:54Z"
        },
        {
          "tag": "4.9.1",
          "kind": "patch",
          "published_at": "2022-12-19T17:18:11Z"
        },
        {
          "tag": "4.9.0",
          "kind": "minor",
          "published_at": "2022-12-12T21:32:20Z"
        },
        {
          "tag": "4.8.1",
          "kind": "patch",
          "published_at": "2022-11-08T21:37:43Z"
        },
        {
          "tag": "4.8.0",
          "kind": "minor",
          "published_at": "2022-11-07T19:38:40Z"
        },
        {
          "tag": "4.7.0",
          "kind": "minor",
          "published_at": "2022-11-04T21:23:37Z"
        },
        {
          "tag": "4.6.0",
          "kind": "minor",
          "published_at": "2022-10-01T19:03:12Z"
        },
        {
          "tag": "4.5.1",
          "kind": "patch",
          "published_at": "2022-08-02T18:58:40Z"
        },
        {
          "tag": "4.5.0",
          "kind": "minor",
          "published_at": "2022-04-12T05:21:38Z"
        },
        {
          "tag": "4.4.0",
          "kind": "minor",
          "published_at": "2022-03-12T21:37:32Z"
        },
        {
          "tag": "4.3.1",
          "kind": "patch",
          "published_at": "2022-03-11T06:42:29Z"
        },
        {
          "tag": "4.3.0",
          "kind": "minor",
          "published_at": "2022-03-04T22:35:00Z"
        },
        {
          "tag": "4.2.0",
          "kind": "minor",
          "published_at": "2022-01-23T15:55:45Z"
        },
        {
          "tag": "4.1.1",
          "kind": "patch",
          "published_at": "2021-12-30T17:15:55Z"
        },
        {
          "tag": "4.1.0",
          "kind": "minor",
          "published_at": "2021-11-21T17:47:53Z"
        },
        {
          "tag": "4.0.0",
          "kind": "major",
          "published_at": "2021-10-31T15:59:13Z"
        },
        {
          "tag": "3.16.0",
          "kind": "minor",
          "published_at": "2021-06-06T16:51:14Z"
        },
        {
          "tag": "3.15.0",
          "kind": "minor",
          "published_at": "2021-04-25T15:49:44Z"
        },
        {
          "tag": "3.14.1",
          "kind": "patch",
          "published_at": "2021-03-13T12:28:58Z"
        },
        {
          "tag": "3.14.0",
          "kind": "minor",
          "published_at": "2021-01-31T17:44:26Z"
        },
        {
          "tag": "3.13.0",
          "kind": "minor",
          "published_at": "2020-12-30T11:15:27Z"
        },
        {
          "tag": "3.12.6",
          "kind": "patch",
          "published_at": "2020-11-23T21:49:55Z"
        },
        {
          "tag": "3.12.5",
          "kind": "patch",
          "published_at": "2020-11-21T21:59:00Z"
        },
        {
          "tag": "3.12.4",
          "kind": "patch",
          "published_at": "2020-11-21T10:28:21Z"
        },
        {
          "tag": "3.12.3",
          "kind": "patch",
          "published_at": "2020-10-10T07:37:49Z"
        },
        {
          "tag": "3.12.2",
          "kind": "patch",
          "published_at": "2020-08-19T19:17:49Z"
        },
        {
          "tag": "3.12.1",
          "kind": "patch",
          "published_at": "2020-08-17T16:20:05Z"
        },
        {
          "tag": "3.12.0",
          "kind": "minor",
          "published_at": "2020-06-01T18:49:46Z"
        },
        {
          "tag": "3.11.2",
          "kind": "patch",
          "published_at": "2020-05-09T11:25:58Z"
        },
        {
          "tag": "3.11.1",
          "kind": "patch",
          "published_at": "2020-05-08T18:02:15Z"
        },
        {
          "tag": "3.11.0",
          "kind": "minor",
          "published_at": "2020-05-02T21:50:16Z"
        },
        {
          "tag": "3.10.0",
          "kind": "minor",
          "published_at": "2020-05-01T13:05:48Z"
        },
        {
          "tag": "3.9.0",
          "kind": "minor",
          "published_at": "2020-04-19T18:51:40Z"
        },
        {
          "tag": "3.8.0",
          "kind": "minor",
          "published_at": "2020-04-14T21:08:13Z"
        },
        {
          "tag": "3.7.0",
          "kind": "minor",
          "published_at": "2020-04-11T15:34:34Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "74910ccf10e7c037a9f520bceb3191bc48a5dde2",
          "body": null,
          "is_bot": false,
          "headline": "Replace imgur e2e image with gh-pages copy",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-22T14:02:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "611b8b6cf908d36f0262f1f0c9a6a09604ec47f5",
          "body": null,
          "is_bot": false,
          "headline": "4.41.3",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T14:45:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5465bfc56a0a4b58c84228d82f933480237bfc5",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 4.41.3",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T14:45:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "126ee912abb9ce71f185401e1d608f5d89827c8d",
          "body": null,
          "is_bot": false,
          "headline": "Ignore CLAUDE.local.md",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T14:42:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e8986c970c2debcde61c08eb78ff7f04aec0633",
          "body": "The src/package.json added in 4.41.1 for native ESM shadowed the root\npackage.json's sideEffects declaration, so webpack kept unreferenced\nmodules and custom builds came out roughly twice their intended size.\nDeclare sideEffects in src/package.json too, and add a bundle-size guard\nto the custom-build suite since the parse-output comparison alone cannot\ncatch a bloated but functionally correct bundle.",
          "is_bot": false,
          "headline": "Restore side-effect-free tree-shaking of the src modules",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T14:41:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7e73b043ecbb207a0a9e8455b20428e94cd61c6",
          "body": null,
          "is_bot": false,
          "headline": "4.41.2",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:14:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f53ba58bbe273e9640fd57ce45558799f784b4e1",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 4.41.2",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:14:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f548d92aebeff148ed83f91460dcfa5b3dd8affe",
          "body": null,
          "is_bot": false,
          "headline": "Add built files",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0044ddf78cb8b9063c177005b2d250539573c4c8",
          "body": "The custom_test-issue-240-xmp-full-cpu.jpeg fixture takes 26 to 43\nseconds per parse pair on a mid-range machine depending on thermal\nstate, measured with an interleaved benchmark at both the branch base\nand HEAD (the refactor branch is marginally faster, so the failures\nwere not a regression). The \n[…]\nthing is already broken, so passing runs are unaffected.\n\nVerified: full integration suite 3367 passing on a loaded machine\nthat previously produced five timeouts, unit suite 1221 passing,\nlint clean.",
          "is_bot": false,
          "headline": "Raise the per-image timeout headroom in the oracle suites",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3cffc8822aae637b59df9c166c6b418c668ce085",
          "body": "Isomorphism card\n\nChange: same lever as the png-file-tags table, applied to\ngif-file-tags. Six getters with the shared guard-read-wrap shape\nbecome a FIELDS table and one getFieldTag reader. Value lambdas\nreceive the row's offset so the bit-mask reads of byte 10 stay\nexplicit per row.\n\nEquivalence c\n[…]\ned-buffer cases.\n\nVerification:\n- Unit tests: 1221 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: src/gif-file-tags.js 116 to 53.",
          "is_bot": false,
          "headline": "Table-drive the GIF header fields",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "621a73b5d4d5afc4f0c674ec772bf12948e7fdf1",
          "body": "Isomorphism card\n\nChange: the seven png-file-tags getters repeated the same\nguard-read-wrap shape with different offsets, sizes, readers, and\ndescription formatters. They become a FIELDS table and one\ngetFieldTag reader.\n\nEquivalence contract:\n- Key order and presence: read still produces all seven \n[…]\n21 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Coverage improved to 95.83/93.19/98.39/95.83.\n- Lint and type tests clean.\n- LOC: src/png-file-tags.js 137 to 62.",
          "is_bot": false,
          "headline": "Table-drive the PNG file header fields",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f4e093a97336892efd419575144e3b5a90daaec",
          "body": "Isomorphism card\n\nChange: the multi-Exif segment chooser kept four parallel locals and\nthree count-indexed arms where the second and third differed only in\nlazily scoring the stored first segment. It becomes one\nbestExifSegment object with a lazy score sentinel.\n\nEquivalence contract:\n- One segment:\n[…]\n- Golden corpus: sha256 identical to baseline 9122f420, including\n  captured console.warn calls.\n- Lint and type tests clean.\n- LOC: src/image-header-jpeg.js net -7 with the fast-path comment\n  added.",
          "is_bot": false,
          "headline": "Track the best Exif segment with one running-best object",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6bc6fab28b75e99fe433248f22f94496af41f195",
          "body": "Isomorphism card\n\nChange: the mergeXmpGroupAssign and mergeBrobXmpDeferred handlers in\napplyMergeStep ended with the same nine lines, expanded assignment or\nflat hoist with _raw stripped. They now call a shared mergeXmpGroup\nnext to its siblings mergeAssignGroup and mergeMergeGroup.\n\nEquivalence con\n[…]\n none involved.\n\nVerification:\n- Unit tests: 1221 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: src/loadview-pipeline.js net -7.",
          "is_bot": false,
          "headline": "Share the XMP flat and expanded merge between the two XMP steps",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "344eb1b19cdf1b1b8ecd5a1ef922a35d8bd4625f",
          "body": "Isomorphism card\n\nChange: isHeicFile and isAvifFile duplicated the null-guard, parseBox\ncall, and brand comparison. The shared hasMajorBrand(dataView, brands)\nlives in image-header-iso-bmff.js next to parseBox. HEIC passes its\nnine-brand list, AVIF passes ['avif']. The two modules stay separate\nso t\n[…]\n effects: none involved.\n\nVerification:\n- Unit tests: 1221 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: net -13 across 3 files.",
          "is_bot": false,
          "headline": "Share the ISO-BMFF major-brand recognizer between HEIC and AVIF",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7f210db9e7162304c0d190ab3c518a6382c3656e",
          "body": "Isomorphism card\n\nChange: shouldReadFileTagsForFileTypeOnlyOptimization expressed one\nboolean condition as six early-return blocks. It becomes three\nstatements with the same truth table.\n\nEquivalence contract, by case analysis:\n- No includeTags: true before and after.\n- composite === true, or compos\n[…]\nng, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420, including the\n  filter-include and filter-exclude variants.\n- Lint and type tests clean.\n- LOC: src/exif-reader.js net -20.",
          "is_bot": false,
          "headline": "Flatten the FileType-only optimization predicate",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "370c8b1c289c3a8b97e0a8e8d1810391ac553197",
          "body": "Isomorphism card\n\nChange: getItemInformationBoxOffsetsAndSizes built an offsets object\nand a sizes object but its only caller used a single number, the item\ninfos offset. The name also promised sizes that were never returned.\nThe computation collapses into parseItemInformationBox as\ncontentOffset + \n[…]\neferences.\n\nVerification:\n- Unit tests: 1221 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: src/image-header-iso-bmff.js net -15.",
          "is_bot": false,
          "headline": "Inline the iinf offset computation",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8b842dbd32586fec65078a1395a3dc9b03fc9f2a",
          "body": "Isomorphism card\n\nChange: BOX_TYPE_OFFSET and BOX_MIN_LENGTH were function locals in\nparseBox and duplicated in image-header-jxl.js (the latter under the\nname BOX_HEADER_MIN_SIZE). They move to module scope in\nimage-header-iso-bmff.js, next to the other box constants, and the\nJXL finder imports them\n[…]\nader-iso-bmff, no\n  new dependency edge.\n\nVerification:\n- Unit tests: 1221 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: net -2.",
          "is_bot": false,
          "headline": "Share the ISO-BMFF box layout constants with the JXL finder",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f702707d19b799efc7bcab0aca860bad4f6e482b",
          "body": "Implements the dedup designed in FOLLOWUP-dedup-metadata-blocks.md.\n\nIsomorphism card\n\nChange: the guarded metadata-block push appeared byte-identically in\nthe jpeg, png, webp, and jxl finders, with equivalent variants in gif,\nxml, and two iso-bmff sites. All eight sites now call\npushMetadataBlock(m\n[…]\n the helper, none removed.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Coverage 95.50/92.96/98.38/95.50, above thresholds.\n- Lint and type tests clean.\n- LOC: src net -30 across 8 files.",
          "is_bot": false,
          "headline": "Extract the shared metadata-block push helper",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9015a842212682ef32f70b84dd554265a347395d",
          "body": "Isomorphism card\n\nChange: icc-tags.js and icc-tag-names.js each defined an identical\nsliceToString. The dictionary keeps the definition and exports it, the\nparser imports it and drops its copy. The parser already imported the\ndictionary, so no new dependency edge or cycle is introduced.\n\nEquivalence\n[…]\nnd\n  neither ships otherwise, unchanged.\n\nVerification:\n- Unit tests: 1218 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: net -4.",
          "is_bot": false,
          "headline": "Share one sliceToString between the ICC parser and dictionary",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "48087d385115fb4c244e34812c46d3bd41b023d8",
          "body": "Isomorphism card\n\nChange: getStringValue in tag-names-utils.js was byte-identical to\ngetStringValueFromArray in utils.js. It becomes a renaming re-export.\nThe import keeps a local binding because getEncodedString in the same\nfile calls it.\n\nEquivalence contract:\n- Inputs covered: every dictionary de\n[…]\nurface touched.\n\nVerification:\n- Unit tests: 1218 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: src/tag-names-utils.js 33 to 32.",
          "is_bot": false,
          "headline": "Reuse getStringValueFromArray as the dictionaries' getStringValue",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a01e087d0333944911a4173c993e447d9f92bb31",
          "body": "Isomorphism card\n\nChange: totalSizeFromFetchResponse and totalSizeFromNodeResponse\nduplicated the header parsing, differing only in how a header is\nlooked up (Headers.get versus plain property). The parsing moves into\ntotalSizeFromRangeHeaders and the two wrappers keep their own guards\nand lookups.\n\n[…]\ne effects: none.\n\nVerification:\n- Unit tests: 1218 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: src/file-loaders.js 328 to 317.",
          "is_bot": false,
          "headline": "Share the Content-Range and Content-Length size parsing",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "371c6fa42b85c793cb2cf88e6f20d22ea0b0d690",
          "body": "Isomorphism card\n\nChange: the three identical typeof Promise === 'undefined' guards in\nload, loadView, and loadAuto move into assertPromiseSupport in\nutils.js. The similar looking guard inside the ICC deferred branch is\nNOT touched because its condition is !async, a different check that\nonly shares \n[…]\nssing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Coverage 95.47/92.96/98.38/95.47, above thresholds.\n- Lint and type tests clean.\n- LOC: net -4 (sites -10, helper +6).",
          "is_bot": false,
          "headline": "Share one Promise availability guard",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16d8f522b21b9b0fa6194c28d8cfb7494b21d176",
          "body": "Isomorphism card\n\nChange: the string and browser File branches of load were identical\nexcept for which loader function they called. They become one branch\nthat selects the loader with a ternary.\n\nEquivalence contract:\n- Inputs covered: URL and path strings, browser File objects, and the\n  buffer fal\n[…]\n, byte identical.\n\nVerification:\n- Unit tests: 1218 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: src/exif-reader.js 975 to 968.",
          "is_bot": false,
          "headline": "Merge the twin file path and File object branches in load",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "750f8f52dab321101f804443d3b38400cff55298",
          "body": "Isomorphism card\n\nChange: exif-reader.js carried its own copy of the getDataView\ntry-native-fall-back-to-wrapper helper. It now imports the one in\nutils.js and drops the local copy plus the direct DataViewWrapper\nimport. The two duplicate utils import statements are merged.\n\nEquivalence contract:\n- \n[…]\nurface\n  touched.\n\nVerification:\n- Unit tests: 1218 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: src/exif-reader.js 985 to 975.",
          "is_bot": false,
          "headline": "Reuse the shared getDataView from utils",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fc39855dec2f59146d36de7d681c35048dacf9c1",
          "body": "Isomorphism card\n\nChange: readExifIfd, readGpsIfd, and readInteroperabilityIfd in\ntags.js were copies differing only in pointer-tag key and IFD type.\nThey become one readSubIfd function driven by a SUB_IFDS table, called\nin a loop from read.\n\nEquivalence contract:\n- Inputs covered: every TIFF-based \n[…]\ng the 'exif'\n  group key.\n\nVerification:\n- Unit tests: 1218 passing, count unchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: src/tags.js 107 to 68.",
          "is_bot": false,
          "headline": "Collapse the three sub-IFD readers into one table-driven reader",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "574f0c733e61f58762a1880ce7eb983f3e5dbfc3",
          "body": "Isomorphism card\n\nChange: replace the ten one-line has*Data predicates that just test\nx !== undefined with the test itself at their call sites, and delete\nthe function definitions. The three array predicates (hasXmpData,\nhasIccData, hasPngTextData) and the two maker-note predicates\n(hasCanonData, ha\n[…]\nunchanged.\n- Golden corpus: sha256 identical to baseline 9122f420.\n- Coverage 95.44/92.88/98.39/95.44, above thresholds 93/90/98/93.\n- Lint and type tests clean.\n- LOC: src/exif-reader.js 1027 to 985.",
          "is_bot": false,
          "headline": "Inline the trivial has*Data offset predicates",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "24459341a1bfdadcaf86738fbaf1c13cf6ede3ec",
          "body": "Isomorphism card\n\nChange: delete the second-level default object for loadView's options\nparameter. The per-property destructuring defaults already produce the\nexact same values when the argument is omitted, and the object is never\nconsulted when a caller passes an options object.\n\nEquivalence contra\n[…]\n: 1218 passing, count unchanged.\n- Golden corpus (186 fixture images x 8 option variants): sha256\n  identical to baseline 9122f420.\n- Lint and type tests clean.\n- LOC: src/exif-reader.js 1037 to 1027.",
          "is_bot": false,
          "headline": "Remove redundant default options object from loadView",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T12:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "16f0a9ab7c26c000c117c4ffb91e11449e79c7c1",
          "body": null,
          "is_bot": false,
          "headline": "Link security advisory in changelog for 4.41.1",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T11:16:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76dd683f869848b0e5317eec8931dc182815a46b",
          "body": "When the buffer ends in the middle of an iloc item header, a DataView\nread would throw and the whole box was discarded, losing the items\nthat were fully present. Now parsing stops cleanly at the first\ntruncated header and returns the valid prefix, so Exif and XMP that\nare actually in the buffer are still found. This is a graceful\ndegradation fix for truncated files and partial reads, not a\nsecurity fix.",
          "is_bot": false,
          "headline": "Return valid items from a truncated HEIC/AVIF iloc box",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T11:16:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20dfd6ec542fb4cb0933b512a02a92997828374c",
          "body": null,
          "is_bot": false,
          "headline": "4.41.1",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T10:11:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "744098996a71aa2e5fb0215170ded05c88a919f1",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 4.41.1",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T10:10:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17b901cd192d2c90d7f9f347bd3073b28b482699",
          "body": "…fcc)\n\nA malformed ISO-BMFF iloc box could cause excessive memory allocation\nduring parsing. Bound parsing to the available input so allocation stays\nproportional to file size. Add regression tests.",
          "is_bot": false,
          "headline": "Fix denial-of-service on crafted HEIC/AVIF metadata (GHSA-pj96-35fp-c…",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-18T10:03:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e2a930978671b4530c00fd7cda287c0f9a5b6ef",
          "body": "Bumps the all-dependencies group with 2 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) and [typescript](https://github.com/microsoft/TypeScript).\n\n\nUpdates `@eslint/js` from 9.39.4 to 9.39.5\n- [Release notes](https://github.com/eslint/eslint/releases)\n- [Commits](https\n[…]\ndependency-version: 7.0.2\n  dependency-type: direct:development\n  update-type: version-update:semver-major\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the all-dependencies group with 2 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-17T11:40:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "30623d32d3b877a9137a1f5393db0fd4030ba4fe",
          "body": "Bumps [systeminformation](https://github.com/sebhildebrandt/systeminformation) from 5.31.6 to 5.31.17.\n- [Release notes](https://github.com/sebhildebrandt/systeminformation/releases)\n- [Changelog](https://github.com/sebhildebrandt/systeminformation/blob/master/CHANGELOG.md)\n- [Commits](https://githu\n[…]\ne/v5.31.6...v5.31.17)\n\n---\nupdated-dependencies:\n- dependency-name: systeminformation\n  dependency-version: 5.31.17\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump systeminformation from 5.31.6 to 5.31.17",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-16T05:59:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2718a31fb7b9cfda9f235c5aa399c097edf2e074",
          "body": "Bumps [websocket-driver](https://github.com/faye/websocket-driver-node) from 0.7.4 to 0.7.5.\n- [Changelog](https://github.com/faye/websocket-driver-node/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/faye/websocket-driver-node/compare/0.7.4...0.7.5)\n\n---\nupdated-dependencies:\n- dependency-name: websocket-driver\n  dependency-version: 0.7.5\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump websocket-driver from 0.7.4 to 0.7.5",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-16T05:58:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "252bc748e632d6ca3640b62a043740c1ea8242c4",
          "body": "Bumps [ws](https://github.com/websockets/ws) from 8.18.0 to 8.21.0.\n- [Release notes](https://github.com/websockets/ws/releases)\n- [Commits](https://github.com/websockets/ws/compare/8.18.0...8.21.0)\n\n---\nupdated-dependencies:\n- dependency-name: ws\n  dependency-version: 8.21.0\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump ws from 8.18.0 to 8.21.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-11T15:04:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87fc9d86887896949ee658bd908e0036443f3303",
          "body": "Bumps the all-dependencies group with 6 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `26.0.1` | `26.1.1` |\n| [cypress](https://github.com/cypress-io/cypress) | `15.18.0` | `15.18.1`\n[…]\ndependency-version: 5.2.6\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the all-dependencies group across 1 directory with 6 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-11T14:49:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f3de2e6f5fd4e648241a4b038beac3addfa2a0ed",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade actions/checkout to v7",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-07-05T14:12:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c308b3b976a14adc9d0b16d8f22093fc663405b",
          "body": "Bumps the all-dependencies group with 4 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [cypress](https://github.com/cypress-io/cypress), [webpack](https://github.com/webpack/webpack) and [webpack-cli](https://github.com/webpack/webpack-cli).\n\n\nUpdate\n[…]\ndependency-version: 7.1.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the all-dependencies group with 4 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-03T11:39:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "858a1d704666de72751c848817e97964aa0df479",
          "body": "Bumps the all-dependencies group with 2 updates in the / directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [globals](https://github.com/sindresorhus/globals).\n\n\nUpdates `@types/node` from 25.9.3 to 26.0.0\n- [Release notes](https://github.com/Defini\n[…]\nependency-version: 17.7.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the all-dependencies group across 1 directory with 2 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-26T14:11:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "214228703e9a0bc9113e3d31a9d653d7f48eda88",
          "body": "Bumps [form-data](https://github.com/form-data/form-data) from 4.0.5 to 4.0.6.\n- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/form-data/form-data/compare/v4.0.5...v4.0.6)\n\n---\nupdated-dependencies:\n- dependency-name: form-data\n  dependency-version: 4.0.6\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump form-data from 4.0.5 to 4.0.6",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-19T12:22:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9dbe16447e6c5550cb37579dffd1e6ebab22f922",
          "body": "Bumps [js-yaml](https://github.com/nodeca/js-yaml) from 4.1.1 to 4.2.0.\n- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/nodeca/js-yaml/commits)\n\n---\nupdated-dependencies:\n- dependency-name: js-yaml\n  dependency-version: 4.2.0\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump js-yaml from 4.1.1 to 4.2.0",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-19T12:22:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "398bbb1035e57a2de6b9e98719baa00dbab083ad",
          "body": "Bumps the all-dependencies group with 4 updates in the / directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [cypress](https://github.com/cypress-io/cypress), [npm-run-all2](https://github.com/bcomnes/npm-run-all2) and [webpack-dev-server](https://githu\n[…]\ndependency-version: 5.2.5\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the all-dependencies group across 1 directory with 4 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-19T11:57:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2536ba519e421b5079ed7a2b33f49cbfaea64b4a",
          "body": null,
          "is_bot": false,
          "headline": "Reduce cooldown in Dependabot to 3 days",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-14T19:30:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6ee3970a0950751b83d59366b10c1baaf9c9cb3",
          "body": "Chai 5 went ESM only, which the old Babel-to-CommonJS test pipeline\ncould not load, and that kept the project two major versions behind.\nThe native ESM test toolchain removes that blocker, so this jumps\ndirectly to the current major (the 5.x line is already dist-tagged\nas legacy). Chai 6 additionall\n[…]\nuire() of ES modules, verified on Node\n22.18 and 24. All suites pass (1218 unit, 3367 integration, 28262\nbuild), coverage thresholds hold, and mocha renders chai assertion\ndiffs identically to before.",
          "is_bot": false,
          "headline": "Upgrade chai from 4 to 6",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-13T10:52:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0acb4738776f948de92156b2d34041b3c017d493",
          "body": "The two IPTC error inputs asserted an empty result that a benign\nno-op parse also produces, a weakness introduced by the rewire\nconversion (the originals asserted specific thrown messages). They\nnow embed a parseable tag so a removed signature or block type check\nyields a non-empty result.\n\nThe ICC \n[…]\n stays\ngreen. This was the only bare to.throw in the suite.\n\nEach of these was verified by mutation or inversion, breaking the\nguard or flipping the assertion makes exactly the strengthened test\nfail.",
          "is_bot": false,
          "headline": "Strengthen tests that could not fail",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-13T10:52:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "913d584193b68d5806fc19b90427e3d096ce569a",
          "body": "The main job now tests on the active LTS lines, ubuntu 22.x and\n24.x and windows 24.x. The integration suite runs in CI for the\nfirst time, in the build-test job on Node 24.x, because the Babel\nremoval gave it a real Node version dependency that nothing\nverified.\n\nThe Node floors differ per suite. T\n[…]\n the published\npackage still supports them. AGENTS.md describes the new mocking\nguidance, swapProperties plus real fixtures instead of a\nmodule-mocking library, and the native ESM import requirements.",
          "is_bot": false,
          "headline": "Modernize CI and update the agent guide",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-13T10:52:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6b648a601017b96c63a0d3664aeba53d24317fa6",
          "body": "A new test/build/packaging.js asserts that the npm tarball contains\nsrc/package.json with exactly the module type marker and that\nrequire of the package root still resolves the UMD bundle in dist.\nIt runs as part of test:build and the pre-commit suite. The\nCHANGELOG documents the consumer-visible fi\n[…]\nt execFileSync can only run through\na shell, and the custom cache path travels as an environment\nvariable so it never passes through that shell. The temporary cache\ndirectory is removed after the run.",
          "is_bot": false,
          "headline": "Guard the shipped src ES module marker with packaging tests",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-13T10:52:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0bd32460176bb2540167d802d74e44a59b4c2754",
          "body": "The unit suite now runs directly on Node instead of being transpiled\nthrough @babel/register. Nested package.json files with a module type\nmarker make Node treat src/ and test/unit/ as ES modules, and all\nrelative imports in the specs carry explicit .js extensions as native\nESM requires. The integra\n[…]\nt\nmeasured 95.46/92.91/98.42/95.46). babel-plugin-rewire,\n@babel/register, and nyc leave the dev dependencies. Babel itself\nstays for the webpack build only.\n\nThe unit suite wall clock drops about 3x.",
          "is_bot": false,
          "headline": "Run unit and integration tests on native ESM without Babel",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-13T10:52:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f8903bc733c3717a6b0bad5ea11380de27284937",
          "body": "All 20 unit spec files that used rewire APIs now use one of three\nrunner-agnostic techniques instead. Shared default-export module\nobjects (Constants, TagNames, Tags, ImageHeader and friends) are\nmocked by swapping properties on the real instance with the new\nswapProperties helper in test-utils.js, \n[…]\no the real\nfunctions run.\n\nTest count is unchanged at 1218 and coverage stays above the\nenforced thresholds. This prepares for removing babel-plugin-rewire\nand @babel/register from the test toolchain.",
          "is_bot": false,
          "headline": "Replace babel-plugin-rewire usage with explicit test seams",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-13T10:52:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dbd6568bb633bfc9c0c3d605f763b0df70a90d65",
          "body": "Replace the seven .eslintrc.json files and .eslintignore with a single\neslint.config.mjs. The effective ruleset is preserved. The four rules\nthat ESLint 9 added to eslint:recommended are adopted with zero new\nfindings, and no-extra-semi and no-inner-declarations stay enforced by\nconfiguring them exp\n[…]\nlt-in globals\nautomatically. Rebuild the dist sourcemap to keep its embedded sources\nin sync with that comment change. Update the bower.json ignore list\nand AGENTS.md to reference the new config file.",
          "is_bot": false,
          "headline": "Migrate from ESLint 8 to ESLint 9 with flat config",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-12T13:25:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f776711a5f593d823678e7148191843c376f9a5e",
          "body": null,
          "is_bot": false,
          "headline": "Replace npm-run-all with maintained npm-run-all2",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-12T11:44:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ae9dce011b61e5094a24b0f4261c192ca03cc8c",
          "body": null,
          "is_bot": false,
          "headline": "Reference GHSA-g77h-45rf-hcx4 in the 4.40.1 changelog",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-08T10:14:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1874a9edb44fc0121bd894094c0aaa8569728f08",
          "body": null,
          "is_bot": false,
          "headline": "4.41.0",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-08T09:26:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ccdefb848121928a1e66dab5168d7c958357747",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 4.41.0",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-08T09:26:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b81280093b8b6b79859216b1175f7f3d7c46f4c9",
          "body": "Tree-shake the merge pipeline: loadview-pipeline.js was outside the\nwebpack string-replace regex, so every format's merge handler (PNG, JPEG\nXL, ICC, XMP) shipped in every custom build. Gate them with existing\nflags so a JPEG plus Exif build drops about 0.8 KiB gzipped. Also remove\ncommented-out Photoshop descriptor scaffolding (no bundle impact).",
          "is_bot": false,
          "headline": "Shrink custom builds, drop dead Photoshop comments",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-08T09:04:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26e42c43efc9cad68a370b40b9c0ec19a017140d",
          "body": "Replace the node_modules rename dance with a toolchain install into a\nunique os.tmpdir() directory, which webpack finds via\nresolveLoader.modules and NODE_PATH. The exifreader package's own\nnode_modules is never moved or left with the toolchain behind, and an\ninterrupted or concurrent build can no longer strand or corrupt it. The\ntemp dir is removed in a best-effort finally. The maintainer full build\nis unchanged.",
          "is_bot": false,
          "headline": "Isolate the custom-build toolchain in an OS temp dir",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-08T09:04:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db7a7347bf15a0c98a6e82006a91e1dc114d1b5a",
          "body": "Custom builds (tree-shaking out unused formats and tags) have only been\ntriggerable through an npm postinstall script. npm is moving away from\nautomatic install scripts, and postinstall is skipped under\n`npm ci --ignore-scripts`, so depending on it for the library's size\nfeature is increasingly frag\n[…]\new\ncommand and the migration.\n\nUnit tests cover the CLI and the config resolver, and the custom-build\nintegration suite gains a scenario that installs with --ignore-scripts and\nbuilds through the CLI.",
          "is_bot": false,
          "headline": "Add npx exifreader build for custom builds without a postinstall script",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-08T09:04:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7a37c8d6b1289d11bbd0d09863f6a28a69fad5ca",
          "body": "Bumps the all-dependencies group with 7 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) | `7.29.0` | `7.29.7` |\n| [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) | `7.29.5` | `\n[…]\ndependency-version: 7.0.3\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the all-dependencies group with 7 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-05T11:19:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4120c8323dba5991bacd50df72b4d73a88fc1668",
          "body": null,
          "is_bot": false,
          "headline": "4.40.5",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-03T18:48:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "422027f7e66e98c53ebdac5604328a905f98e06e",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 4.40.5",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-03T18:47:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "981ae21ce60007cf16b9179f0d9a1705cc77cc96",
          "body": "Bumps [launch-editor](https://github.com/vitejs/launch-editor) from 2.6.1 to 2.14.1.\n- [Commits](https://github.com/vitejs/launch-editor/compare/v2.6.1...v2.14.1)\n\n---\nupdated-dependencies:\n- dependency-name: launch-editor\n  dependency-version: 2.14.1\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump launch-editor from 2.6.1 to 2.14.1",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-03T18:37:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "577333586460a6bb1d17e3e54ef4c4ad475a0854",
          "body": "When parsing an ICC profile with a crafted mluc tag, an attacker can\ndeclare a record count that passes the existing recordsSize bounds check\n(by making the buffer large enough to hold the records) but is still\nlarge enough to make the parser allocate one object per record. For the\nlargest reachable\n[…]\ny fixed in 4.39.0, and the\nper-record text decode was bounded in 4.40.4. A regression test covers a\nrecord count over the cap with records that fit the buffer, plus a\nboundary case at exactly the cap.",
          "is_bot": false,
          "headline": "Cap mluc record count to prevent DoS from crafted ICC profiles",
          "author_name": "Maulana",
          "author_login": "ulsreall",
          "committed_at": "2026-06-03T18:36:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c969bb9db54d5e58ee1dc9afe5d4475b4db6c95",
          "body": null,
          "is_bot": false,
          "headline": "4.40.4",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-03T14:12:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be45f03d473a31568c946792d8a3e7c111bb3869",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 4.40.4",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-03T14:11:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d26bf1644e78148358085cf632a3297c9dc6e6b1",
          "body": "The three \"incomplete/corrupt data\" guards in the ICC parser compared\nagainst `buffer.length`, but `buffer` is an ArrayBuffer whose `.length`\nis always `undefined`, so every comparison was false and the guards\nnever fired. A malformed profile (declared length too small for the\ntag table, or a tag of\n[…]\ne end) ran past its data,\nthrew a RangeError on a DataView read, and readIcc's try/catch\ndiscarded everything. Measure `dataView.byteLength` instead so the\nguards return the header tags parsed so far.",
          "is_bot": false,
          "headline": "Fix dead ICC bounds checks so malformed profiles return header tags",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-03T14:06:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42a95d5b893e1f09528e26400510a728bc075b7f",
          "body": "A crafted ICC `mluc` tag could decode far more text than the profile\nholds via huge or overlapping per-record textLength/textOffset, causing\nexcessive memory use. Clamp each record's text to its tag and cap the\ntotal decoded across the profile at the profile size; real profiles,\nwhere records may legitimately share text within a tag, are unaffected.",
          "is_bot": false,
          "headline": "Bound ICC mluc decoded text to prevent a denial-of-service",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-06-03T10:37:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe4f19ff82e0acfe3415f39698d2e4914e73edcc",
          "body": null,
          "is_bot": false,
          "headline": "4.40.3",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-31T18:40:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb1bb43f38e26d4625607c746467bbd5172e9736",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 4.40.3",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-31T18:38:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da8c736f358c364b22732ac1b68bcc795dd80c41",
          "body": "fetchRange ignored response.status, so 4xx/5xx error bodies were parsed\nand surfaced as a misleading \"Invalid image format\". It now rejects with\n\"Could not fetch file: <status>\", matching the Node path; 416 still\npasses through for the length:\"auto\" fallback. Both loaders now reject\nwith an Error (Node previously rejected with a string).",
          "is_bot": false,
          "headline": "Reject 4xx/5xx HTTP responses in the browser fetch loader",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-31T18:35:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "597f9fa642aa992b2f1394775f41f07705ea7f78",
          "body": null,
          "is_bot": false,
          "headline": "4.40.2",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-30T20:43:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4fe37d596e99708fa5dd2b35fe26efa9c2fb02f7",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 4.40.2",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-30T20:42:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c4fcceb70b7e7d1eaccfa3979a5a6fd6ba519c6a",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade @xmldom/xmldom to version 0.9.10",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-30T20:33:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ea9d58c48fb64b7aea744c4222671db18e2ea88",
          "body": null,
          "is_bot": false,
          "headline": "4.40.1",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-30T18:37:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d824bf6290792ebe880e3ce2ef1c42aaf0c5420",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 4.40.1",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-30T18:36:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8c8728faa71de2bef930614d7b9248ce3ebf2538",
          "body": "Fix several crashes where crafted or truncated metadata threw an\nuncaught error out of load()/loadView() instead of degrading gracefully:\n- short WebP VP8X chunk (out-of-bounds read)\n- truncated PNG iCCP chunk in async mode\n- HEIC/AVIF Exif item whose TIFF header offset points outside the file\n- tru\n[…]\n- cap multi-extent assembly to the source size (memory amplification)\n- length:'auto' fallback buffer corruption on a Range-ignoring 200, and\n  Node (non-fetch) 416 now falls back instead of rejecting",
          "is_bot": false,
          "headline": "Harden metadata parsing against malformed and truncated input",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-30T18:25:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "00878ca9df0e26480dda7a931c888048c9f7be45",
          "body": "A HEIC/AVIF file with a valid `ftyp` box followed by a malformed or\ntruncated ISO-BMFF box could cause parsing to throw instead of returning\nthe detected file type and whatever metadata was readable.\n\nAdd bounds checks (`hasBytes`) before the box-header reads in `parseBox`\nand `getBoxLength`, and treat a box whose deeper fields run past the\nbuffer as unparseable so the box walk stops cleanly. `isHeicFile` /\n`isAvifFile` now return a strict boolean.",
          "is_bot": false,
          "headline": "Handle malformed and truncated ISO-BMFF boxes gracefully",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-30T10:34:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8cb0261a26b7d986955fe0a6780f076dcb7902e7",
          "body": null,
          "is_bot": false,
          "headline": "4.40.0",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-29T13:18:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b83b10ba8f45f430e7c2a2d8701a4e0c59f4eed",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog for 4.40.0",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-29T13:18:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c5e77a55272025227bfe1028c1c6dc02ef59e49",
          "body": null,
          "is_bot": false,
          "headline": "Add Claude skills dir to .gitignore",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-29T13:18:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b34dddd9424d75c36ea916d3f2430ccb2061f99c",
          "body": "Bumps the all-dependencies group with 3 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [mocha](https://github.com/mochajs/mocha) and [webpack](https://github.com/webpack/webpack).\n\n\nUpdates `@types/node` from 25.8.0 to 25.9.1\n- [Release notes](https:\n[…]\npendency-version: 5.107.1\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the all-dependencies group with 3 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-29T13:14:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7f7125c098f6ed9069db69ab07fdcfead0601fd2",
          "body": "When paired with `expanded: true` and `includeOffsets: true`, ExifReader\nreads an initial 128 KiB prefix, parses it, and only issues a follow-up\nHTTP `Range` request (or filesystem read / `File.slice`) when the metadata\nextends past it. Most images converge in one read. HEIC/AVIF files with\n`iloc` p\n[…]\nrue}` so the loop does not chase the embedded\nsub-image preview past the actual metadata. On a 1.5 GiB corpus this is\nthe difference between a slight slowdown and a 6× speedup with 98% of\nbytes saved.",
          "is_bot": false,
          "headline": "Add length: 'auto' for adaptive minimal-fetch of metadata",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-29T12:09:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f36c46fdd535ac6dede2e98145e56a0a38663796",
          "body": "Items with `constructionMethod` 1 were read from the wrong file offset,\nproducing garbage or no tags. They are now resolved through the\nsurrounding meta box's idat sub-box. Items with `constructionMethod` 2\n(item_offset) are still not supported but are now skipped with a\n`console.warn` instead of re\n[…]\n\nMulti-extent Exif and XMP items are now parsed end-to-end via a\nsynthetic buffer (was: first extent only), threaded through MakerNote\nand Thumbnail extraction so downstream offsets resolve correctly.",
          "is_bot": false,
          "headline": "Fix HEIC/AVIF iloc constructionMethod 1 (idat) and multi-extent parsing",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-28T06:57:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "78b9888892de8413bac9c67708ad305917614a2f",
          "body": "When paired with `expanded: true`, this attaches a `metadataRange`\nobject to the result with `start`, `end`, `complete`, and a sorted\n`blocks` list describing where each metadata segment sits in the file.\nSupports JPEG, PNG, WebP, HEIC, AVIF, JPEG XL (container), GIF, and\nstandalone XMP. Useful for persisting only the metadata-bearing prefix\nof an image instead of the whole file. Fixes #121.",
          "is_bot": false,
          "headline": "Add includeOffsets option to locate metadata in the file",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-28T06:57:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d1195de7fa45208831dec042e9640b6c14a0f85",
          "body": "Standalone profiler that parses every image in a folder and reports\nper-format timing stats (count, total bytes, mean/p50/p95 ms,\nthroughput, errors) plus a top-N slowest-files view.",
          "is_bot": false,
          "headline": "Add bin/profile.js for benchmarking parse performance",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-28T06:57:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb0112d26a71c66f08309985588cf44217ceb2ca",
          "body": "Bumps [tmp](https://github.com/raszi/node-tmp) from 0.2.4 to 0.2.7.\n- [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/raszi/node-tmp/compare/v0.2.4...v0.2.7)\n\n---\nupdated-dependencies:\n- dependency-name: tmp\n  dependency-version: 0.2.7\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump tmp from 0.2.4 to 0.2.7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-28T05:18:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "875bc54f776c16dfbca0154dccecdcc7f5482cb8",
          "body": "Bumps the all-dependencies group with 3 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [cypress](https://github.com/cypress-io/cypress) and [terser-webpack-plugin](https://github.com/webpack/minimizer-webpack-plugin).\n\n\nUpdates `@types/node` from 25.\n[…]\ndependency-version: 5.6.0\n  dependency-type: direct:development\n  update-type: version-update:semver-minor\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the all-dependencies group with 3 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-22T20:48:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7b9dbc744d0e688cf2d24fe2bb17a5ef32928e99",
          "body": "Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 5.2.3 to 5.2.4.\n- [Release notes](https://github.com/webpack/webpack-dev-server/releases)\n- [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/webpack/webpack-\n[…]\n.3...v5.2.4)\n\n---\nupdated-dependencies:\n- dependency-name: webpack-dev-server\n  dependency-version: 5.2.4\n  dependency-type: direct:development\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump webpack-dev-server from 5.2.3 to 5.2.4",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-20T12:24:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "493470c763cfb6ccab53870b786f89e8f8ce8174",
          "body": null,
          "is_bot": false,
          "headline": "4.39.1",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-19T11:01:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90e071b43112cc38e1986b6fceb0c8f8b01e13ea",
          "body": null,
          "is_bot": false,
          "headline": "Release 4.39.1",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-19T11:01:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11b9dfbbeee80ae5225b6fcc2adb9210605947ad",
          "body": "When the IPTC block declares no encoding and the bytes are not valid\nUTF-8, remap them through Windows-1252 (CP1252) instead of leaving\n0x80-0x9F as C1 control characters. Captions written by Photoshop or\nexiftool containing en/em dashes, ellipsis, or smart quotes now\nrender correctly. Fixes #635.",
          "is_bot": false,
          "headline": "Fall back to Windows-1252 for IPTC text without a Coded Character Set",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-19T10:58:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fe98fa6f59a4ef2cb789ab63296d4e048385cd9",
          "body": null,
          "is_bot": false,
          "headline": "Update forgotten fixtures for integration tests",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-19T10:58:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "194557e85c171544edfb5a179a154b1d1949353d",
          "body": null,
          "is_bot": false,
          "headline": "Update CHANGELOG with security fix mentions",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-18T13:29:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0db0346bec8cb68fad4533930afb60835aa41b8",
          "body": null,
          "is_bot": false,
          "headline": "Add security policy and reporting instructions",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-15T20:53:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa7815bc95a67771244fa00a068718a52c02ca2e",
          "body": null,
          "is_bot": false,
          "headline": "4.39.0",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-15T17:39:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8fc1c540d5a3f614c9741b742181f63c08b5f614",
          "body": null,
          "is_bot": false,
          "headline": "Release 4.39.0",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-15T17:39:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f116128adc19f674902f8bf582bfe7dd0a36375",
          "body": null,
          "is_bot": false,
          "headline": "Add maxDecompressedSize option to cap decompressed metadata blocks",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-15T17:30:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9d88b67e127b2dcc7b46e328df468257fb2dc30",
          "body": null,
          "is_bot": false,
          "headline": "Add bounds checks to ICC mluc tag parsing",
          "author_name": "Mattias Wallander",
          "author_login": "mattiasw",
          "committed_at": "2026-05-15T17:30:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b72a7c87e36a6c20ae30290de0cab23a3277f48",
          "body": "Bumps the all-dependencies group with 2 updates: [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) and [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).\n\n\nUpdates `@babel/preset-env` from 7.29.3 to 7.29.5\n- [Release notes](h\n[…]\nependency-version: 25.6.2\n  dependency-type: direct:development\n  update-type: version-update:semver-patch\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump the all-dependencies group with 2 updates",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-15T11:37:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "92ced70298622fbc6a9088e69056a4f1202b26ea",
          "body": "Bumps [systeminformation](https://github.com/sebhildebrandt/systeminformation) from 5.31.1 to 5.31.6.\n- [Release notes](https://github.com/sebhildebrandt/systeminformation/releases)\n- [Changelog](https://github.com/sebhildebrandt/systeminformation/blob/master/CHANGELOG.md)\n- [Commits](https://github\n[…]\nare/v5.31.1...v5.31.6)\n\n---\nupdated-dependencies:\n- dependency-name: systeminformation\n  dependency-version: 5.31.6\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump systeminformation from 5.31.1 to 5.31.6",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-14T05:02:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 194,
      "latest_release_at": "2026-07-18T14:48:16Z",
      "latest_release_tag": "v4.41.3",
      "releases_from_tags": false,
      "days_since_last_push": 1,
      "active_weeks_last_year": 49,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 5.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 100,
      "has_issue_template": true,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "exifreader",
          "exists": true,
          "license": "MPL-2.0",
          "keywords": [],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/exifreader",
          "is_deprecated": false,
          "latest_version": "4.41.3",
          "repository_url": "https://github.com/mattiasw/ExifReader",
          "versions_count": 130,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 854905,
          "first_published_at": "2016-12-28T13:09:14.749000Z",
          "latest_published_at": "2026-07-18T14:47:26.471000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 106,
      "stars": 992,
      "watchers": 13,
      "fork_history": {
        "days": [
          {
            "date": "2013-04-22",
            "count": 1
          },
          {
            "date": "2013-07-04",
            "count": 1
          },
          {
            "date": "2013-10-02",
            "count": 1
          },
          {
            "date": "2013-11-12",
            "count": 1
          },
          {
            "date": "2013-11-20",
            "count": 1
          },
          {
            "date": "2014-02-04",
            "count": 1
          },
          {
            "date": "2014-06-30",
            "count": 1
          },
          {
            "date": "2014-11-16",
            "count": 1
          },
          {
            "date": "2015-02-17",
            "count": 1
          },
          {
            "date": "2015-04-23",
            "count": 1
          },
          {
            "date": "2015-05-18",
            "count": 1
          },
          {
            "date": "2015-06-29",
            "count": 1
          },
          {
            "date": "2016-02-03",
            "count": 1
          },
          {
            "date": "2016-02-09",
            "count": 1
          },
          {
            "date": "2016-03-31",
            "count": 1
          },
          {
            "date": "2016-04-28",
            "count": 1
          },
          {
            "date": "2016-08-26",
            "count": 1
          },
          {
            "date": "2016-09-22",
            "count": 1
          },
          {
            "date": "2016-09-23",
            "count": 1
          },
          {
            "date": "2017-05-03",
            "count": 1
          },
          {
            "date": "2017-07-26",
            "count": 1
          },
          {
            "date": "2017-08-31",
            "count": 1
          },
          {
            "date": "2017-09-20",
            "count": 1
          },
          {
            "date": "2017-11-11",
            "count": 1
          },
          {
            "date": "2018-01-26",
            "count": 1
          },
          {
            "date": "2018-02-05",
            "count": 1
          },
          {
            "date": "2018-05-02",
            "count": 1
          },
          {
            "date": "2018-05-03",
            "count": 1
          },
          {
            "date": "2018-06-12",
            "count": 1
          },
          {
            "date": "2018-12-21",
            "count": 1
          },
          {
            "date": "2019-03-19",
            "count": 1
          },
          {
            "date": "2019-03-20",
            "count": 1
          },
          {
            "date": "2019-06-04",
            "count": 1
          },
          {
            "date": "2019-10-04",
            "count": 1
          },
          {
            "date": "2019-10-25",
            "count": 1
          },
          {
            "date": "2019-10-29",
            "count": 2
          },
          {
            "date": "2019-11-16",
            "count": 1
          },
          {
            "date": "2019-12-16",
            "count": 1
          },
          {
            "date": "2020-02-10",
            "count": 1
          },
          {
            "date": "2020-02-13",
            "count": 1
          },
          {
            "date": "2020-05-09",
            "count": 1
          },
          {
            "date": "2020-05-13",
            "count": 1
          },
          {
            "date": "2020-06-01",
            "count": 1
          },
          {
            "date": "2020-06-11",
            "count": 1
          },
          {
            "date": "2020-08-08",
            "count": 1
          },
          {
            "date": "2020-12-20",
            "count": 1
          },
          {
            "date": "2020-12-21",
            "count": 1
          },
          {
            "date": "2021-01-06",
            "count": 1
          },
          {
            "date": "2021-01-31",
            "count": 1
          },
          {
            "date": "2021-02-08",
            "count": 1
          },
          {
            "date": "2021-03-13",
            "count": 1
          },
          {
            "date": "2021-07-13",
            "count": 1
          },
          {
            "date": "2021-09-02",
            "count": 1
          },
          {
            "date": "2021-10-15",
            "count": 1
          },
          {
            "date": "2021-12-28",
            "count": 1
          },
          {
            "date": "2022-02-04",
            "count": 1
          },
          {
            "date": "2022-04-11",
            "count": 1
          },
          {
            "date": "2022-04-25",
            "count": 1
          },
          {
            "date": "2022-06-02",
            "count": 1
          },
          {
            "date": "2022-07-04",
            "count": 1
          },
          {
            "date": "2022-07-05",
            "count": 1
          },
          {
            "date": "2022-07-11",
            "count": 1
          },
          {
            "date": "2022-09-07",
            "count": 1
          },
          {
            "date": "2022-09-22",
            "count": 1
          },
          {
            "date": "2022-09-28",
            "count": 1
          },
          {
            "date": "2022-10-19",
            "count": 1
          },
          {
            "date": "2022-10-25",
            "count": 1
          },
          {
            "date": "2022-12-12",
            "count": 1
          },
          {
            "date": "2022-12-23",
            "count": 1
          },
          {
            "date": "2023-03-21",
            "count": 1
          },
          {
            "date": "2023-06-06",
            "count": 1
          },
          {
            "date": "2023-07-06",
            "count": 1
          },
          {
            "date": "2023-07-24",
            "count": 1
          },
          {
            "date": "2023-08-20",
            "count": 1
          },
          {
            "date": "2023-11-10",
            "count": 1
          },
          {
            "date": "2023-12-02",
            "count": 1
          },
          {
            "date": "2024-04-24",
            "count": 1
          },
          {
            "date": "2024-05-02",
            "count": 1
          },
          {
            "date": "2024-05-11",
            "count": 1
          },
          {
            "date": "2024-05-13",
            "count": 1
          },
          {
            "date": "2024-07-31",
            "count": 1
          },
          {
            "date": "2024-08-30",
            "count": 1
          },
          {
            "date": "2024-09-29",
            "count": 1
          },
          {
            "date": "2025-01-22",
            "count": 1
          },
          {
            "date": "2025-02-04",
            "count": 1
          },
          {
            "date": "2025-04-08",
            "count": 1
          },
          {
            "date": "2025-05-18",
            "count": 1
          },
          {
            "date": "2025-06-02",
            "count": 1
          },
          {
            "date": "2025-06-09",
            "count": 1
          },
          {
            "date": "2025-07-15",
            "count": 1
          },
          {
            "date": "2025-09-13",
            "count": 1
          },
          {
            "date": "2025-09-18",
            "count": 1
          },
          {
            "date": "2025-11-12",
            "count": 1
          },
          {
            "date": "2025-12-03",
            "count": 1
          },
          {
            "date": "2026-01-20",
            "count": 1
          },
          {
            "date": "2026-02-11",
            "count": 1
          },
          {
            "date": "2026-02-14",
            "count": 1
          },
          {
            "date": "2026-02-19",
            "count": 1
          },
          {
            "date": "2026-04-09",
            "count": 1
          },
          {
            "date": "2026-04-20",
            "count": 1
          },
          {
            "date": "2026-06-02",
            "count": 1
          },
          {
            "date": "2026-06-04",
            "count": 1
          },
          {
            "date": "2026-07-17",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 104,
        "total_forks": 106
      },
      "star_history": null,
      "open_issues_and_prs": 4
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "test/types/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 84419,
      "source_files_sampled": 149,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 7089
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "src/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 1,
        "malicious_count": 0,
        "assessed_package": "npm:exifreader@4.41.3",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "@aashutoshrathi/word-wrap",
            "direct": false,
            "version": "1.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/code-frame",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/compat-data",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/core",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/generator",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-annotate-as-pure",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-compilation-targets",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-create-class-features-plugin",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-create-regexp-features-plugin",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-define-polyfill-provider",
            "direct": false,
            "version": "0.6.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-globals",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-member-expression-to-functions",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-module-imports",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-module-transforms",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-optimise-call-expression",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-plugin-utils",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-remap-async-to-generator",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-replace-supers",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-skip-transparent-expression-wrappers",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-string-parser",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-option",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-wrap-function",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helpers",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-firefox-class-in-computed-class-key",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-safari-class-field-initializer-scope",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-proposal-private-property-in-object",
            "direct": false,
            "version": "7.21.0-placeholder-for-preset-env.2",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-import-assertions",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-import-attributes",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-syntax-unicode-sets-regex",
            "direct": false,
            "version": "7.18.6",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-arrow-functions",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-async-generator-functions",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-async-to-generator",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-block-scoped-functions",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-block-scoping",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-class-properties",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-class-static-block",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-classes",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-computed-properties",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-destructuring",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-dotall-regex",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-duplicate-keys",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-duplicate-named-capturing-groups-regex",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-dynamic-import",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-explicit-resource-management",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-exponentiation-operator",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-export-namespace-from",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-for-of",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-function-name",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-json-strings",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-literals",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-logical-assignment-operators",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-member-expression-literals",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-modules-amd",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-modules-commonjs",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-modules-systemjs",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-modules-umd",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-named-capturing-groups-regex",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-new-target",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-nullish-coalescing-operator",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-numeric-separator",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-object-rest-spread",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-object-super",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-optional-catch-binding",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-optional-chaining",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-parameters",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-private-methods",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-private-property-in-object",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-property-literals",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-regenerator",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-regexp-modifiers",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-reserved-words",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-shorthand-properties",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-spread",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-sticky-regex",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-template-literals",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-typeof-symbol",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-unicode-escapes",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-unicode-property-regex",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-unicode-regex",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/plugin-transform-unicode-sets-regex",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/preset-env",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/preset-modules",
            "direct": false,
            "version": "0.1.6-no-external-plugins",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/template",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/traverse",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/types",
            "direct": false,
            "version": "7.29.7",
            "ecosystem": "npm"
          },
          {
            "name": "@bcoe/v8-coverage",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@cypress/request",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@cypress/xvfb",
            "direct": false,
            "version": "1.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@discoveryjs/json-ext",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@epic-web/invariant",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/eslint-utils",
            "direct": false,
            "version": "4.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint-community/regexpp",
            "direct": false,
            "version": "4.12.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-array",
            "direct": false,
            "version": "0.21.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/config-helpers",
            "direct": false,
            "version": "0.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/core",
            "direct": false,
            "version": "0.17.0",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/eslintrc",
            "direct": false,
            "version": "3.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/js",
            "direct": false,
            "version": "9.39.4",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/js",
            "direct": false,
            "version": "9.39.5",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/object-schema",
            "direct": false,
            "version": "2.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "@eslint/plugin-kit",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/core",
            "direct": false,
            "version": "0.19.2",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/node",
            "direct": false,
            "version": "0.16.8",
            "ecosystem": "npm"
          },
          {
            "name": "@humanfs/types",
            "direct": false,
            "version": "0.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/module-importer",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "@humanwhocodes/retry",
            "direct": false,
            "version": "0.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "@isaacs/cliui",
            "direct": false,
            "version": "8.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@istanbuljs/schema",
            "direct": false,
            "version": "0.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/gen-mapping",
            "direct": false,
            "version": "0.3.12",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/remapping",
            "direct": false,
            "version": "2.3.5",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/resolve-uri",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/source-map",
            "direct": false,
            "version": "0.3.6",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/trace-mapping",
            "direct": false,
            "version": "0.3.29",
            "ecosystem": "npm"
          },
          {
            "name": "@jsonjoy.com/base64",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@jsonjoy.com/json-pack",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jsonjoy.com/util",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@leichtgewicht/ip-codec",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "@noble/hashes",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/asn1-cms",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/asn1-csr",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/asn1-ecc",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/asn1-pfx",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/asn1-pkcs8",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/asn1-pkcs9",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/asn1-rsa",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/asn1-schema",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/asn1-x509",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/asn1-x509-attr",
            "direct": false,
            "version": "2.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "@peculiar/x509",
            "direct": false,
            "version": "1.14.3",
            "ecosystem": "npm"
          },
          {
            "name": "@pkgjs/parseargs",
            "direct": false,
            "version": "0.11.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/body-parser",
            "direct": false,
            "version": "1.19.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/bonjour",
            "direct": false,
            "version": "3.5.13",
            "ecosystem": "npm"
          },
          {
            "name": "@types/connect",
            "direct": false,
            "version": "3.4.37",
            "ecosystem": "npm"
          },
          {
            "name": "@types/connect-history-api-fallback",
            "direct": false,
            "version": "1.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/express",
            "direct": false,
            "version": "4.17.25",
            "ecosystem": "npm"
          },
          {
            "name": "@types/express-serve-static-core",
            "direct": false,
            "version": "4.17.39",
            "ecosystem": "npm"
          },
          {
            "name": "@types/http-errors",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/http-proxy",
            "direct": false,
            "version": "1.17.15",
            "ecosystem": "npm"
          },
          {
            "name": "@types/istanbul-lib-coverage",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/json-schema",
            "direct": false,
            "version": "7.0.15",
            "ecosystem": "npm"
          },
          {
            "name": "@types/mime",
            "direct": false,
            "version": "1.3.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/node",
            "direct": false,
            "version": "26.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/qs",
            "direct": false,
            "version": "6.9.9",
            "ecosystem": "npm"
          },
          {
            "name": "@types/range-parser",
            "direct": false,
            "version": "1.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/retry",
            "direct": false,
            "version": "0.12.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/send",
            "direct": false,
            "version": "0.17.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/serve-index",
            "direct": false,
            "version": "1.9.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/serve-static",
            "direct": false,
            "version": "1.15.7",
            "ecosystem": "npm"
          },
          {
            "name": "@types/sinonjs__fake-timers",
            "direct": false,
            "version": "8.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "@types/sizzle",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/sockjs",
            "direct": false,
            "version": "0.3.36",
            "ecosystem": "npm"
          },
          {
            "name": "@types/tmp",
            "direct": false,
            "version": "0.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "@types/ws",
            "direct": false,
            "version": "8.5.10",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-aix-ppc64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-darwin-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-darwin-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-freebsd-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-freebsd-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-arm",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-loong64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-mips64el",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-ppc64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-riscv64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-s390x",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-linux-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-netbsd-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-netbsd-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-openbsd-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-openbsd-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-sunos-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-win32-arm64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@typescript/typescript-win32-x64",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/ast",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/floating-point-hex-parser",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/helper-api-error",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/helper-buffer",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/helper-numbers",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/helper-wasm-bytecode",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/helper-wasm-section",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/ieee754",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/leb128",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/utf8",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/wasm-edit",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/wasm-gen",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/wasm-opt",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/wasm-parser",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@webassemblyjs/wast-printer",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "@xmldom/xmldom",
            "direct": false,
            "version": "0.9.10",
            "ecosystem": "npm"
          },
          {
            "name": "@xtuc/ieee754",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "@xtuc/long",
            "direct": false,
            "version": "4.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "accepts",
            "direct": false,
            "version": "1.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "acorn",
            "direct": false,
            "version": "8.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-import-phases",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "acorn-jsx",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "6.15.0",
            "ecosystem": "npm"
          },
          {
            "name": "ajv",
            "direct": false,
            "version": "8.18.0",
            "ecosystem": "npm"
          },
          {
            "name": "ajv-formats",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ajv-keywords",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-escapes",
            "direct": false,
            "version": "7.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-html-community",
            "direct": false,
            "version": "0.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-regex",
            "direct": false,
            "version": "6.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "ansi-styles",
            "direct": false,
            "version": "6.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "anymatch",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "arch",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "argparse",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "array-flatten",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "asn1",
            "direct": false,
            "version": "0.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "asn1js",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "assert-plus",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "asynckit",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "at-least-node",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "aws-sign2",
            "direct": false,
            "version": "0.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "aws4",
            "direct": false,
            "version": "1.13.2",
            "ecosystem": "npm"
          },
          {
            "name": "babel-loader",
            "direct": false,
            "version": "10.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-polyfill-corejs2",
            "direct": false,
            "version": "0.4.15",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-polyfill-corejs3",
            "direct": false,
            "version": "0.14.0",
            "ecosystem": "npm"
          },
          {
            "name": "babel-plugin-polyfill-regenerator",
            "direct": false,
            "version": "0.6.6",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "balanced-match",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "base64-js",
            "direct": false,
            "version": "1.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "baseline-browser-mapping",
            "direct": false,
            "version": "2.9.11",
            "ecosystem": "npm"
          },
          {
            "name": "batch",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "bcrypt-pbkdf",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "binary-extensions",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "blob-util",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "bluebird",
            "direct": false,
            "version": "3.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "body-parser",
            "direct": false,
            "version": "1.20.4",
            "ecosystem": "npm"
          },
          {
            "name": "bonjour-service",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "boolbase",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "1.1.15",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "brace-expansion",
            "direct": false,
            "version": "5.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "braces",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "browser-stdout",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "browserslist",
            "direct": false,
            "version": "4.28.1",
            "ecosystem": "npm"
          },
          {
            "name": "buffer",
            "direct": false,
            "version": "5.7.1",
            "ecosystem": "npm"
          },
          {
            "name": "buffer-from",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "bundle-name",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "bytes",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "bytestreamjs",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "c8",
            "direct": false,
            "version": "11.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cachedir",
            "direct": false,
            "version": "2.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "call-bind-apply-helpers",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "call-bound",
            "direct": false,
            "version": "1.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "callsites",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "camelcase",
            "direct": false,
            "version": "6.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "caniuse-lite",
            "direct": false,
            "version": "1.0.30001761",
            "ecosystem": "npm"
          },
          {
            "name": "caseless",
            "direct": false,
            "version": "0.12.0",
            "ecosystem": "npm"
          },
          {
            "name": "chai",
            "direct": false,
            "version": "6.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "chalk",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "chokidar",
            "direct": false,
            "version": "3.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "chokidar",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "chrome-trace-event",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "ci-info",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "cli-cursor",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cli-table3",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "cli-truncate",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "cliui",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "clone-deep",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "color-convert",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "color-name",
            "direct": false,
            "version": "1.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "colorette",
            "direct": false,
            "version": "2.0.20",
            "ecosystem": "npm"
          },
          {
            "name": "colors",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "combined-stream",
            "direct": false,
            "version": "1.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "14.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "2.20.3",
            "ecosystem": "npm"
          },
          {
            "name": "commander",
            "direct": false,
            "version": "6.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "common-tags",
            "direct": false,
            "version": "1.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "compressible",
            "direct": false,
            "version": "2.0.18",
            "ecosystem": "npm"
          },
          {
            "name": "compression",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "concat-map",
            "direct": false,
            "version": "0.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "connect-history-api-fallback",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "content-disposition",
            "direct": false,
            "version": "0.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "content-type",
            "direct": false,
            "version": "1.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "convert-source-map",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cookie",
            "direct": false,
            "version": "0.7.1",
            "ecosystem": "npm"
          },
          {
            "name": "cookie-signature",
            "direct": false,
            "version": "1.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "core-js-compat",
            "direct": false,
            "version": "3.48.0",
            "ecosystem": "npm"
          },
          {
            "name": "core-util-is",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "cross-env",
            "direct": false,
            "version": "10.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "cross-spawn",
            "direct": false,
            "version": "7.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "css-select",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "css-what",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "cssom",
            "direct": false,
            "version": "0.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "cypress",
            "direct": false,
            "version": "15.18.1",
            "ecosystem": "npm"
          },
          {
            "name": "dashdash",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "dayjs",
            "direct": false,
            "version": "1.10.7",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "2.6.9",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "3.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "debug",
            "direct": false,
            "version": "4.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "decamelize",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "deep-is",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "default-browser",
            "direct": false,
            "version": "5.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "default-browser-id",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "define-lazy-prop",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "delayed-stream",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "depd",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "depd",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "destroy",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "detect-node",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "diff",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "dns-packet",
            "direct": false,
            "version": "5.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "dom-serializer",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "dom-serializer",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "domelementtype",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "domelementtype",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "domhandler",
            "direct": false,
            "version": "5.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "domhandler",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "domutils",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "domutils",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "dunder-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "eastasianwidth",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "ecc-jsbn",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "ee-first",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "electron-to-chromium",
            "direct": false,
            "version": "1.5.267",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "10.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex",
            "direct": false,
            "version": "9.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "encodeurl",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "encodeurl",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "end-of-stream",
            "direct": false,
            "version": "1.4.4",
            "ecosystem": "npm"
          },
          {
            "name": "enhanced-resolve",
            "direct": false,
            "version": "5.24.1",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "4.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "7.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "envinfo",
            "direct": false,
            "version": "7.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "environment",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-define-property",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "es-errors",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-module-lexer",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "es-object-atoms",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "es-set-tostringtag",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "escalade",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "escape-html",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "escape-string-regexp",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint",
            "direct": false,
            "version": "9.39.4",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-plugin-cypress",
            "direct": false,
            "version": "6.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-scope",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-scope",
            "direct": false,
            "version": "8.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "3.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "eslint-visitor-keys",
            "direct": false,
            "version": "4.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "espree",
            "direct": false,
            "version": "10.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "esquery",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "esrecurse",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estraverse",
            "direct": false,
            "version": "4.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "estraverse",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "estraverse",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "esutils",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "etag",
            "direct": false,
            "version": "1.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "eventemitter2",
            "direct": false,
            "version": "6.4.7",
            "ecosystem": "npm"
          },
          {
            "name": "eventemitter3",
            "direct": false,
            "version": "4.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "eventemitter3",
            "direct": false,
            "version": "5.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "events",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "execa",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "executable",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "express",
            "direct": false,
            "version": "4.22.1",
            "ecosystem": "npm"
          },
          {
            "name": "extend",
            "direct": false,
            "version": "3.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "extsprintf",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-deep-equal",
            "direct": false,
            "version": "3.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "fast-json-stable-stringify",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "fast-levenshtein",
            "direct": false,
            "version": "2.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "fast-uri",
            "direct": false,
            "version": "3.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "faye-websocket",
            "direct": false,
            "version": "0.11.4",
            "ecosystem": "npm"
          },
          {
            "name": "file-entry-cache",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "fill-range",
            "direct": false,
            "version": "7.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "finalhandler",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "find-up",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "flat",
            "direct": false,
            "version": "5.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "flat-cache",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "flatted",
            "direct": false,
            "version": "3.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "follow-redirects",
            "direct": false,
            "version": "1.16.0",
            "ecosystem": "npm"
          },
          {
            "name": "foreground-child",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "forever-agent",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "form-data",
            "direct": false,
            "version": "4.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "forwarded",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "fresh",
            "direct": false,
            "version": "0.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "fs-extra",
            "direct": false,
            "version": "9.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "function-bind",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "gensync",
            "direct": false,
            "version": "1.0.0-beta.2",
            "ecosystem": "npm"
          },
          {
            "name": "get-caller-file",
            "direct": false,
            "version": "2.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "get-east-asian-width",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-intrinsic",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "get-proto",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "get-stream",
            "direct": false,
            "version": "5.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "getpass",
            "direct": false,
            "version": "0.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "glob",
            "direct": false,
            "version": "10.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "glob",
            "direct": false,
            "version": "13.0.6",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "glob-parent",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "global-dirs",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "globals",
            "direct": false,
            "version": "14.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "globals",
            "direct": false,
            "version": "17.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "gopd",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "graceful-fs",
            "direct": false,
            "version": "4.2.11",
            "ecosystem": "npm"
          },
          {
            "name": "handle-thing",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "has-flag",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-symbols",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "has-tostringtag",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "hasha",
            "direct": false,
            "version": "5.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "hasown",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "he",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "hpack.js",
            "direct": false,
            "version": "2.1.6",
            "ecosystem": "npm"
          },
          {
            "name": "html-escaper",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "html-escaper",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "htmlparser2",
            "direct": false,
            "version": "10.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "http-deceiver",
            "direct": false,
            "version": "1.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "http-errors",
            "direct": false,
            "version": "1.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "http-errors",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "http-errors",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "http-parser-js",
            "direct": false,
            "version": "0.5.8",
            "ecosystem": "npm"
          },
          {
            "name": "http-proxy",
            "direct": false,
            "version": "1.18.1",
            "ecosystem": "npm"
          },
          {
            "name": "http-proxy-middleware",
            "direct": false,
            "version": "2.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "http-signature",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "human-signals",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "husky",
            "direct": false,
            "version": "9.1.7",
            "ecosystem": "npm"
          },
          {
            "name": "hyperdyperid",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "iconv-lite",
            "direct": false,
            "version": "0.4.24",
            "ecosystem": "npm"
          },
          {
            "name": "ieee754",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "ignore",
            "direct": false,
            "version": "5.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "import-fresh",
            "direct": false,
            "version": "3.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "import-local",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "imurmurhash",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "inherits",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "inherits",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "ini",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "interpret",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "ipaddr.js",
            "direct": false,
            "version": "1.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "ipaddr.js",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-binary-path",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-core-module",
            "direct": false,
            "version": "2.16.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-docker",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-extglob",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-fullwidth-code-point",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-glob",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-inside-container",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-installed-globally",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-network-error",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-number",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-path-inside",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-obj",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-obj",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-plain-object",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "is-stream",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "is-typedarray",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-unicode-supported",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-wsl",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "isarray",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "isexe",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "isobject",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "isstream",
            "direct": false,
            "version": "0.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-coverage",
            "direct": false,
            "version": "3.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-lib-report",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "istanbul-reports",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "jackspeak",
            "direct": false,
            "version": "3.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "jest-worker",
            "direct": false,
            "version": "27.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "js-tokens",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "js-yaml",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "jsbn",
            "direct": false,
            "version": "0.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "jsesc",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-buffer",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-parse-even-better-errors",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-schema-traverse",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "json-stable-stringify-without-jsonify",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "json-stringify-safe",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "json5",
            "direct": false,
            "version": "2.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "jsonfile",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "jsprim",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "keyv",
            "direct": false,
            "version": "4.5.4",
            "ecosystem": "npm"
          },
          {
            "name": "kind-of",
            "direct": false,
            "version": "6.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "launch-editor",
            "direct": false,
            "version": "2.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "levn",
            "direct": false,
            "version": "0.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "linkedom",
            "direct": false,
            "version": "0.18.13",
            "ecosystem": "npm"
          },
          {
            "name": "listr2",
            "direct": false,
            "version": "9.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "loader-runner",
            "direct": false,
            "version": "4.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "locate-path",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "lodash",
            "direct": false,
            "version": "4.18.1",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.debounce",
            "direct": false,
            "version": "4.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.merge",
            "direct": false,
            "version": "4.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "lodash.once",
            "direct": false,
            "version": "4.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "log-symbols",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "log-update",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "10.4.3",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "11.5.1",
            "ecosystem": "npm"
          },
          {
            "name": "lru-cache",
            "direct": false,
            "version": "5.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "make-dir",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "math-intrinsics",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "media-typer",
            "direct": false,
            "version": "0.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "memfs",
            "direct": false,
            "version": "4.11.1",
            "ecosystem": "npm"
          },
          {
            "name": "memorystream",
            "direct": false,
            "version": "0.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "merge-descriptors",
            "direct": false,
            "version": "1.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "merge-stream",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "methods",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "micromatch",
            "direct": false,
            "version": "4.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "mime",
            "direct": false,
            "version": "1.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-db",
            "direct": false,
            "version": "1.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-db",
            "direct": false,
            "version": "1.54.0",
            "ecosystem": "npm"
          },
          {
            "name": "mime-types",
            "direct": false,
            "version": "2.1.35",
            "ecosystem": "npm"
          },
          {
            "name": "mimic-fn",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "mimic-function",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "minimalistic-assert",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "10.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "3.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "minimatch",
            "direct": false,
            "version": "9.0.9",
            "ecosystem": "npm"
          },
          {
            "name": "minimist",
            "direct": false,
            "version": "1.2.8",
            "ecosystem": "npm"
          },
          {
            "name": "minimizer-webpack-plugin",
            "direct": false,
            "version": "5.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "minipass",
            "direct": false,
            "version": "7.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "mocha",
            "direct": false,
            "version": "11.7.6",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "ms",
            "direct": false,
            "version": "2.1.3",
            "ecosystem": "npm"
          },
          {
            "name": "multicast-dns",
            "direct": false,
            "version": "7.2.5",
            "ecosystem": "npm"
          },
          {
            "name": "natural-compare",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "negotiator",
            "direct": false,
            "version": "0.6.3",
            "ecosystem": "npm"
          },
          {
            "name": "negotiator",
            "direct": false,
            "version": "0.6.4",
            "ecosystem": "npm"
          },
          {
            "name": "neo-async",
            "direct": false,
            "version": "2.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "node-releases",
            "direct": false,
            "version": "2.0.27",
            "ecosystem": "npm"
          },
          {
            "name": "normalize-path",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "npm-normalize-package-bin",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "npm-run-all2",
            "direct": false,
            "version": "9.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "npm-run-path",
            "direct": false,
            "version": "4.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "nth-check",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "object-inspect",
            "direct": false,
            "version": "1.13.4",
            "ecosystem": "npm"
          },
          {
            "name": "obuf",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "on-finished",
            "direct": false,
            "version": "2.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "on-headers",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "once",
            "direct": false,
            "version": "1.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "onetime",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "onetime",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "open",
            "direct": false,
            "version": "10.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "optionator",
            "direct": false,
            "version": "0.9.3",
            "ecosystem": "npm"
          },
          {
            "name": "ospath",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-limit",
            "direct": false,
            "version": "3.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-locate",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-retry",
            "direct": false,
            "version": "6.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "p-try",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "package-json-from-dist",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "parent-module",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "parseurl",
            "direct": false,
            "version": "1.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "path-exists",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "path-key",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-parse",
            "direct": false,
            "version": "1.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "path-scurry",
            "direct": false,
            "version": "1.11.1",
            "ecosystem": "npm"
          },
          {
            "name": "path-scurry",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "path-to-regexp",
            "direct": false,
            "version": "0.1.13",
            "ecosystem": "npm"
          },
          {
            "name": "pend",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "performance-now",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "2.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "picomatch",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "pidtree",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pify",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "pkg-dir",
            "direct": false,
            "version": "4.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "pkijs",
            "direct": false,
            "version": "3.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "prelude-ls",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "pretty-bytes",
            "direct": false,
            "version": "5.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "process",
            "direct": false,
            "version": "0.11.10",
            "ecosystem": "npm"
          },
          {
            "name": "process-nextick-args",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "proxy-addr",
            "direct": false,
            "version": "2.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "proxy-from-env",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "pump",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "punycode",
            "direct": false,
            "version": "2.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "pvtsutils",
            "direct": false,
            "version": "1.3.6",
            "ecosystem": "npm"
          },
          {
            "name": "pvutils",
            "direct": false,
            "version": "1.1.5",
            "ecosystem": "npm"
          },
          {
            "name": "qs",
            "direct": false,
            "version": "6.14.2",
            "ecosystem": "npm"
          },
          {
            "name": "randombytes",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "range-parser",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "raw-body",
            "direct": false,
            "version": "2.5.3",
            "ecosystem": "npm"
          },
          {
            "name": "read-package-json-fast",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "readable-stream",
            "direct": false,
            "version": "2.3.8",
            "ecosystem": "npm"
          },
          {
            "name": "readable-stream",
            "direct": false,
            "version": "3.6.2",
            "ecosystem": "npm"
          },
          {
            "name": "readdirp",
            "direct": false,
            "version": "3.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "readdirp",
            "direct": false,
            "version": "4.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "rechoir",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "reflect-metadata",
            "direct": false,
            "version": "0.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "regenerate",
            "direct": false,
            "version": "1.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "regenerate-unicode-properties",
            "direct": false,
            "version": "10.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "regexpu-core",
            "direct": false,
            "version": "6.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "regjsgen",
            "direct": false,
            "version": "0.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "regjsparser",
            "direct": false,
            "version": "0.13.0",
            "ecosystem": "npm"
          },
          {
            "name": "request-progress",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "require-directory",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "require-from-string",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "requires-port",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve",
            "direct": false,
            "version": "1.22.11",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-cwd",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "resolve-from",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "restore-cursor",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "retry",
            "direct": false,
            "version": "0.13.1",
            "ecosystem": "npm"
          },
          {
            "name": "rfdc",
            "direct": false,
            "version": "1.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "rimraf",
            "direct": false,
            "version": "5.0.10",
            "ecosystem": "npm"
          },
          {
            "name": "run-applescript",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "safe-buffer",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "safe-buffer",
            "direct": false,
            "version": "5.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "safer-buffer",
            "direct": false,
            "version": "2.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "schema-utils",
            "direct": false,
            "version": "4.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "select-hose",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "selfsigned",
            "direct": false,
            "version": "5.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "6.3.1",
            "ecosystem": "npm"
          },
          {
            "name": "semver",
            "direct": false,
            "version": "7.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "send",
            "direct": false,
            "version": "0.19.0",
            "ecosystem": "npm"
          },
          {
            "name": "serialize-javascript",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "serve-index",
            "direct": false,
            "version": "1.9.1",
            "ecosystem": "npm"
          },
          {
            "name": "serve-static",
            "direct": false,
            "version": "1.16.2",
            "ecosystem": "npm"
          },
          {
            "name": "setprototypeof",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "setprototypeof",
            "direct": false,
            "version": "1.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "shallow-clone",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-command",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "shebang-regex",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "shell-quote",
            "direct": false,
            "version": "1.8.4",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-list",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-map",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "side-channel-weakmap",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "signal-exit",
            "direct": false,
            "version": "3.0.7",
            "ecosystem": "npm"
          },
          {
            "name": "signal-exit",
            "direct": false,
            "version": "4.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "slice-ansi",
            "direct": false,
            "version": "7.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "slice-ansi",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "sockjs",
            "direct": false,
            "version": "0.3.24",
            "ecosystem": "npm"
          },
          {
            "name": "source-map",
            "direct": false,
            "version": "0.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-support",
            "direct": false,
            "version": "0.5.20",
            "ecosystem": "npm"
          },
          {
            "name": "spdy",
            "direct": false,
            "version": "4.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "spdy-transport",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "sshpk",
            "direct": false,
            "version": "1.18.0",
            "ecosystem": "npm"
          },
          {
            "name": "statuses",
            "direct": false,
            "version": "1.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "statuses",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "statuses",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "string-replace-loader",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "4.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "string-width",
            "direct": false,
            "version": "8.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "string_decoder",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "7.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-ansi",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-final-newline",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "strip-json-comments",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "supports-color",
            "direct": false,
            "version": "8.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "supports-preserve-symlinks-flag",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "systeminformation",
            "direct": false,
            "version": "5.31.17",
            "ecosystem": "npm"
          },
          {
            "name": "tapable",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "terser",
            "direct": false,
            "version": "5.37.0",
            "ecosystem": "npm"
          },
          {
            "name": "terser-webpack-plugin",
            "direct": false,
            "version": "5.6.1",
            "ecosystem": "npm"
          },
          {
            "name": "test-exclude",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "thingies",
            "direct": false,
            "version": "1.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "throttleit",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "thunky",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "tldts",
            "direct": false,
            "version": "6.1.86",
            "ecosystem": "npm"
          },
          {
            "name": "tldts-core",
            "direct": false,
            "version": "6.1.86",
            "ecosystem": "npm"
          },
          {
            "name": "tmp",
            "direct": false,
            "version": "0.2.7",
            "ecosystem": "npm"
          },
          {
            "name": "to-regex-range",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "toidentifier",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "tough-cookie",
            "direct": false,
            "version": "5.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "tree-dump",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "tree-kill",
            "direct": false,
            "version": "1.2.2",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "1.14.1",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.7.0",
            "ecosystem": "npm"
          },
          {
            "name": "tslib",
            "direct": false,
            "version": "2.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "tsyringe",
            "direct": false,
            "version": "4.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "tunnel-agent",
            "direct": false,
            "version": "0.6.0",
            "ecosystem": "npm"
          },
          {
            "name": "tweetnacl",
            "direct": false,
            "version": "0.14.5",
            "ecosystem": "npm"
          },
          {
            "name": "type-check",
            "direct": false,
            "version": "0.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "type-fest",
            "direct": false,
            "version": "0.8.1",
            "ecosystem": "npm"
          },
          {
            "name": "type-is",
            "direct": false,
            "version": "1.6.18",
            "ecosystem": "npm"
          },
          {
            "name": "typescript",
            "direct": false,
            "version": "7.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "uhyphen",
            "direct": false,
            "version": "0.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "undici-types",
            "direct": false,
            "version": "8.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "unicode-canonical-property-names-ecmascript",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "unicode-match-property-ecmascript",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "unicode-match-property-value-ecmascript",
            "direct": false,
            "version": "2.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "unicode-property-aliases-ecmascript",
            "direct": false,
            "version": "2.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "universalify",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "unpipe",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "untildify",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "update-browserslist-db",
            "direct": false,
            "version": "1.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "uri-js",
            "direct": false,
            "version": "4.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "util-deprecate",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "utils-merge",
            "direct": false,
            "version": "1.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "uuid",
            "direct": false,
            "version": "8.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "v8-to-istanbul",
            "direct": false,
            "version": "9.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "vary",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "verror",
            "direct": false,
            "version": "1.10.0",
            "ecosystem": "npm"
          },
          {
            "name": "watchpack",
            "direct": false,
            "version": "2.5.2",
            "ecosystem": "npm"
          },
          {
            "name": "wbuf",
            "direct": false,
            "version": "1.7.3",
            "ecosystem": "npm"
          },
          {
            "name": "webpack",
            "direct": false,
            "version": "5.108.4",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-cli",
            "direct": false,
            "version": "7.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-dev-middleware",
            "direct": false,
            "version": "7.4.2",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-dev-server",
            "direct": false,
            "version": "5.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-merge",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "webpack-sources",
            "direct": false,
            "version": "3.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "websocket-driver",
            "direct": false,
            "version": "0.7.5",
            "ecosystem": "npm"
          },
          {
            "name": "websocket-extensions",
            "direct": false,
            "version": "0.1.4",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "which",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "wildcard",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "workerpool",
            "direct": false,
            "version": "9.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "8.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "wrap-ansi",
            "direct": false,
            "version": "9.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "wrappy",
            "direct": false,
            "version": "1.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "ws",
            "direct": false,
            "version": "8.21.0",
            "ecosystem": "npm"
          },
          {
            "name": "y18n",
            "direct": false,
            "version": "5.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "yallist",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "yargs",
            "direct": false,
            "version": "17.7.2",
            "ecosystem": "npm"
          },
          {
            "name": "yargs-parser",
            "direct": false,
            "version": "21.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "yargs-unparser",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "yauzl",
            "direct": false,
            "version": "3.3.2",
            "ecosystem": "npm"
          },
          {
            "name": "yocto-queue",
            "direct": false,
            "version": "0.1.0",
            "ecosystem": "npm"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 730,
        "direct_count": 0,
        "indirect_count": 730
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 424,
        "open_issues": 4,
        "closed_ratio": 0.978,
        "closed_issues": 174,
        "closed_unmerged_prs": 70
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "mattiasw",
          "commits": 514,
          "avatar_url": "https://avatars.githubusercontent.com/u/564615?v=4"
        },
        {
          "type": "User",
          "login": "logistiker",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/527540?v=4"
        },
        {
          "type": "User",
          "login": "mattcg",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/282964?v=4"
        },
        {
          "type": "User",
          "login": "disarticulate",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/17464125?v=4"
        },
        {
          "type": "User",
          "login": "suke",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/38808706?v=4"
        },
        {
          "type": "User",
          "login": "alvinometric",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/107407814?v=4"
        },
        {
          "type": "User",
          "login": "BasemHamad",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/42210912?v=4"
        },
        {
          "type": "User",
          "login": "blakeembrey",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1088987?v=4"
        },
        {
          "type": "User",
          "login": "cybertino",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/12428252?v=4"
        },
        {
          "type": "User",
          "login": "eliaskounakas",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/109034985?v=4"
        }
      ],
      "contributors_sampled": 26,
      "top_contributor_share": 0.941
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "end-to-end.yml",
        "gh-pages.yml",
        "nodejs.yml",
        "publish.yml",
        "tag-filtering-integration.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        "eslint.config.mjs"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/11 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 3,
            "reason": "dependency not pinned by hash detected -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 4,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "12 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "74910ccf10e7c037a9f520bceb3191bc48a5dde2",
        "ran_at": "2026-07-23T22:26:37Z",
        "aggregate_score": 5.2,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T14:03:25Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-22T14:02:51Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 243,
          "created_at": "2023-07-07T10:29:21Z",
          "last_comment_at": "2024-03-27T21:41:11Z",
          "last_comment_author": "mattiasw"
        },
        {
          "number": 365,
          "created_at": "2024-08-02T08:56:32Z",
          "last_comment_at": "2024-08-09T10:17:14Z",
          "last_comment_author": "mattiasw"
        },
        {
          "number": 442,
          "created_at": "2024-11-12T19:56:14Z",
          "last_comment_at": "2025-03-03T22:57:55Z",
          "last_comment_author": "boustanihani"
        },
        {
          "number": 532,
          "created_at": "2025-06-23T00:34:34Z",
          "last_comment_at": "2025-06-24T20:50:33Z",
          "last_comment_author": "mattiasw"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/mattiasw/ExifReader",
    "host": "github.com",
    "name": "ExifReader",
    "owner": "mattiasw"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 75,
      "inputs": {
        "security": 62,
        "vitality": 95,
        "community": 88,
        "governance": 60,
        "engineering": 70
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 95,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "commits_last_year": 194,
              "human_commit_share": 0.82,
              "days_since_last_push": 1,
              "active_weeks_last_year": 49
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 1 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "49/52 weeks with commits",
                "points": 33.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 49
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "194 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 194
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v4.41.3",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 5.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 1,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 1 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "excellent",
        "name": "Community & Adoption",
        "value": 88,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "forks": 106,
              "stars": 992,
              "watchers": 13,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "992 stars",
                "points": 48.6,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 992
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "106 forks",
                "points": 16.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 106
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "13 watchers",
                "points": 6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": true,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MPL-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MPL-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 7.2,
                "status": "met",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "excellent",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 99,
            "inputs": {
              "packages": [
                "exifreader"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 854905
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "854,905 downloads/month across npm",
                "points": 79.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 854905,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 60,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 26,
              "top_contributor_share": 0.941
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 94% of commits",
                "points": 1.3,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 94
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "26 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "merged_prs": 424,
              "open_issues": 4,
              "closed_issues": 174,
              "issue_closed_ratio": 0.978,
              "closed_unmerged_prs": 70
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "98% of issues closed",
                "points": 45.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "424/494 decided PRs merged",
                "points": 32.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 424,
                      "decided": 494
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/11 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 52,
            "inputs": {
              "followers": 28,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "mattiasw",
              "public_repos": 17,
              "account_age_days": 5669
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "28 followers of mattiasw",
                "points": 10.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 28,
                      "login": "mattiasw"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "17 public repos, account ~15 yr old",
                "points": 21.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 17
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 15
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "exifreader"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "130 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 130
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 70,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "5 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 62,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 52,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 5.2
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/11 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "12 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:exifreader@4.41.3 runtime dependency closure — what installing the published package pulls in — 1 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:exifreader@4.41.3",
                  "assessed": 1
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 1,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 1,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 10
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 66,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "good",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.524,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 7089
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "43 of 82 human commits state their intent (structured subject or explanatory body)",
                "points": 28,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 43,
                      "sampled": 82
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "test/types/tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.18
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "test/types/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "test/types/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "18 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 18,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 84419,
              "source_files_sampled": 149,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "JavaScript with type-check config (test/types/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "test/types/tsconfig.json",
                      "language": "JavaScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/149 source files over 60KB",
                "points": 54.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 149,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T22:27:00.885390Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/mattiasw/ExifReader.svg",
  "full_name": "mattiasw/ExifReader",
  "license_state": "standard",
  "license_spdx": "MPL-2.0"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm.