Repository navigation
Conversation
Enforce a 7-day minimum release age (matching Dependabot's cooldown), refuse releases whose publishing evidence drops below an earlier release's (`trustPolicy: no-downgrade`), and skip piscina's optional `@napi-rs/nice` binaries, which doc-kit never loads. Also drops the stale `unrs-resolver` build entry, bumps wrangler to 4.151.1 (pulls sharp 0.35.5), and refreshes zod and brace-expansion past their advisories. Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Update cosmiconfig to v10, which drops parse-json, import-fresh, the typescript peer and the @babel/code-frame chain (12 packages). v10 needs Node.js ^22.18 || >=24, matching `.nvmrc`. Move `dedent` to `@doc-kit/core`'s devDependencies, since only a test uses it there, and replace `reading-time` with `Intl.Segmenter`. CJK characters still count as one word each, and rendered pages show the same estimates. Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Nothing reads the pool's run/wait histograms. The other fast paths are already piscina's defaults (sync atomics, one task per worker, no per-worker histograms). Benchmarked against `json`, `legacy-html` and `web` with FixedQueue and a longer idleTimeout too: everything is within noise, and idleTimeout 2000 costs +20% peak RSS on `web`, so the 250ms timeout stays. Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
harden-runner blocked api.securityscorecards.dev, so the action logged "domain not allowed" and printed every OpenSSF Scorecard score as undefined. Also gives api.deps.dev its port like the other entries. Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Inline the setup steps instead of using the shared setup-environment action, which persists the checkout token and restores the pnpm store from the Actions cache in a job that holds `id-token: write`. changesets/action pushes commits and tags through the GitHub API, so the job doesn't need the checkout token. Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
🚀 Deploying Preview to Cloudflare 🚀Preview Deployments by commit
|
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #1178 +/- ##
==========================================
- Coverage 93.44% 93.41% -0.03%
==========================================
Files 278 278
Lines 27820 27840 +20
Branches 2790 2790
==========================================
+ Hits 25997 26008 +11
- Misses 1801 1810 +9
Partials 22 22 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
| File | Main | PR | Change |
|---|---|---|---|
orama-db.json |
29.24 MB | 29.24 MB | +1.51 KB (+0.0%) |
Performance estimate (single CI run)
- Generation time: 9.3% slower (5.26 s → 5.75 s)
- Peak memory: 2.5% lower (1.33 GB → 1.30 GB)
web Generator
Output size: 136 files changed · net -106.31 KB
File size details
| File | Main | PR | Change |
|---|---|---|---|
assets/style-p1XZsxjB.css |
138.55 KB | — | -138.55 KB (-100.0%) |
assets/style-oesv8pX0.css |
— | 138.33 KB | +138.33 KB |
assets/SearchBox-DD9L4y_U.js |
84.67 KB | — | -84.67 KB (-100.0%) |
assets/SearchBox-CWh3xKwr.js |
— | 84.66 KB | +84.66 KB |
all.html |
34.81 MB | 34.77 MB | -48.07 KB (-0.1%) |
assets/dist-7Sv3Eu0L.js |
30.42 KB | — | -30.42 KB (-100.0%) |
assets/dist-BYff4Nb9.js |
— | 30.42 KB | +30.42 KB |
assets/SideBar-Brrk92eF.js |
25.62 KB | — | -25.62 KB (-100.0%) |
assets/SideBar-C7dco05x.js |
— | 25.61 KB | +25.61 KB |
assets/client-BY1cXtbt.js |
25.08 KB | — | -25.08 KB (-100.0%) |
assets/client-GPyj1vjp.js |
— | 25.08 KB | +25.08 KB |
assets/Combination-C6mYSeMI.js |
16.11 KB | — | -16.11 KB (-100.0%) |
assets/Combination-BmJ0lnzd.js |
— | 16.11 KB | +16.11 KB |
assets/ThemeToggle-t7UMm7iR.js |
13.65 KB | — | -13.65 KB (-100.0%) |
assets/ThemeToggle-Bws341Om.js |
— | 13.65 KB | +13.65 KB |
assets/dist-BiOceZL-.js |
10.20 KB | — | -10.20 KB (-100.0%) |
assets/dist-CtYeyKbs.js |
— | 10.20 KB | +10.20 KB |
assets/Layout-DXy0PTpC.js |
10.13 KB | — | -10.13 KB (-100.0%) |
assets/compat-BGVxnT5A.js |
10.13 KB | — | -10.13 KB (-100.0%) |
assets/compat-BdCbJT8e.js |
— | 10.13 KB | +10.13 KB |
assets/Layout-6nbr2xwo.js |
— | 10.13 KB | +10.13 KB |
assets/Tooltip-D0_5WcN-.js |
7.93 KB | — | -7.93 KB (-100.0%) |
assets/Tooltip-CZdLypHU.js |
— | 7.93 KB | +7.93 KB |
assets/dist-B_8yU3XK.js |
6.99 KB | — | -6.99 KB (-100.0%) |
assets/dist-BT83R5Zi.js |
— | 6.99 KB | +6.99 KB |
assets/jsx-runtime-CWJMV0zg.js |
5.67 KB | — | -5.67 KB (-100.0%) |
assets/jsx-runtime-CcH8sYa0.js |
— | 5.67 KB | +5.67 KB |
assets/dist-mb3JM3jT.js |
3.93 KB | — | -3.93 KB (-100.0%) |
assets/dist-BnS9dFnb.js |
— | 3.93 KB | +3.93 KB |
assets/CodeTabs-CPzzUAfT.js |
3.89 KB | — | -3.89 KB (-100.0%) |
assets/CodeTabs-B-vr1rJG.js |
— | 3.89 KB | +3.89 KB |
fs.html |
2.36 MB | 2.36 MB | -3.80 KB (-0.2%) |
assets/CodeBox-UjtYavEZ.js |
3.44 KB | — | -3.44 KB (-100.0%) |
assets/CodeBox-CZUrdd_C.js |
— | 3.44 KB | +3.44 KB |
assets/hooks.module-CFIEcDZS.js |
3.40 KB | — | -3.40 KB (-100.0%) |
assets/hooks.module-JC599V3k.js |
— | 3.40 KB | +3.40 KB |
quic.html |
988.32 KB | 985.72 KB | -2.60 KB (-0.3%) |
crypto.html |
2.04 MB | 2.04 MB | -2.44 KB (-0.1%) |
assets/FunctionSignature-Rfd1uwFe.js |
2.28 KB | — | -2.28 KB (-100.0%) |
assets/FunctionSignature-CCIPZNzz.js |
— | 2.28 KB | +2.28 KB |
http.html |
1.23 MB | 1.23 MB | -2.21 KB (-0.2%) |
deprecations.html |
609.02 KB | 606.82 KB | -2.21 KB (-0.4%) |
assets/Banner-C5QQ94Xt.js |
2.13 KB | — | -2.13 KB (-100.0%) |
assets/Banner-BT1yBYM5.js |
— | 2.13 KB | +2.13 KB |
cli.html |
680.97 KB | 678.98 KB | -2.00 KB (-0.3%) |
buffer.html |
1.82 MB | 1.82 MB | -1.95 KB (-0.1%) |
http2.html |
1.31 MB | 1.31 MB | -1.91 KB (-0.1%) |
zlib.html |
1013.26 KB | 1011.45 KB | -1.82 KB (-0.2%) |
webcrypto.html |
681.72 KB | 679.92 KB | -1.80 KB (-0.3%) |
assets/ChangeHistory-D9LG4HXo.js |
1.77 KB | — | -1.77 KB (-100.0%) |
assets/ChangeHistory-BGC8GXW-.js |
— | 1.77 KB | +1.77 KB |
process.html |
1.20 MB | 1.20 MB | -1.70 KB (-0.1%) |
perf_hooks.html |
912.49 KB | 910.85 KB | -1.64 KB (-0.2%) |
stream.html |
1.27 MB | 1.27 MB | -1.41 KB (-0.1%) |
net.html |
670.90 KB | 669.50 KB | -1.40 KB (-0.2%) |
util.html |
1.27 MB | 1.26 MB | -1.39 KB (-0.1%) |
test.html |
1.47 MB | 1.47 MB | -1.37 KB (-0.1%) |
n-api.html |
1.05 MB | 1.05 MB | -1.28 KB (-0.1%) |
errors.html |
570.94 KB | 569.72 KB | -1.22 KB (-0.2%) |
globals.html |
303.47 KB | 302.31 KB | -1.16 KB (-0.4%) |
webstreams.html |
566.50 KB | 565.36 KB | -1.13 KB (-0.2%) |
events.html |
869.10 KB | 868.12 KB | -1004.00 B (-0.1%) |
tls.html |
553.44 KB | 552.48 KB | -986.00 B (-0.2%) |
worker_threads.html |
663.11 KB | 662.16 KB | -977.00 B (-0.1%) |
assets/DataTag-DtiaU1SZ.js |
856.00 B | — | -856.00 B (-100.0%) |
sqlite.html |
543.81 KB | 542.98 KB | -851.00 B (-0.2%) |
assets/DataTag-BAJRxOON.js |
— | 844.00 B | +844.00 B |
assets/DocumentationIndex-B2JfRHAn.js |
833.00 B | — | -833.00 B (-100.0%) |
assets/DocumentationIndex-D9u01mMO.js |
— | 833.00 B | +833.00 B |
v8.html |
575.25 KB | 574.47 KB | -789.00 B (-0.1%) |
dns.html |
442.76 KB | 442.01 KB | -765.00 B (-0.2%) |
diagnostics_channel.html |
554.16 KB | 553.44 KB | -739.00 B (-0.1%) |
assert.html |
673.69 KB | 673.00 KB | -714.00 B (-0.1%) |
child_process.html |
699.34 KB | 698.64 KB | -710.00 B (-0.1%) |
stream_iter.html |
795.87 KB | 795.19 KB | -696.00 B (-0.1%) |
url.html |
534.56 KB | 533.89 KB | -690.00 B (-0.1%) |
vm.html |
657.44 KB | 656.77 KB | -688.00 B (-0.1%) |
readline.html |
381.45 KB | 380.82 KB | -644.00 B (-0.2%) |
dtls.html |
316.25 KB | 315.63 KB | -631.00 B (-0.2%) |
assets/ArrowUpRightIcon-Bbb8DgHe.js |
618.00 B | — | -618.00 B (-100.0%) |
assets/ArrowUpRightIcon-3rrAw9tL.js |
— | 618.00 B | +618.00 B |
assets/Badge-C-ltoqbN.js |
616.00 B | — | -616.00 B (-100.0%) |
assets/Badge-DCiAoYW0.js |
— | 607.00 B | +607.00 B |
assets/AlertBox-3_Yfvgqh.js |
591.00 B | — | -591.00 B (-100.0%) |
assets/AlertBox-BjJkptee.js |
— | 591.00 B | +591.00 B |
dgram.html |
314.05 KB | 313.49 KB | -574.00 B (-0.2%) |
module.html |
531.20 KB | 530.64 KB | -571.00 B (-0.1%) |
cluster.html |
318.27 KB | 317.74 KB | -545.00 B (-0.2%) |
assets/CodeBracketIcon-C36OD0aC.js |
512.00 B | — | -512.00 B (-100.0%) |
assets/CodeBracketIcon-CLozeGPo.js |
— | 512.00 B | +512.00 B |
inspector.html |
225.65 KB | 225.17 KB | -498.00 B (-0.2%) |
assets/dist-Dk9IlaWb.js |
477.00 B | — | -477.00 B (-100.0%) |
assets/dist-Qgd4IXja.js |
— | 477.00 B | +477.00 B |
assets/ChevronDownIcon-Do5H2e5N.js |
468.00 B | — | -468.00 B (-100.0%) |
assets/ChevronDownIcon-CeCixlbl.js |
— | 468.00 B | +468.00 B |
assets/renderLabel-B4Wm-j6_.js |
447.00 B | — | -447.00 B (-100.0%) |
assets/renderLabel-De9VfGuc.js |
— | 447.00 B | +447.00 B |
timers.html |
192.67 KB | 192.25 KB | -431.00 B (-0.2%) |
console.html |
194.58 KB | 194.17 KB | -427.00 B (-0.2%) |
async_context.html |
330.35 KB | 329.94 KB | -420.00 B (-0.1%) |
os.html |
173.79 KB | 173.40 KB | -408.00 B (-0.2%) |
https.html |
250.52 KB | 250.13 KB | -398.00 B (-0.2%) |
modules.html |
238.40 KB | 238.01 KB | -396.00 B (-0.2%) |
bench.html |
213.82 KB | 213.44 KB | -386.00 B (-0.2%) |
vfs.html |
214.01 KB | 213.64 KB | -384.00 B (-0.2%) |
ffi.html |
204.00 KB | 203.64 KB | -371.00 B (-0.2%) |
tty.html |
114.10 KB | 113.74 KB | -367.00 B (-0.3%) |
esm.html |
196.41 KB | 196.06 KB | -362.00 B (-0.2%) |
path.html |
186.51 KB | 186.18 KB | -344.00 B (-0.2%) |
repl.html |
314.32 KB | 314.00 KB | -331.00 B (-0.1%) |
packages.html |
234.83 KB | 234.52 KB | -326.00 B (-0.1%) |
async_hooks.html |
293.41 KB | 293.14 KB | -278.00 B (-0.1%) |
wasi.html |
84.21 KB | 83.98 KB | -241.00 B (-0.3%) |
punycode.html |
68.48 KB | 68.25 KB | -234.00 B (-0.3%) |
tracing.html |
131.22 KB | 130.99 KB | -234.00 B (-0.2%) |
single-executable-applications.html |
170.86 KB | 170.64 KB | -226.00 B (-0.1%) |
querystring.html |
70.41 KB | 70.20 KB | -220.00 B (-0.3%) |
domain.html |
131.41 KB | 131.21 KB | -208.00 B (-0.2%) |
string_decoder.html |
69.13 KB | 68.93 KB | -196.00 B (-0.3%) |
debugger.html |
148.42 KB | 148.24 KB | -189.00 B (-0.1%) |
report.html |
238.26 KB | 238.07 KB | -187.00 B (-0.1%) |
typescript.html |
53.34 KB | 53.17 KB | -175.00 B (-0.3%) |
addons.html |
389.90 KB | 389.73 KB | -170.00 B (-0.0%) |
assets/Blockquote-DPf4tr3s.js |
167.00 B | — | -167.00 B (-100.0%) |
assets/Blockquote-DYd-xjeH.js |
— | 167.00 B | +167.00 B |
permissions.html |
94.96 KB | 94.80 KB | -166.00 B (-0.2%) |
embedding.html |
73.14 KB | 72.98 KB | -163.00 B (-0.2%) |
documentation.html |
30.02 KB | 29.87 KB | -157.00 B (-0.5%) |
environment_variables.html |
39.57 KB | 39.42 KB | -155.00 B (-0.4%) |
assets/useRemoteConfig-BD0WscbS.js |
151.00 B | — | -151.00 B (-100.0%) |
index.html |
28.06 KB | 27.91 KB | -151.00 B (-0.5%) |
intl.html |
58.89 KB | 58.74 KB | -151.00 B (-0.3%) |
assets/useRemoteConfig-C1tgkHqf.js |
— | 151.00 B | +151.00 B |
404.html |
22.80 KB | 22.66 KB | -144.00 B (-0.6%) |
assets/withIsland-o2Rd4XD_.js |
105.00 B | — | -105.00 B (-100.0%) |
assets/withIsland-Zt0EKufw.js |
— | 105.00 B | +105.00 B |
Performance estimate (single CI run)
- Generation time: 0.5% slower (23.79 s → 23.91 s)
- Peak memory: 0.5% lower (2.02 GB → 2.01 GB)
Go back to `nodejs/web-team/actions/setup-environment` in the publish job instead of inlining its steps, and bump it everywhere to the current web-team `main`, which already checks out with `persist-credentials: false` and pins newer checkout, setup-node and pnpm/action-setup releases. Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Seven days also held back Dependabot security updates, which skip the cooldown. Dependabot's own version-update cooldown stays at 7 days, so its regular bumps always clear the gate. It can go back up once both are tuned together. Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
cosmiconfig 10 no longer uses the `typescript` package. It loads `.ts` configs through Node.js's type stripping, which only handles erasable syntax. Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
bmuenzenmeyer
left a comment
There was a problem hiding this comment.
this is good stuff. i wanted to make mention that it is borderline not atomic, but i think its good overall
`@node-core/*` is published by the Node.js website team, who maintain doc-kit as well, so waiting 3 days on those releases only delays our own updates (e.g. `@node-core/ui-components` and `@node-core/rehype-shiki`). Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
avivkeller
left a comment
There was a problem hiding this comment.
What's the reason behind dropping reading-time?
Have... you read the PR description here? What reading-time was doing can be replaced by a simple synchronous function. The idea behind this PR is reducing dependency count to tighten supply chain attacks. Since the Intl. API can do this easily... Why not? |
|
Yes, I've read the description, and I can't see a reason behind reading-time being hand rolled |
|
Can you break the reading-time change into its own PR, since that's behavioral, whereas everything else is unchanging? I don't love that we are hand rolling a package that already exists for this function, it doesn't feel very DRY, I suppose |
It is in-scope to the PR, I won't move it to a separate change if you don't properly convince me :) |
This is a pretty minimal implementation that is much more modern, smaller and faster than reading-time's (and it uses the same 200 words per minute calculation) one: https://www.npmjs.com/package/reading-time?activeTab=code -- there is no reason to use a package for the sake of it. Sorry, I won't budge on this one, please be reasonable 😅 |
I think I and many would argue this is exactly what is wrong with the NPM ecosystem, and why we have a plague of packages like |
Yeah and to clarify, I'm not trying to be closed minded here, I just really have a strong opinion on this case, and genuinely believe this change is in-scope for the PR and a pretty reasonable one. Apologies, @avivkeller if it sounds I'm just being harsh lol |
|
(I also personally had no idea about this |
avivkeller
left a comment
There was a problem hiding this comment.
My personal opinion isn't that strong of a preference, so fine with leaving as is
I mean, I appreciate that, but I would love to better understand the reasoning behind your opinion. Why you believe that hand rolling this package is ... bad? Is there anything particularly why this specific change is bad or is it more a general concept against hand rolling packages? |
1.8.1 no longer installs `@vcarl/remark-headings` (nodejs/nodejs.org#9235), which takes it and the old mdast/unist utilities it pulled in (`@types/mdast@3`, `mdast-util-to-string@3`, `unist-util-is@5`, `unist-util-visit@4`, `unist-util-visit-parents@5`) out of the `@doc-kit/generator-react` tree. Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
As a general rule of (my) thumb, I'm a fan of re-using what exists. As in, keeping the burden of maintenance on an external dependency author rather than on us (yes, we will review changelogs for security issues & breakages), but it keeps day-to-day off our hands. But, this is a personal preference. |
I understand, and in general agree this statement. But do you really believe there's a burden of maintenance of a 4 line function? That probably won't ever change? How much day-to-day effort is this function going to bring us? Not challenging the notion, I agree with the sentiment, but I made this conscious trade-off decision knowing we'd be migrating from a non-actively maintained repo, unto a much smaller alternative using modern backed-into EcmaScript APIs. |
|
|
||
| # Published by the Node.js website team, who maintain doc-kit too | ||
| minimumReleaseAgeExclude: | ||
| - '@node-core/*' |
There was a problem hiding this comment.
@bmuenzenmeyer @MattIPv4 just a fyi, unsure what y'all feel about this line.
There was a problem hiding this comment.
I think I'd prefer to have no exceptions to the rule, if we can?
There was a problem hiding this comment.
I'm fine reverting this, yes. My reasoning here is that my biggest worry for supply chains are 3rd party dependencies, not the ones controlled by us, because they also would be susceptible to the very same minimum age, CI workflows/lockdown and publishing mechanisms... So if any @node-core package owned by us gets hijacked, well, none of this would prevent anything, wouldn't it?
Hence, removing this rule for our own packages, such as ui-components, rehype-shiki allows us to quickly iterate internally. Otherwise if we make a change, we're blocked for 3d (and once we up the rule to 7d... then 7d) to get any work done here
There was a problem hiding this comment.
👍 Not strongly held, so if other folks think that is a useful convenience, happy to leave this.
There was a problem hiding this comment.
i am fine with this exception - we control both sides of this relationship, and they themselves have their own governance controls and exception based process for urgent situations
The reasons behind each setting are in the PR description instead. Assisted-by: Claude Opus 5.5 <noreply@anthropic.com>
Description
This PR hardens doc-kit's dependency supply chain, following an audit of every lockfile entry (release age, security policies, OpenSSF Scorecard, trusted publishing and advisories):
minimumReleaseAge: 4320(3 days), below Dependabot's 7-day cooldown, so its version bumps always clear it.@node-core/*is excluded, since the Node.js website team publishes those and maintains doc-kit too.trustPolicy: no-downgraderefuses a release whose publishing evidence is weaker than an earlier release of the same package (trusted publishing → token, provenance → none). No lockfile entry has that today, so it costs nothing.ignoredOptionalDependenciesskips@napi-rs/nice, piscina's optional thread-priority binding (one native binary per platform). doc-kit never setsniceIncrement, so it's never loaded.unrs-resolverbuild entry.wranglerto 4.151.1 (pullssharp0.35.5) and refresheszodandbrace-expansion.pnpm update --depth Infinitywon't movebrace-expansionoff 5.0.9, so its lock entry was reset instead.cosmiconfigv10 drops 12 packages (it needs Node.js^22.18 || >=24, which matches.nvmrc),dedentmoves to@doc-kit/core's devDependencies since only a test uses it, andreading-timeis replaced byIntl.Segmenter.@node-core/ui-components1.8.1 also stops installing@vcarl/remark-headings(nodejs/nodejs.org#9235), which takes it and the old mdast/unist utilities it pulled in (@types/mdast@3,mdast-util-to-string@3,unist-util-is@5,unist-util-visit@4,unist-util-visit-parents@5) out of the tree.recordTiming: false, since nothing reads the pool's histograms. The other fast paths (sync atomics, one task per worker) are already piscina's defaults, see the benchmark below.api.securityscorecards.dev, so every Scorecard score printed asundefined(this run logsdomain not allowed).nodejs/web-team/actions/setup-environmentto its currentmainin every workflow. We were pinned to a version that persisted the checkout token, which matters most in the publish job (it holdsid-token: write). Letting the publish job skip the Actions cache is up in nodejs/web-team#192.Overall the lockfile goes from 673 to 637 entries (376 → 339 reachable at runtime). Together with #1175, #1176 and #1177,
pnpm auditgoes from 17 to 3 advisories, all inundici7, which miniflare pins exactly and has no fix yet.Validation
pnpm install --frozen-lockfilepasses pnpm's supply-chain verification (also merged with currentmain), andnode --run test(747/747),node --run lintandnode --run format:checkare clean.htmlbuild ofpath.mdwithshowReadingTimeshows the same "8 min read" asmain, and on the Node.js API docs the word count stays within ~3% ofreading-time. CJK characters still count as one word each.doc/api(70 files, 4 threads):jsonlegacy-htmlwebweb)mainrecordTiming: falseFixedQueueidleTimeout: 2000Everything is within noise: each task is a chunk that runs for seconds, so per-task overhead doesn't show. A longer
idleTimeoutonly costs memory, so the 250ms one stays.Note
Dependabot security updates skip its cooldown, so with the 3-day gate a brand-new fix keeps failing the frozen install until it's 3 days old.
Related Issues
Follow-ups outside this PR: making Dependency Review a required check, and a
nodejs/adminrequest for the Socket GitHub App.Check List
node --run testand all tests passed.node --run format:check&node --run lint.