Skip to content

ci(publish): rename crates secret to CARGO_REGISTRY_TOKEN#37

Merged
WiktorStarczewski merged 1 commit into
mainfrom
wiktor/cargo-registry-token-rename
Apr 28, 2026
Merged

ci(publish): rename crates secret to CARGO_REGISTRY_TOKEN#37
WiktorStarczewski merged 1 commit into
mainfrom
wiktor/cargo-registry-token-rename

Conversation

@WiktorStarczewski
Copy link
Copy Markdown
Collaborator

Summary

  • Rename the secret reference in `publish-crates-release.yml` from `secrets.CRATES_IO_TOKEN` to `secrets.CARGO_REGISTRY_TOKEN` so the workflow picks up the org-managed secret directly.
  • The cargo env var is unchanged — it still has to be `CARGO_REGISTRY_TOKEN` (that's what cargo expects). Only the source secret name changes, removing the indirection.
  • Matches miden-node's convention.

Test plan

  • Confirm the org-level secret `CARGO_REGISTRY_TOKEN` is set on `0xMiden/web-sdk` (already done per reviewer feedback).
  • Next `release` event will exercise the renamed reference; until then this is a static-edit-only change with no other side effects.

Follow-up to #35 (which renamed the npm publish gate). PR #36 carries the same rename for `next`.

Match the secret name to the cargo env var (and to miden-node's
convention) so the publish-crates workflow picks up the org-managed
secret without an indirection.
@WiktorStarczewski WiktorStarczewski enabled auto-merge (squash) April 28, 2026 21:11
@WiktorStarczewski WiktorStarczewski merged commit c8502c6 into main Apr 28, 2026
31 checks passed
@WiktorStarczewski WiktorStarczewski deleted the wiktor/cargo-registry-token-rename branch April 28, 2026 21:15
@WiktorStarczewski WiktorStarczewski mentioned this pull request Apr 28, 2026
4 tasks
WiktorStarczewski added a commit that referenced this pull request Apr 28, 2026
* docs: import 5 web-SDK-relevant planning docs from miden-client (#14)

* docs: import planning docs from miden-client (web SDK ones)

Per @SantiagoPittella's review on miden-client #1992: 5 of the 13
stray planning .md files at the miden-client repo root are web-SDK-
relevant — they belong here, not in the Rust client repo. Importing
under docs/planning/ with an index README that calls out their
snapshot-not-maintained status.

  AGENTS.md
  Api.Rework.Impl.md
  REACT_SDK_PLAN.md
  SimplifiedAPI.md
  SimplifiedAPI.sdk.review.md

The miden-client side (#1992 commit e20e6261a) deletes all 13 stray
docs; the other 8 are either already-tracked issues, stale, or non-
client concerns and don't need to be ported.

* docs: keep only AGENTS.md from imported planning docs

* ci: replace paths-ignore with intra-job filter so docs-only PRs aren't blocked by required checks that never run

* chore(react-sdk): align eslint + typescript-eslint deps with root overrides (#16)

* chore: add .nvmrc + lefthook + lint-staged for local dev hygiene (#19)

* chore: add .nvmrc + lefthook + lint-staged for local dev hygiene

* chore: fix lefthook config — drop broken per-file tsc, use pnpm exec, guard prepare

* chore(web-client): drop mocha/chai/puppeteer/esm/ts-node devDeps (#18)

* chore(web-client): swap chai expect for @playwright/test expect

* chore(web-client): swap puppeteer Page type for @playwright/test

* chore(web-client): drop mocha/chai/puppeteer/esm/ts-node devDeps + .mocharc.json

The legacy mocha-based Playwright wiring has been fully replaced by
@playwright/test (assertions) and vitest (unit tests). Remove the dead
test infrastructure:

- crates/web-client/.mocharc.json (deleted)
- crates/web-client/tsconfig.json: drop the "ts-node" block
- crates/web-client/package.json devDependencies removed:
  - mocha
  - chai
  - puppeteer
  - esm
  - ts-node
- pnpm-lock.yaml regenerated

Verified: pnpm --filter @miden-sdk/miden-sdk run test:unit passes
(295 tests across 13 files).

* chore(deps): bump miden-client on `main` to 0.14.5 (#34)

* chore(deps): bump miden-client to 0.14.5

Bumps the workspace miden-client dependency on `main` from 0.14.0 (locked
at 0.14.4) to 0.14.5, the latest 0.14.x patch on crates.io. No API
changes required on the web-sdk side — same minor line, just patch-level
updates from upstream miden-client.

The `next` branch separately tracks miden-client `next` (0.15.0
unreleased) and is unaffected by this bump.

* docs: clarify lazy entry — SSR / controlled WASM init, not 'most users skip crypto'

The previous README framing of `@miden-sdk/miden-sdk/lazy` as for 'apps
where most users never touch crypto' is misleading. The actual point of
the lazy entry is to allow usage in environments that hang on top-level
await (Next.js / SSR, Capacitor WKWebView) or where the caller wants to
explicitly control when the WASM-init cost is paid.

Also adds the missing `await MidenClient.ready()` contract: until you
call it, every wasm-bindgen type imported from the lazy entry is just a
stub that throws on construction. Async SDK methods await internally
and are exempt.

* docs: add React-side lazy guidance — gate UI on isReady from useMiden()

Apps using @miden-sdk/react with the lazy entry don't call
MidenClient.ready() directly; MidenProvider does it for them and
exposes the readiness state through useMiden() as { isReady,
isInitializing, error }. Adds the contract + a minimal example,
plus pointers to the loadingComponent / errorComponent provider
props for the zero-glue case.

* chore(ci): add publint + attw gates and fix exports maps (#15)

* chore(ci): add publint + arethetypeswrong gates for published packages

Adds publint and @arethetypeswrong/cli as root devDeps and wires three
new scripts:
- check:publint   - runs publint per published workspace package
- check:attw      - runs attw --pack . per published workspace package
- check:publish   - builds web-client, react-sdk, vite-plugin then runs
                    both gates

Filters target the three publishable packages by name
(@miden-sdk/miden-sdk, @miden-sdk/react, @miden-sdk/vite-plugin), which
skips the private web_store workspace member that has no exports map
worth checking.

A new workflow (.github/workflows/check-publish.yml) runs check:publish
on PRs and pushes to main/next. It mirrors the WASM build setup from
test.yml's build-web-client-dist-folder job (Rust toolchain, sccache,
binaryen, Swatinem/rust-cache) and uses MIDEN_FAST_BUILD on the WASM
build since publint/attw inspect package shape and types, not the
optimization level of the WASM blob.

Mode: STRICT. Per the task rule (document only if both tools find > ~3
issues per package; otherwise leave strict), only @miden-sdk/miden-sdk
clearly clears that bar - the other two packages have <= 1 attw issue
and 1 publint warning each, so a doc-and-tolerate path would be
overkill. The CI gate will be red on first PR; the author should decide
whether to fix the underlying export map issues or merge red.

Local results today (built with MIDEN_FAST_BUILD=true):

publint (exit 0 - warnings/suggestions only):
- @miden-sdk/miden-sdk:    1 suggestion  (pkg.browser refactor)
- @miden-sdk/react:        1 warning + 2 suggestions
                           (types ambiguous under "import" condition;
                            missing "type" field; repository.url shape)
- @miden-sdk/vite-plugin:  1 warning + 2 suggestions (same shape as react)

attw (exit 1 - real failures):
- @miden-sdk/miden-sdk:    CJSResolvesToESM, InternalResolutionError
                           across multiple matrix cells, NoResolution
                           on the /lazy subpath under node10
- @miden-sdk/react:        FalseCJS (masquerading-as-CJS) under node16
                           from-ESM for both . and /lazy; NoResolution
                           on /lazy under node10
- @miden-sdk/vite-plugin:  FalseCJS under node16 from-ESM

Per task scope, no source or build-config changes were made to address
these - the gate ships first, the fixes are followup work.

* chore(miden-sdk): fix exports map for attw + publint compliance

- Split the `exports` conditions into explicit `import` blocks with
  `types` listed first, eliminating the ambiguous-types warning publint
  reported. Drop the implicit `default` fallthrough that caused
  attw to flag CJSResolvesToESM under the node16-cjs profile.
- Add an `.attw.json` selecting the `esm-only` profile. The package is
  `"type": "module"` and ships only ESM artifacts (rollup output +
  WASM glue); `require()` consumers must already use a dynamic import.
  The `esm-only` profile communicates this intent to attw and makes
  the node10 / node16-cjs columns informational only.
- Add a post-build step (`scripts/post-build.js`) that:
    1. Rewrites extensionless relative specifiers in the published
       `dist/*.d.ts` files (e.g. `from "./api-types"` ->
       `from "./api-types.js"`). Without explicit extensions, Node16
       type resolution flags an `InternalResolutionError` on every
       relative import inside `dist/index.d.ts` and `dist/api-types.d.ts`.
    2. Emits a `lazy/package.json` shim at the package root pointing at
       `dist/index.{js,d.ts}` so node10 resolution (which doesn't read
       `exports`) can still locate `@miden-sdk/miden-sdk/lazy`.
- Add `lazy` to the `files` array so the shim ships in the tarball.
- Expose `./package.json` from `exports` to keep tooling that reads
  the manifest at runtime working under strict resolution.

Public import paths (`@miden-sdk/miden-sdk` and
`@miden-sdk/miden-sdk/lazy`) are unchanged. Verified that the
existing vitest unit suite (295 tests) still passes against the new
build output.

* chore(react-sdk): fix exports map for attw + publint compliance

- Split each `exports` subpath into explicit `import` / `require`
  conditions with `types` listed first. publint flagged the previous
  shape because `types: "./dist/index.d.ts"` resolved as CJS under the
  `import` condition (FalseCJS / ambiguous-types). The new shape uses
  the `.d.mts` declaration tsup already emits for the ESM build, so
  TypeScript sees an `.mts` declaration when resolving via `import`
  and a `.d.ts` declaration when resolving via `require`.
- Add `"type": "commonjs"` to silence publint's package-type-detection
  suggestion (tsup emits `.js` as CJS and `.mjs` as ESM, matching).
- Add a `lazy/package.json` shim at the package root that points at
  `dist/lazy.{js,mjs,d.ts}`. node10 resolution doesn't read the
  `exports` map, so `@miden-sdk/react/lazy` previously failed to
  resolve under that column; the shim is the standard fix.
- Expose `./package.json` from `exports` and add `lazy` to the `files`
  array so the shim ships in the tarball.

Public import paths (`@miden-sdk/react` and `@miden-sdk/react/lazy`)
are unchanged. Verified that the existing vitest unit suite (719
tests) still passes.

* chore(vite-plugin): fix exports map for attw + publint compliance

- Split the `exports["."]` block into explicit `import` / `require`
  conditions with `types` listed first. publint flagged the previous
  shape because `types: "./dist/index.d.ts"` was interpreted as CJS
  when resolving via the `import` condition (FalseCJS / ambiguous
  types under `import`). The new shape uses the `.d.mts` declaration
  tsup already emits for the ESM build, so TypeScript sees an
  `.mts` declaration when resolving via `import` and a `.d.ts`
  declaration when resolving via `require`.
- Add `"type": "commonjs"` to silence publint's package-type-detection
  suggestion (tsup emits `.js` as CJS and `.mjs` as ESM, matching).

Public import path (`@miden-sdk/vite-plugin`) is unchanged. Verified
the existing vitest suite (27 tests) still passes.

* chore(react-sdk): drop CJS output, ship ESM-only

* chore(web-client): deduplicate lazy/package.json shim

* chore(ci): prettier-format post-build.js

* chore(react-sdk): rename CJS configs to .cjs after ESM-only flip

Switching @miden-sdk/react to "type": "module" makes .js files ESM by
default, which breaks two CJS-syntax files:
- packages/react-sdk/eslint.config.js (uses module.exports + require())
- packages/react-sdk/test/serve-tests.js (uses require())

Renamed both to .cjs. Updated playwright.config.ts:34 to reference the
new filename. ESLint auto-discovers either extension; no other consumer
references the renamed paths.

* chore: add vitest workspace + root test script (#21)

* chore: add vitest workspace + root test script

* chore(vitest): migrate from defineWorkspace to defineConfig projects (vitest 3 modern shape)

* chore(ci): exclude root vitest.config.ts from eslint typed-linting

* chore: add knip in strict mode (53 baseline findings cleared) (#17)

* chore: add knip for unused-exports/deps detection

Lands knip 6.7.0 plus a baseline knip.jsonc config covering the four
TS-bearing workspaces (`packages/react-sdk`, `packages/vite-plugin`,
`crates/web-client`, `crates/idxdb-store/src`) and a root scripts entry.

Mode: warning-only. The script is `knip --no-exit-code` so CI does not
go red on day-one findings; promoting to strict mode is a follow-up
once the baseline backlog is cleared.

Baseline findings (pnpm run check:knip, exit 0 in --no-exit-code):

  Unused files          4   (3 are .d.ts ambient declarations in
                              crates/web-client/js/types/, plus
                              packages/react-sdk/src/__tests__/utils/test-utils.tsx)
  Unused dependencies   3   (root prettier; web-client @rollup/plugin-typescript, dexie)
  Unused devDeps        5   (root and idxdb-store @typescript-eslint/eslint-plugin;
                              web-client http-server + mocha;
                              react-sdk http-server)
  Unlisted dependency   1   (web-client test references @aspect-build/aspect-rsdoctor)
  Unlisted binary       1   (vite in .github/workflows/wallet-pages.yml)
  Unresolved imports    4   (web-client tests import ./eager.js / ./index.js
                              relative paths — likely dist-time URLs)
  Unused exports       23   (all in packages/react-sdk test mocks)
  Unused exported types 9   (react-sdk SignerContext + types/index.ts re-exports)
  Duplicate exports     3   (playwright.global.setup.ts; react-jsx-runtime.js;
                              vite-plugin index.ts midenVitePlugin|default)

Per-workspace tally:
  root                       1 dep, 1 devDep
  packages/react-sdk         1 file, 1 devDep, 23 exports, 9 types, 1 dup-export
  packages/vite-plugin       1 dup-export
  crates/web-client          3 files, 2 deps, 2 devDeps, 1 unlisted dep,
                             1 unlisted bin, 4 unresolved imports, 1 dup-export
  crates/idxdb-store/src     1 devDep

No CI workflow added in this commit — that lands separately once the
baseline is cleaned up. No source code modified.

* chore(web-client): drop dead @aspect-build import in sync_lock test

The 'waiters are rejected when sync times out' test destructured
acquireSyncLock/releaseSyncLock/releaseSyncLockWithError from a stale
@aspect-build/aspect-rsdoctor path that has nothing to do with this
codebase, then immediately fell back to nulls and never used the
bindings. The only thing actually exercised below is client.syncState(),
so the destructuring + bogus import was pure dead code.

Flagged by knip as the sole 'unlisted dependency' import in
crates/web-client; removing the dead block both fixes the finding and
makes the test honest about what it's checking.

* chore: drop unused devDeps + deps flagged by knip

Removes packages that no source file, build config, lint config, test, or
script references. Verified each by grepping the repo for imports / CLI
invocations / config references before deletion.

- root: @typescript-eslint/eslint-plugin (root eslint.config.js wires
  parser only; no plugin-rules block, so the plugin pkg sits idle)
- crates/idxdb-store/src: @typescript-eslint/eslint-plugin (its
  eslint.config.mjs uses 'typescript-eslint' meta-package, not the
  legacy plugin)
- packages/react-sdk: http-server (no script or workflow runs it)
- crates/web-client: http-server, mocha (rollup + playwright + vitest
  pipeline does not invoke either; no .mocharc, no http-server script)
- crates/web-client deps: @rollup/plugin-typescript (rollup.config.js
  uses node-resolve + commonjs + wasm-tool only — no TS plugin), dexie
  (only the idxdb-store crate uses dexie, and it lists its own copy)

Lockfile regenerated via pnpm install --no-frozen-lockfile.

* chore: drop unused files + dead exports flagged by knip

react-sdk:
- Delete src/__tests__/utils/test-utils.tsx — exports renderWithProvider,
  renderHookWithProvider, etc., none of which any test imports. The repo
  uses renderHook/render directly from @testing-library/react.
- Strip 'export' off internal mock helpers and types in __tests__/mocks/
  (createMockOutputNote, createMockTransactionRecord, MockNoteFilter and
  ~17 other Mock* constants, MockWebClientType, createMockSignCallback,
  createMockAccountStorageMode). They were never imported across module
  boundaries; making them module-private is correct.
- Delete the createMockSdkModule factory along with the Mock* class /
  enum constants that only existed to populate it. No test in the repo
  ever called the factory, so it pulled an entire wing of dead code.
- Remove unreachable type re-exports: GetKeyCallback / InsertKeyCallback
  / NoteId / NoteVisibility / StorageMode were re-exported through
  src/types/index.ts but src/index.ts never re-exported them, so they
  were not part of the package's public surface. The underlying types
  stay locally-typed where they're actually used.
- Make ClientWithTransactions in src/utils/transactions.ts module-private
  (the noteFilters.ts copy is the one consumers use).

web-client:
- Delete crates/web-client/.mocharc.json (only consumer was mocha, which
  was removed in the previous commit) and the matching ts-node /
  esm devDeps + the now-orphan ts-node block in tsconfig.json.

Public API of @miden-sdk/react is unchanged: every type still exported
through src/index.ts continues to be exported. Only types that were
never reachable through the package entry have been demoted.

* chore(knip): allowlist public-API exports + ambient .d.ts files

After deleting actual dead code, the remaining findings are all cases
where knip can't statically see the consumer:

- crates/web-client/js/types/{index,api-types,docs-entry}.d.ts: shipped
  as the package's published types via 'cpr js/types dist' in the build
  script, so they ARE the consumer of themselves at publish time.
  Registered as entry points with a comment naming the post-build copy
  step.
- ./eager.js, ./index.js: dynamic imports inside page.evaluate()
  callbacks, executed in the browser against http://localhost:8080
  (i.e. the dist/ output served by the test http server). Resolved at
  test runtime, not relative to the Playwright test file. Allowlisted
  via ignoreUnresolved with a comment.
- ./crates/miden_client_web: wasm-bindgen module emitted into dist/ by
  the rollup rust plugin; the .d.ts files reference it but it doesn't
  exist until after build. Same allowlist with a comment.
- prettier: invoked from the repo Makefile via 'pnpm exec prettier .';
  knip doesn't scan Makefile rules. Allowlisted in ignoreDependencies.
- vite: invoked from .github/workflows/wallet-pages.yml via 'pnpm exec
  vite build' inside the wallet example workspace, which has its own
  package.json + lockfile not visible to this monorepo's graph.
  Allowlisted in ignoreBinaries.
- Three intentional dual-export sites (vite plugin named+default, the
  Playwright test fixture's named+default 'test', and the React JSX
  runtime shim's jsx/jsxs/jsxDEV aliases): rules.duplicates set to
  'off' globally with a comment enumerating each case so a future
  change knows when to revisit it.

Also dropped the redundant entry patterns and the empty docs/** ignore
patterns that knip flagged as configuration hints.

After this, 'pnpm exec knip' exits 0 with zero findings; the 3 remaining
'configuration hints' are about react-sdk's package.json exports
pointing at not-yet-built dist/lazy.* files, which is correct and
doesn't affect the exit code.

* chore(knip): flip check:knip to strict mode

All baseline findings have been triaged in the preceding commits, so the
warning-only flag is no longer needed. Knip now fails CI on any new
unused export / dep / file / unresolved import.

* chore(ci): wire knip into lint workflow

* chore(ci): restore dexie + prettier-format knip files

Knip's static scan flagged dexie as unused, but it's bundled into the
web-client test page at runtime via rollup — page.evaluate blocks load
the bundle from localhost:8080 which transitively imports dexie. The
removal broke 22 integration tests with "Failed to resolve module
specifier 'dexie'". Re-added dexie@^4.0.1 to crates/web-client deps
and registered it in knip's top-level ignoreDependencies with a comment.

Also runs prettier --write on knip.jsonc and two react-sdk source
files that were missed in the earlier cleanup pass.

* chore(knip): allowlist publint/attw + .cjs serve-tests rename

* chore: drop stylistic eslint rules; let prettier own formatting (#20)

Removes overlapping formatting rules (semi, comma-dangle, eol-last,
space-before-blocks, keyword-spacing, no-multiple-empty-lines) from the
root eslint.config.js so Prettier 3.x is the single source of truth for
style. Logic rules (camelcase, @typescript-eslint/no-unused-vars) are
preserved.

Adds eslint-config-prettier as the last entry in both flat configs
(eslint.config.js and packages/react-sdk/eslint.config.js) to disable
any remaining stylistic rules pulled in transitively from rule presets,
preventing eslint and prettier from fighting.

Extends .prettierignore to mirror the eslint configs' ignore list (dist,
target, node_modules, generated .d.ts, docs, idxdb-store codegen) so
prettier --check stays scoped to source we actually own. The existing
.prettierrc.json (trailingComma: es5) is left as-is.

Verified: pnpm --filter @miden-sdk/react run lint shows 0 errors (same
5 pre-existing warnings as main); prettier --check on packages/react-sdk
and packages/vite-plugin source passes with no reformatting needed.

* ci: publish react-sdk and vite-plugin alongside web-client on release (#35)

The pre-split miden-client release workflow shipped all three packages on
a tagged release; the web-sdk port dropped react-sdk and vite-plugin
publishing while keeping web-client. End users `npm install
@miden-sdk/react` were therefore stuck on the `next` dist-tag (set by
publish-web-client-next.yml) instead of getting the latest tagged release.

This restores parity with pre-split behaviour:

- New scripts/check-react-sdk-version-release.sh and
  scripts/check-vite-plugin-version-release.sh — same pattern as the
  existing check-web-client-version-release.sh (compare package.json
  version against the tagged commit's parent, set should_publish flag).

- publish-web-client-release.yml now runs each package's version-bump
  check and conditionally builds + publishes that package. The three
  publishes are independent, so a release that bumps only one package
  republishes only that one.

- The web-client build runs whenever EITHER web-client OR react-sdk needs
  to ship, since react-sdk's build consumes the WASM dist.

* ci(publish): rename crates secret to CARGO_REGISTRY_TOKEN (#37)

Match the secret name to the cargo env var (and to miden-node's
convention) so the publish-crates workflow picks up the org-managed
secret without an indirection.

* docs: add top-level CLAUDE.md, refresh react-sdk usage guide, drop stale AGENTS (#38)

- Add a top-level CLAUDE.md aimed at AI agents (and humans skimming
  for build/lint/test/release conventions). Captures pnpm-only rule,
  the Makefile-driven workflows, runExclusive, the eager/lazy entry
  contract, the npm-registry-driven publish gate, and cross-repo
  coordination notes. The README already links to it (line 337).
- Refresh packages/react-sdk/CLAUDE.md against the current source:
    * useNotes returns notes/consumableNotes (not input/consumable)
    * useAccounts returns accounts/wallets/faucets (no 'all')
    * Mutation hooks expose action-named callbacks (send, mint, ...)
      and a 'result' field — not generic { mutate, data }
    * useSend / useMultiSend take assetId / recipients (not faucetId
      / outputs)
    * SendResult has txId (not transactionId)
    * SignerAccountConfig uses publicKeyCommitment + accountType
    * Hook reference table reorganized into query/mutation buckets
      and includes the previously-undocumented hooks (useNoteStream,
      useSyncControl, useTransactionHistory, useImportNote / Export*,
      etc.)
- Remove docs/planning/AGENTS.md — 7 lines of miden-client leftover
  that referenced 'yarn prettier' (the repo migrated to pnpm). All
  the still-useful content is now in the top-level CLAUDE.md.

* Wire eager/lazy split into next's web-client (preserve napi node entry)

Follow-up on the merge: bring main's eager/lazy entry-point split to
next without dropping next's napi-rs Node.js binding.

Conflicts in the original merge of #39 left the lazy/ subpath stub and
post-build.js orphaned (auto-merged from main but not reachable through
next's exports map). This commit wires them up by:

- Recreating crates/web-client/js/eager.js. Same wrapper as main: at
  module top level, await getWasmOrThrow() then re-export * from
  ./index.js. (The file existed on main; PR #13's import of miden-client
  next overwrote next's tree wholesale and the eager wrapper was lost.)
- Adding ./js/eager.js to rollup.config.js's input list so the build
  emits dist/eager.js alongside dist/index.js.
- Rewriting crates/web-client/package.json's exports map to combine
  next's napi node entry with main's eager/lazy split:
    ".":     node → ./js/node-index.js   (napi binding for Node.js)
              import.default → ./dist/eager.js   (browser default, TLA)
    "./lazy": import.default → ./dist/index.js  (browser SSR/Capacitor)
- Wiring node ./scripts/post-build.js into the build chain (was
  auto-merged from main but not invoked) so dist's .d.ts files get
  the relative-import extension fixups attw / publint require.
- Dropping packages/react-sdk/lazy/package.json. The orphan stub was
  auto-merged from main but next's react-sdk doesn't expose a /lazy
  subpath in its package.json yet — adopting that requires also flipping
  the react-sdk source to import from `@miden-sdk/miden-sdk/lazy` and
  reintroducing the tsup config with the eager-rewrite hook. Out of
  scope here; tracked as a separate follow-up.

Smoke-tested locally: `pnpm --filter @miden-sdk/miden-sdk run build`
emits dist/eager.js (4.4KB wrapper) and dist/index.js (108KB lazy
bundle) in 2m30s; post-build rewrites 3 .d.ts files.

* fix(ci): drop unused deps + tighten exports for publint/attw + knip

Three CI gates that landed via the merge from main now run cleanly on next.

knip (unused-deps/exports):
- crates/web-client/package.json: remove chai, esm, http-server, mocha,
  puppeteer, ts-node, @rollup/plugin-typescript (web-client doesn't run
  vitest itself; tests are Playwright-only).
- packages/react-sdk/package.json: bump @typescript-eslint/* to ^8 and
  eslint to ^9 (matches root); drop http-server.
- crates/idxdb-store/src/package.json: drop @vitest/coverage-v8 (root
  vitest workspace owns coverage).
- knip.jsonc: refresh crates/web-client entry patterns for next's
  layout (add storageView.js, js/node/**; drop safe-arrays.js and
  js/__tests__/ that don't exist on next). Drop ./eager.js from
  ignoreUnresolved (the file now exists). js/node-index.js is auto-
  detected via the package.json 'node' exports condition; remove the
  redundant entry.
- napi-compat.js: drop the export keyword on internal-only helpers
  (wrapClass, patchSdkPrototypes, makeArrayPolyfills) — they're used
  inside the file but not imported by any consumer.
- test/node-adapter.ts: drop export on sdk + MockWasmWebClient (used
  internally by setupNodeGlobals + WasmWebClient wrappers, not by any
  test).
- test/test-setup.ts: drop export on createNodeMockClient + createNode
  SdkWrapper (used internally by the test fixture factories).
- test/test-helpers.ts: delete integrationMint + integrationConsume
  (intended as test helpers but no callers — ressurect from git history
  if a future test needs them).
- packages/react-sdk/src/store/MidenStore.ts: delete useClient,
  useIsReady, useInitError, useConfig selectors — never imported (the
  test that name-checked 'useClient'/'useIsReady' actually exercises
  state via getState(), not the hook).

publint + attw:
- crates/web-client/package.json: split the 'node' exports condition
  into a {types, default} pair pointing at dist/index.d.ts so attw +
  publint stop flagging the napi entry as type-less.
- packages/react-sdk/package.json: split exports into separate import
  + require conditions, each with its own types entry, so node16-from-
  ESM resolution stops 'masquerading as CJS' (attw 🎭).

pnpm-lock.yaml: regenerated against the cleaned package.jsons.

* fix(ci): re-add @vitest/coverage-v8 to idxdb-store, ignore in knip

Knip flagged @vitest/coverage-v8 as unused because vitest loads it
dynamically at runtime when --coverage is passed; knip's static scan
can't see the dependency. Removing it broke 'idxdb-store unit tests'
on CI with ERR_MODULE_NOT_FOUND.

Add it back, mark it as ignoreDependencies in knip's per-workspace
config for crates/idxdb-store/src.

* fix(idxdb-store): restore vitest coverage config (lets knip auto-discover @vitest/coverage-v8)

Cleaner replacement for the previous knip ignoreDependencies workaround.

The previous fix re-added @vitest/coverage-v8 to package.json and
manually told knip to ignore it. That worked but was the wrong layer:
knip's vitest plugin reads vitest.config.ts and discovers any provider
referenced under coverage.provider as a real dep. Main's idxdb-store
config has `coverage: { provider: 'v8', ... }`; next's was stripped
to bare environment+setupFiles when PR #13 imported miden-client next,
so knip lost sight of the dep entirely.

Restore the coverage block — provider, reporters, include/exclude —
which gives knip its static reference and also produces a real
coverage report on every CI run. Keep the threshold field empty for
now: next has napi additions (notes.ts, settings.ts, sync.ts,
transactions.ts, etc.) at ~0% coverage that main's 95/95/95/95 gate
would reject. Backfilling those tests is tracked separately; once
covered we ratchet next up to match main.

* test(idxdb-store): port main's full test suite + restore 95% coverage gate

Bring next's idxdb-store/ts/ test coverage in line with main's:

- 7 test files were missing entirely on next (auth.test.ts,
  export.test.ts, import.test.ts, settings.test.ts, sync.test.ts,
  transactions.test.ts, utils.test.ts) — port verbatim from main; the
  underlying source files are byte-identical between branches.
- 4 test files (accounts, chainData, notes, schema) were thinner on
  next than main — overwrite with main's versions.
- chainData.test.ts: patch the 3 pruneIrrelevantBlocks call sites for
  next's expanded signature (dbId + blocksToUntrack[] + nodeIdsToRemove[]
  vs main's single dbId arg). Add two new tests for the napi-only
  pruning paths (untrack-then-prune, MMR-node deletion).
- Restore the 95/95/95/95 thresholds in vitest.config.ts that PR #13
  inadvertently dropped when it imported miden-client next into web-sdk
  next.

Result: 298 tests pass, coverage 99.88%/97.63%/100%/99.88%
(lines/branches/funcs/stmts) — clears the 95% gate on every metric.
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