Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions .claude/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,13 @@ Zoom publishes one spec per product area. `specs/*.json` are committed verbatim
- **Lint rules**: Biome `recommended`, plus `noConsole` as an error and `noExplicitAny` / `noTsIgnore` off. `noFloatingPromises` and `noMisusedPromises` are enabled **from nursery** — they are the reason this repo uses Biome's types domain at all, and they may shift behavior across Biome minor versions. Verify they still fire after a Biome upgrade.
- **Overrides** in `biome.json`: `scripts/**` allows `console` and `${}`-in-string (it is a code generator); `src/*.generated.ts` is formatted but not linted; `tsconfig*.json` is parsed as JSONC.
- **`files.maxSize` is raised to 4 MiB.** `src/types.generated.ts` is ~1 MiB and silently exceeds Biome's 1 MiB default, which would skip the largest file in the repo without failing.
- **TypeScript**: Strict mode, ESNext target, CommonJS output. `noImplicitAny` is off despite strict mode.
- **Tests**: Jest with SWC transform. Tests use `nock` for HTTP mocking. Coverage collected from `src/`.
- **TypeScript**: 6.0, strict mode, ESNext target, CommonJS output. `noImplicitAny` is off despite strict mode. Three settings are load-bearing and easy to break:
- **`types` must stay explicit** (`["node", "jest"]` in `tsconfig.json`, `["node"]` in `tsconfig-build.json`). TS 6 changed the `types` default from "every package in `node_modules/@types`" to `[]`. Remove it and you get `Cannot find name 'Buffer'`/`'AbortController'`/`'URL'` across the repo. The build config is narrower on purpose so Jest globals cannot leak into the published `.d.ts`.
- **`module: "node20"` + `moduleResolution: "node16"`** — TS enforces this pairing (TS5109). Deliberately *not* `nodenext`, whose meaning shifts between TS releases; `node20` has pinned semantics and matches the `engines.node: ">=22"` floor. The old `moduleResolution: "node"` (node10) is not merely deprecated in TS 6, it is no longer a valid value.
- **`rootDir` must be explicit** in `tsconfig-build.json`. TS 6 stopped inferring it from the input set and errors with TS5011 instead.
- **No `optionalDependencies`.** The block that pinned 12 `@swc/core-*` platform binaries was deleted deliberately: they were never loaded (`@swc/core` resolves its own nested binaries), and being *production* optional deps they shipped ~152 MB of unused native binaries to every consumer of this "zero-dependency" package. `@swc/core` is now an explicit devDependency so the native toolchain is pinned rather than floating on `@swc/jest`'s `*` peer range. Do not let a dependency bump reintroduce either.
- **`"prepare": "husky"` is what makes the pre-commit hook exist.** Without it husky never runs, `core.hooksPath` stays unset, and `.husky/pre-commit` is silently dead — which is exactly the state this repo was in until August 2026. Verify with `git config --get core.hooksPath` (must print `.husky/_`), and test the hook through a real `git commit`, not by running the script directly. Hook files are husky 9 style: no shebang, no `_/husky.sh` sourcing.
- **Tests**: Jest 30 with SWC transform. Tests use `nock` for HTTP mocking. Coverage collected from `src/`. Jest 30 removed the legacy matcher aliases, so use `toThrow()` (not `toThrowError()`), `toHaveBeenCalled()` (not `toBeCalled()`), and so on. Note that `moduleResolution: node16` makes TypeScript require a `.js` extension on relative *dynamic* `import()` specifiers (they are always ESM-mode), but Jest does not map `.js` back to `.ts` — so a test using one will not resolve at runtime without a `moduleNameMapper` entry. The only such import today is in a skipped test; add the mapping if you ever unskip it.

## Node Version

Expand Down
6 changes: 0 additions & 6 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -1,7 +1 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

# Check-only, deliberately not --write: Biome would fix files without
# re-staging them, so the commit would capture the unfixed version.
# Run `npm run lint:fix` when this fails.
npx biome check --staged --no-errors-on-unmatched
28 changes: 27 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,31 @@
# Changelog

## [1.1.0] - 2026-08-05

First stable release of the 1.1 line. It promotes `1.1.0-alpha.0` and
`1.1.0-alpha.1` unchanged — no API or behavior differences since `1.1.0-alpha.1` —
so the two sections below are the substance of this release.

Note for anyone upgrading from `0.0.4`, which was until now the newest stable
version: 1.0.0 was never published, so this is the first stable release to carry
its breaking changes. See the `[1.0.0]` section for the removed methods and the
migration table.

### Fixed

- Installing this package no longer downloads 12 unused `@swc/core-*` native
binaries. They were declared as production `optionalDependencies` pinned to a
version that nothing ever loaded — `@swc/core` resolves its own platform
binaries — so every install fetched roughly 150 MB of dead weight per platform
for a package that otherwise has no runtime dependencies.

### Changed

- The build now uses TypeScript 6. Emitted JavaScript and `.d.ts` files are
byte-identical to those produced by the previous TypeScript 5.5 build, so this
is invisible to consumers; it is recorded only because the compiler version
changed.

## [1.1.0-alpha.1]

### Fixed
Expand Down Expand Up @@ -107,7 +133,7 @@ Migration examples:
- Manual type definitions (now auto-generated)
- Legacy convenience methods

See README.md for detailed migration guide.
See [MIGRATION.md](./MIGRATION.md) for the detailed migration guide.

## 0.0.4

Expand Down
27 changes: 27 additions & 0 deletions MIGRATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Migration Guide

## 0.x to 1.0

Version 1.0.0 introduces breaking changes as we've transitioned to a pure OpenAPI-generated API:

**Removed convenience methods:**

- `zoomApi.me()` - removed; use `user('me').getUser()` (restored in 1.1.0), or other `user('me')` resource methods such as `user('me').listMeetings()`

**API Structure Changes:**

- Old: `meetings().list(userId)` → New: `user(userId).listMeetings()`
- Old: `meetings().create(userId, body)` → New: `user(userId).createMeeting(body)`
- Old: `meetings().get(id)` → New: `meeting(id).getMeeting()`
- Old: `meetings().recordings(id)` → New: `meeting(id).listRecordings()`
- Old: `meetings().transcript(url)` → New: `downloadTranscript(url)`
- Old: `pastMeeting(id).details()` → New: `pastMeeting(uuid).getPastMeeting()`
- Old: `pastMeeting(id).participants()` → New: `pastMeeting(uuid).listParticipants()`
- Old: `reports().meetings(userId)` → New: `report().listMeetings(userId)`
- `users().list()` is unchanged, but its response type is now `ZoomApi$Users$Response` (was `ZoomApi$Users$List`)

**Benefits of 1.0:**
- 250+ endpoints (vs ~15 in 0.x)
- Consistent method naming from OpenAPI spec
- Auto-regenerate when Zoom updates their API
- Better type safety with generated types
28 changes: 4 additions & 24 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,31 +194,11 @@ This will:
3. Generate API client methods in `src/zoomApi.generated.ts`
4. Format and lint the generated code

## Migration from 0.x to 1.0
## Migration

Version 1.0.0 introduces breaking changes as we've transitioned to a pure OpenAPI-generated API:

**Removed convenience methods:**

- `zoomApi.me()` - removed; use `user('me').getUser()` (restored in 1.1.0), or other `user('me')` resource methods such as `user('me').listMeetings()`

**API Structure Changes:**

- Old: `meetings().list(userId)` → New: `user(userId).listMeetings()`
- Old: `meetings().create(userId, body)` → New: `user(userId).createMeeting(body)`
- Old: `meetings().get(id)` → New: `meeting(id).getMeeting()`
- Old: `meetings().recordings(id)` → New: `meeting(id).listRecordings()`
- Old: `meetings().transcript(url)` → New: `downloadTranscript(url)`
- Old: `pastMeeting(id).details()` → New: `pastMeeting(uuid).getPastMeeting()`
- Old: `pastMeeting(id).participants()` → New: `pastMeeting(uuid).listParticipants()`
- Old: `reports().meetings(userId)` → New: `report().listMeetings(userId)`
- `users().list()` is unchanged, but its response type is now `ZoomApi$Users$Response` (was `ZoomApi$Users$List`)

**Benefits of 1.0:**
- 250+ endpoints (vs ~15 in 0.x)
- Consistent method naming from OpenAPI spec
- Auto-regenerate when Zoom updates their API
- Better type safety with generated types
Upgrading from 0.x? Version 1.0.0 replaced the hand-written convenience methods with a
pure OpenAPI-generated API. See the [migration guide](./MIGRATION.md) for the
old-to-new method mapping.

## Contribution

Expand Down
Loading
Loading