Content glow-up: content/docs/iac/languages-sdks/javascript/_index.md - #21552
Conversation
Automated existing-content review. Co-Authored-By: Claude <noreply@anthropic.com>
|
Your site preview for commit 1be2119 is ready! 🎉 http://www-testing-pulumi-docs-origin-pr-21552-1be21192.s3-website.us-west-2.amazonaws.com Changed pages: |
|
@claude #new-review |
|
🤖 Review errored. Flip to draft and back to ready, or mention |
|
@claude #new-review |
Reviewer's guide v3 — not for the authorTip This is the reviewer's guide. Work through the PR author: your to-do list is the other review comment, "Author action guide" — nothing on this card is yours. Note What this PR changes:
On a version-and-config reference page, the wrongness that blocks a reader is a version number or compiler setting that doesn't match the sample they copy. Claim verification, a frontmatter sweep, and link and shortcode checks ran over the changed lines. Review confidence:
|
Author action guide v3 — nothing blocks mergeNote Nothing here blocks merge — no open items need an answer from you. A human reviewer still approves the merge. This PR is a copy-edit pass over the JavaScript/TypeScript language reference page; the review checked every factual claim in the changed lines against the page's own code samples and the upstream TypeScript and Node.js docs. 🚨 Fix or disagreeNothing to fix — this section is empty. ❓ Questions for youNo open questions for you. ✅ Resolved since last review
📎 Full evidence: verification trail, investigation log, review history. Review v3 · updated 2026-09-14T23:23:27Z · head commit 1be2119 How to answerEvery 🚨 and ❓ item above needs one of these before merge:
The Please don't edit, hide, or delete this comment — it is the review's record. Full mechanics: CONTRIBUTING.md §AI-assisted contributions. |
|
🤖 Review regenerated on @CamSoper's request. |
|
@claude implement the fixes for F1 and F4 as suggested and then #update-review |
The copy-edit pass changed the stated minimum `target` for top-level `await` to ES2017 in two places, contradicting the `tsconfig.json` sample directly below them, which sets `"target": "ES2022"`. Addresses review findings F1 and F4. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
🤖 Review updated on @CamSoper's request. |
|
Two things from a cross-PR pass over the open bot queue. 1. #21596 was editing the same line and has been closed in favour of this PR. It rewrote the same paragraph at L86 with different text. Neither review mentioned the other, because the pipeline reviews one PR against master and can't see the rest of the queue -- both sat on Worth folding in before merge: #21596's version of that sentence kept the fact that a template's pinned TypeScript version takes precedence over Pulumi's bundled compiler. This PR's replacement ("Pulumi compiles TypeScript for you, and works with a range of compiler versions...") drops it. That's the one piece of information the deleted paragraph carried that the pointer doesn't. #21596's wording for reference:
2. The reviewer's guide summary on this PR is stale. Its "What this PR changes" block says the PR changes the top-level- Generated by Claude Code |
|
@claude The change summary in the reviewer's guide is stale and contradicts the diff. It says this PR changes the top-level Also please re-adjudicate one content point. #21596 has been closed as superseded by this PR -- both were rewriting the same paragraph at L86 with different text. The sentence #21596 used kept a fact this PR's replacement drops: that a template's pinned TypeScript version takes precedence over Pulumi's bundled compiler. Worth deciding whether that belongs back in the pointer paragraph. #update-review Generated by Claude Code |
|
🤖 Review updated on @CamSoper's request. |
The pre-merge verifier stamped PR pulumi#21720's `terraform-provider` pin bump (0.10.0 -> 1.4.0, the real latest release) `contradicted`, citing the live published copy of the file under review. That page shows the pre-change text, so it disagrees with every value a PR changes. A ledger audit found 9 of 66 contradicted verdicts citing the reviewed page's own URL and 9 more resting on other pulumi.com pages alone. The shape is a useful change detector (it also caught two real bot regressions, pulumi#21552 and pulumi#21602), so it is re-verified, not downgraded: - verify-claims.py: a contradicted/mismatch whose only source is the reviewed page's live URL, or a contradicted resting on editorial pulumi.com pages alone, gets one more pass1 hop with a note explaining why that source is not evidence. An independently sourced answer stands; otherwise the verdict becomes `unverifiable`, stamped `source_discipline_gate: self-reference | same-site-only`, with the original reasoning preserved as an author question. Generated reference pages and URLs the claim itself names are exempt. - route_claim: a `version` claim's non-URL source_hint names a package, not an external authority, so it routes pass1 (release tags) instead of being web-searched into pulumi.com's own page. - claim-extraction.md: worked example 14 (whose version a nested `packages:` pin belongs to) and a `pulumi/<repo>` source_hint preference for version claims. - Verifier prompt and fact-check.md state that rules 2 and 5 are now harness-enforced. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The pre-merge verifier stamped PR #21720's `terraform-provider` pin bump (0.10.0 -> 1.4.0, the real latest release) `contradicted`, citing the live published copy of the file under review. That page shows the pre-change text, so it disagrees with every value a PR changes. A ledger audit found 9 of 66 contradicted verdicts citing the reviewed page's own URL and 9 more resting on other pulumi.com pages alone. The shape is a useful change detector (it also caught two real bot regressions, #21552 and #21602), so it is re-verified, not downgraded: - verify-claims.py: a contradicted/mismatch whose only source is the reviewed page's live URL, or a contradicted resting on editorial pulumi.com pages alone, gets one more pass1 hop with a note explaining why that source is not evidence. An independently sourced answer stands; otherwise the verdict becomes `unverifiable`, stamped `source_discipline_gate: self-reference | same-site-only`, with the original reasoning preserved as an author question. Generated reference pages and URLs the claim itself names are exempt. - route_claim: a `version` claim's non-URL source_hint names a package, not an external authority, so it routes pass1 (release tags) instead of being web-searched into pulumi.com's own page. - claim-extraction.md: worked example 14 (whose version a nested `packages:` pin belongs to) and a `pulumi/<repo>` source_hint preference for version claims. - Verifier prompt and fact-check.md state that rules 2 and 5 are now harness-enforced. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Important
Glow-up PR — human review required. Auto-merge is never armed on glow-up PRs and the automated PR-review sweep never approves them; it assigns the reviewers. Adjudicate the Backlog executed / Backlog declined tables below and merge manually.
Why this page
content/docs/iac/languages-sdks/javascript/_index.md→ /docs/iac/languages-sdks/javascript/no_retire: true)CLICKSTREAM.FCT_PAGEVIEWS)attempts: 0)This section is composed deterministically from the selection queue; do not edit it.
Backlog executed
findings-f6— Claim (c53, L295): SettingtargettoES2022or later intsconfig.jsonenables top-level await. (prior disposition: deferred as judgment-level — the earlier run had the correct technical reading but no unambiguous replacement wording to drop in) (this run: c51contradictedhigh at L295)modulesetting, withtargetas the secondary requirement: "Thatmodulesetting is also what makes top-level await available, as long astargetisES2017or later". Same correction applied to the matching sentence in the Top-level await section, which repeated thetarget-only framing. Thetsconfig.jsonexamples still showES2022, which satisfies theES2017-or-later requirement. Seefresh-c51for the evidence.fresh-c51— Claim (c51, L295): SettingtargettoES2022or later intsconfig.jsonenables top-level await. — contradicted (high) (evidence: (escalated from pass1) TypeScript's own tsconfig reference attributes top-level await support to themodulesetting, nottarget: "ES2020 adds support for dynamic imports, and import.meta while ES2022 further adds support for top level …)findings-f6— this is the fresh verdict on that sentence..verified-claims.jsonc51 (contradicted, high, pass3) cites https://www.typescriptlang.org/tsconfig/: top-level await requiresmoduleset to one of es2022/esnext/system/node16/node18/node20/nodenext/preserve andtargetat es2017 or higher — the page attributed it totargetalone. The page already instructsmodule: nodenexttwo sentences earlier, so the corrected wording is a re-attribution, not new advice.findings-f10— Vale weasel word (L28): 'vast' is a weasel word! (prior disposition: deferred as judgment-level — dropping the adjective needed a rewrite of the bullet, not a substitution)findings-f11— Vale heading capitalization (L34): Heading 'Node.js Runtime' should use sentence case (capitalize only the first word and proper nouns). (prior disposition: deferred as judgment-level — heading renames carry an anchor-stability question the fix lane would not decide)### Node.js Runtime→### Node.js runtime. Also makes it consistent with its sibling### Bun runtime. The slug is unchanged (#nodejs-runtime), so no inbound anchor breaks.findings-f12— Vale future tense (L71): Future tense ('Pulumi will use') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). (prior disposition: deferred as judgment-level — tense rewrites are style, not a correctness fix)findings-f13— Vale wordiness (L108): 'Alternatively' is too wordy. (prior disposition: deferred as judgment-level — required rephrasing the sentence's connective, not deleting a word)mainwithin yourpackage.json, …" → "If you specifymainwithin yourpackage.json, …". The contrast with the preceding default-entrypoint sentence still reads.findings-f14— Vale future tense (L108): Future tense ('Pulumi will load') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). (prior disposition: deferred as judgment-level — tense rewrites are style, not a correctness fix)index.tsorindex.js" → "Pulumi loads …", and "Pulumi will load that module instead" → "Pulumi loads that module instead".findings-f15— Vale future tense (L147): Future tense ('Pulumi will automatically') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). (prior disposition: deferred as judgment-level — tense rewrites are style, not a correctness fix)findings-f16— Vale heading capitalization (L280): Heading 'Native ESM Support' should use sentence case (capitalize only the first word and proper nouns). (prior disposition: deferred as judgment-level — heading renames carry an anchor-stability question the fix lane would not decide)## Native ESM Support→## Native ESM support, and the in-page link text at the Enabling async support note updated to match. Slug unchanged (#native-esm-support). Vale still reports this heading in the re-run — see Style improvements below; it is a rule limitation on theESMacronym, not an unapplied fix.findings-f17— Vale future tense (L327): Future tense ('Pulumi will not automatically') -- prefer present tense for product behavior: 'Neo pauses', not 'Neo will pause' (brand guide: writing style). (prior disposition: deferred as judgment-level — tense rewrites are style, not a correctness fix)--loader,--import, or--require".Backlog declined
findings-f3— Claim (c46): The TypeScript team recommends running TypeScript 6.0 side-by-side with TypeScript 7.0 until TypeScript 7.1 ships, using the@typescript/typescript6backward… — unverifiable (prior disposition: deferred as judgment-level — the cited blog post fetched as analytics boilerplate, so the claim could be neither confirmed nor corrected) (this run: c44verifiedhigh at L233).verified-claims.jsonre-verdicted the same sentenceverified(high) at L233 (c44, text overlap 0.92). Pre-declined by the composer.findings-f4— Claim (c47): Aliasing the@typescript/typescript6compatibility package astypescriptallows Pulumi's built-in TypeScript support to keep running a program with TypeScr… — unverifiable (prior disposition: deferred as judgment-level — the cited blog post fetched as tracking boilerplate, so the claim could be neither confirmed nor corrected) (this run: c18verifiedhigh at L95).verified-claims.jsonre-verdicted the same sentenceverified(high) at L95 (c18, text overlap 0.50). Pre-declined by the composer.findings-f1— Claim (c7): Settingruntime: buninPulumi.yamlconfigures Pulumi to use the Bun runtime. — unverifiable (prior disposition: deferred as judgment-level — the cited bun.sh homepage is not an authority for Pulumi's own runtime setting) (this run: c6unverifiablelow at L46-50)unverifiable(low) again this run for the same reason — the inline link is a "what is Bun" pointer, not the citation for this behavior, which is Pulumi-internal. Verifying it needs pulumi/pulumi runtime-loader source, outside this lane's evidence base; the statement itself shows no sign of being wrong, so there is nothing defensible to change.findings-f2— Claim (c9): Function serialization and dynamic providers are unsupported on the Bun runtime because they depend on Node.js v8/inspector APIs that Bun does not fully implem… — unverifiable (prior disposition: deferred as judgment-level — the pre-fetched Bun compat page was truncated to sidebar navigation, so the cited section text was never seen) (this run: c8unverifiablelow at L55)unverifiable(low) this run with the same truncation. The cited anchor (https://bun.com/docs/runtime/nodejs-compat#nodeinspector) returns 200, and the claim is a Pulumi support statement whose authority is pulumi/pulumi, not Bun's docs. Correcting it would mean authoring a new causal explanation on low-confidence evidence.findings-f5— Claim (c51): You can use ESM syntax likeimportorexportin Pulumi TypeScript code, but it will be compiled to CommonJS behind the scenes by default. — unverifiable (prior disposition: deferred as judgment-level — nodejs.org/api/modules.html documents CommonJS generally and says nothing about Pulumi's templates) (this run: c49unverifiablelow at L282)unverifiable(low) this run, for the same reason — the citation is a CommonJS reference, and what the Pulumi templates'tsconfig.jsonemits is a repo fact, not a Node.js docs fact. The sentence was reworded for style in the secondary sweep ("but it will be compiled to CommonJS behind the scenes" → "but the compiler emits CommonJS behind the scenes"); that is a tense/wordiness fix and deliberately preserves the assertion rather than adjudicating it.findings-f7— Claim (c54): Setting themoduleandmoduleResolutionfields intsconfig.jsontonodenextensures TypeScript outputs ESM. — unverifiable (prior disposition: deferred as judgment-level — the tsconfig reference page fetched as menu CSS, so the option semantics were never read) (this run: c52unverifiablelow at L295)unverifiable(low) this run with the same fetch failure. Nothing in the artifacts contradicts it — and c51 on the neighbouring sentence independently cites the tsconfig reference in support ofmodule: nodenextbeing the ESM/top-level-await lever — so there is no correction to make. The line was edited for thefindings-f6re-attribution, which leaves this assertion intact.findings-f8— Claim (c55): When using a version of@pulumi/pulumiolder than 3.183.0, a user needs to instruct Pulumi to use thets-node/esmloader by setting thenodeargsoption i… — unverifiable (prior disposition: deferred as judgment-level — the linked project-file page fetched as site navigation, sonodeargswas never confirmed, and the 3.183.0 boundary has no cited source) (this run: c53unverifiablelow at L317)unverifiable(low) this run. The 3.183.0 version boundary is exactly the kind of pin that needs an authoritative changelog entry before it is touched, and guessing a different version would be worse than leaving it. Flagged for a human with pulumi/pulumi release access. (The link on this line was changed to a site-relative path — see Link improvements — which does not bear on the claim.)findings-f9— Claim (c56): If a user provides any of the--loader,--import, or--requirearguments innodeargs, Pulumi will not automatically configure an ESM loader, and the us… — unverifiable (prior disposition: deferred as judgment-level — the cited tsx repo landing page says nothing about Pulumi'snodeargshandling) (this run: c54unverifiablelow at L327)unverifiable(low) this run for the same reason — the tsx link is an example pointer, and the opt-out behavior is Pulumi-internal. The sentence was rewritten for tense underfindings-f17with its logic unchanged; establishing whether the behavior is still accurate needs the Node.js language host source.Secondary sweep
tsconfig.jsonfile will be picked up by Pulumi" → "Pulumi picks up any options set in yourtsconfig.jsonfile" (also active voice); "This will tell Node.js to treat your package as an ESM package" → "This tells Node.js …"; "You will need to reference it in most Pulumi programs" → "Most Pulumi programs reference it". Trimmed three wordy openers: "If you would like full control" → "If you want full control", "If you would like to install them, you can use thedevtag" → "To install them, use thedevtag", "If you wish to instead use ESM natively, you can set" → "To use ESM natively instead, set". Dropped the first person at L36 ("We recommend using the latest LTS version" → "Use the latest LTS version"). Ran the lane's Vale fixpoint loop: round 1 surfaced one finding my own fix had created (write-good.TooWordyon "but it is compiled", the replacement for "but it will be compiled"), resolved by making the compiler the actor — "but the compiler emits CommonJS behind the scenes"; round 2 converged. One finding remains open after convergence:Pulumi.HeadingSentenceCasestill reports## Native ESM support(L280), because the rule reads theESMacronym as a capitalized non-initial word. The heading is correct sentence case and I am leaving it; the rule needs an acronym allowance instyles/Pulumi/, which is out of scope here..readthrough-findings.jsonitems, eachfix_class: local_repair. (1) self-redundancy, L86-215: the bundled-TypeScript-3.8.3-versus-package.jsonexplanation appeared in full under Languages and again nearly verbatim under TypeScript versions. The L86 copy is now a forward pointer ("Pulumi compiles TypeScript for you, and works with a range of compiler versions. See TypeScript versions … and Using TypeScript 7 …"), and the single full explanation lives under TypeScript versions. (2) prerequisite-inversion, L175-177: the note under Enabling async support referenced Native ESM Support and top-level await as if the reader had already met them, 100+ lines before either is defined. It is now a plain forward pointer ("Native ESM support, later on this page, describes an alternative to the export function pattern shown here: top-levelawait."). No heading levels, ordering, or sections changed beyond these.yaml,json,bash,typescript,javascript), the{{< chooser >}}/{{% choosable %}}pairs are balanced, and the twotsconfig.jsonexamples remain valid under the correctedfindings-f6prose ("target": "ES2022"satisfies "ES2017or later").Yarn Plug'n'Play,pnpm,Bun,npmare all already canonical.runtimeoptions link in the native-ESM note pointed at the absolutehttps://www.pulumi.com/docs/iac/concepts/projects/project-file/#runtime-options; changed to the site-relative canonical path/docs/iac/concepts/projects/project-file/#runtime-optionsper AGENTS.md. All 17 external URLs in.fetched-urls.jsonreturned 200 — no dead links. One observation, not changed: the page cites Bun at two different domains,https://bun.sh(L46) andhttps://bun.com/docs/…(L55). Both resolve 200 and I have no artifact evidence for which Bun considers canonical, so normalizing is left for a human.supported: truein.self-check-report.json: "for the best experience" (L36, where I only replaced "We recommend using" with "Use", keeping the clause as the page already had it) and "The default Pulumi templates" (L282, where "default" is a factual property of the templates, restated unchanged from the original sentence). Neither is a claim this run added, and no new superlative, ranking, or recommendation language was introduced anywhere. Also deliberately left in place: "The fastest way to get started with Pulumi and Node.js is to use a TypeScript template" (L92) — pre-existing, untouched, and no artifact in this run speaks to it.Screenshot check
No images. The page source references no screenshots, diagrams, or other content images (only the generic shared
meta_imagecard, if any), so there is nothing to verify. (Determined from the source; the screenshot pass was skipped.)Verification
make lint: ✅make lintre-verified by the workflow on6dd5b85.verified-claims.json: 69 verdict(s); 1 contradicted/mismatch, 8 unverifiable.vale-findings.json: 8 finding(s).readthrough-findings.json: ran=True, 2 finding(s).frontmatter-validation.json: 1 file(s); 0 alias collision(s)errorsfield.verify-glowup-scope.py):pass, churn 46 of 400 allowed, one changed path (the queued page), no protected-frontmatter changes.Pulumi.HeadingSentenceCaseon## Native ESM support, a rule limitation — see Style improvements).