Skip to content

Fixes: nodenext type resolution, Bun compatibility, snapshot status polling#29

Open
karaposu wants to merge 3 commits into
brightdata:devfrom
karaposu:dev
Open

Fixes: nodenext type resolution, Bun compatibility, snapshot status polling#29
karaposu wants to merge 3 commits into
brightdata:devfrom
karaposu:dev

Conversation

@karaposu

@karaposu karaposu commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Three independent fixes:

  • fix(types): author .js on relative imports so shipped .d.ts resolve under node16/nodenext (was TS2834 / silent any); adds a build-time smoke over the built ESM/CJS output
  • fix(bun): capability-detect undici interceptors — Bun (omits dns) no longer crashes the Transport constructor; Node unchanged
  • fix(polling): accept unknown snapshot statuses (e.g. starting) so the poll loop doesn't throw mid-run

Verification: sanity + build + built-package smoke clean; 351/351 unit tests; nodenext verified in a real consumer on both import and require.

karaposu added 3 commits July 1, 2026 13:04
SnapshotStatusResponseSchema validated the /datasets/v3/progress status
field against a fixed list (running|ready|failed|cancelled|error). The
API owns this vocabulary and emits values the SDK had not enumerated
(e.g. "starting"), so Zod validation threw and killed the polling loop —
affecting every async platform scraper.

Validate the status field by shape (a non-empty string) instead of
membership. pollUntilReady already acts only on terminal states, so
unknown lifecycle values flow through and polling continues; malformed
responses are still rejected.

Also fix an adjacent bug in the same path: "cancelled" was not treated
as terminal, so a cancelled snapshot polled until timeout instead of
stopping.

Adds regression tests for unknown/empty/non-string status and for the
cancelled terminal case.
…ta#24)

Bun's bundled undici omits the optional `dns` interceptor, so composing the dispatcher chain called `dns()` and threw "dns is not a function", crashing the Transport constructor at client init on Bun.

Detect each interceptor by capability (typeof === 'function') and compose only those the runtime provides. On Node this is unchanged (dns + retry present); on Bun `dns` is skipped (undici falls back to the platform resolver, requests still work), and it self-retires if Bun later ships dns.
…resolution

Shipped declarations used extensionless relative imports (e.g. `export { bdclient } from './client'`), which node16/nodenext resolution rejects (TS2834), silently degrading the SDK's public types to `any` for consumers on those modes. They resolved only under moduleResolution:bundler — the mode the declaration build itself used.

Author explicit `.js` on every relative specifier in src/ (551 across 184 files) so tsc emits nodenext-resolvable .d.ts under the existing build; `.js` still resolves to `.ts` under bundler and rollup, so the JS bundle and typecheck are unchanged.

Add scripts/smoke-dist.mjs (wired into `build`): it loads all four entry points in both ESM and CJS from the built dist/ and constructs the client, so a broken emitted specifier fails the build instead of shipping. scripts/add-js-extensions.mjs is the AST codemod that applied the change.

Verified in a nodenext consumer project (skipLibCheck:false): no TS2834, and real types resolve on both the import and require paths.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant