@keboola/api-client-react 25.0.0 → 31.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md ADDED
@@ -0,0 +1,138 @@
1
+ # @keboola/api-client-react
2
+
3
+ React bindings for [`@keboola/api-client`](../api-client/AGENTS.md). Owns
4
+ the context that holds the typed `ApiClient` instance and the hooks for
5
+ consumers to read it.
6
+
7
+ ## Why a separate package
8
+
9
+ `@keboola/api-client` is framework-agnostic (used from Node, tests, scripts).
10
+ Keeping React-specific glue out of it lets the SDK stay deployable to
11
+ non-React surfaces. This package is the **only** place that knows about
12
+ `React.Context`.
13
+
14
+ ## Surface
15
+
16
+ ```ts
17
+ import {
18
+ ApiClientProvider,
19
+ AuthProvider,
20
+ LegacyAuthProvider,
21
+ useApiClient,
22
+ useAuth,
23
+ useLegacyAuth,
24
+ useProject,
25
+ useStack,
26
+ } from '@keboola/api-client-react';
27
+ ```
28
+
29
+ A keboola client is `{ api, session }`. This package provides the two halves separately:
30
+
31
+ - `ApiClientProvider` — takes the flow-agnostic `api` and provides it to descendants. A pure
32
+ pass-through: no lifecycle, no fallback. `useApiClient()` returns that `api`.
33
+ - `LegacyAuthProvider` — takes a **legacy** `session` (+ `baseUrl`, `storageToken`,
34
+ optional `managementToken`). On mount it drives the session to ready
35
+ (`setBaseUrl` → `authenticateManagement?` → `authenticateStorageAsync`) and renders `fallback`
36
+ until `session.isStorageReady()`. Exposes the session via `useLegacyAuth()`.
37
+ - `AuthProvider` — takes a **bearer** `session` (+ `baseUrl`, optional `onAccessTokenChange`). The
38
+ bearer twin of `LegacyAuthProvider`. On mount it configures the stack and `restore()`s any
39
+ persisted session, then runs one of two modes, discriminated by whether a credential is supplied:
40
+ - **programmatic** — `credential` + `projectId` given; it drives itself to ready.
41
+ - **interactive** — neither given; the session starts unscoped and only the consumer can scope it,
42
+ so `anonymousFallback` is **required** by the type in this mode. Which slot actually renders at
43
+ any moment is the table below — restoring and bootstrapping take `loadingFallback` first.
44
+
45
+ It renders exactly one of four slots, by state:
46
+
47
+ | State | Renders |
48
+ | --------------------------------- | ------------------- |
49
+ | scoped + storage build ready | `children` |
50
+ | storage build failed | `errorFallback` |
51
+ | restoring / bootstrapping | `loadingFallback` |
52
+ | not yet scoped (interactive only) | `anonymousFallback` |
53
+
54
+ "Not yet scoped" is **not** the same as "signed out": the storage build sits at `idle` both for an
55
+ anonymous visitor and for an authenticated one with no project selected (zero projects, or just
56
+ used "Leave project"), and both land in `anonymousFallback`. Consumers that need to tell the two
57
+ apart have to read the session status themselves.
58
+
59
+ `children` may be a function — it is called only in the ready state and receives the scoped
60
+ `{ projectId, baseUrl }`, so consumers don't re-narrow the session state themselves:
61
+
62
+ ```tsx
63
+ <AuthProvider session={session} baseUrl={url} anonymousFallback={<Login />}>
64
+ {({ projectId }) => <App projectId={projectId} />}
65
+ </AuthProvider>
66
+ ```
67
+
68
+ `onAccessTokenChange` fires with the access token on the initial credential and after every
69
+ in-band rotation, so the host can mirror it (e.g. into a token store). Exposes the session via
70
+ `useAuth()`.
71
+
72
+ - `useApiClient()` — returns the `api`; **throws** outside `<ApiClientProvider />`. Use it from
73
+ query/mutation hooks.
74
+ - `useProject()` / `useStack()` — shortcut hooks for `api.context.project` / `api.context.stack`.
75
+ Same null-throwing contract.
76
+
77
+ Nesting: mount the auth provider outermost (it owns drive-to-ready) with `ApiClientProvider` inside
78
+ it, so product code only mounts once the `api` is ready:
79
+
80
+ ```tsx
81
+ <LegacyAuthProvider session={session} baseUrl={url} storageToken={token} fallback={<Loading />}>
82
+ <ApiClientProvider api={api}>{children}</ApiClientProvider>
83
+ </LegacyAuthProvider>
84
+ ```
85
+
86
+ For credential verification (dev login, project switching) there is no provider —
87
+ construct the real per-service client with the candidate host + token and call its
88
+ verify: `createStorageClient({ baseUrl, auth: { type: 'sapi-token', token } }).tokens.verify()`, or
89
+ `createManagementClient({ baseUrl, auth: { type: 'management-token', token }, withAuthMiddleware: false }).verifyToken()`
90
+ (the flag skips the session-managing auth middleware so it's a plain validity check).
91
+
92
+ ## Conventions
93
+
94
+ - The context value is typed `KeboolaApi | null` and the hooks throw on
95
+ null — see [apps/AGENTS.md](../../apps/AGENTS.md) ("State Management"
96
+ → "Tree-passing"). Don't soften this to optional types or `??` fallbacks;
97
+ a missing provider is a programming error.
98
+ - React is a **peerDependency** (^19.0.0). Don't import React types from
99
+ this package's own deps in consumers.
100
+ - The auth provider drives the session to ready exactly once on mount. Changing
101
+ its props after mount is a no-op by design — if you need a new auth context,
102
+ mount a fresh provider.
103
+
104
+ ## Non-component access (loaders, services, module scope)
105
+
106
+ `useApiClient()` is for React components only. A TanStack Router loader, a
107
+ module instantiated at import time, or any code running outside the React tree
108
+ can't call the hook. Don't reach for the context there — construct a client
109
+ directly:
110
+
111
+ ```ts
112
+ // Single service — the common case
113
+ import { createStorageClient } from '@keboola/api-client/storage';
114
+
115
+ const storage = createStorageClient({ baseUrl, auth: { type: 'sapi-token', token } });
116
+ const tables = await storage.tables.getTables();
117
+ ```
118
+
119
+ If you need several services from non-component code, create one client at app
120
+ bootstrap (`createLegacyKeboola(...)` / `createKeboola(...)`, drive its session to
121
+ ready, and export the `api`) and import that instance where needed — rather than
122
+ re-creating clients per call. See
123
+ [`@keboola/api-client` → Getting a client](../api-client/AGENTS.md#getting-a-client).
124
+
125
+ ## Canonical consumers
126
+
127
+ - `apps/kbc-ui/src/scripts/app.tsx` — production `ApiClientProvider` mount
128
+ - `apps/kbc-ui/src/scripts/modules/sandboxes/queries.ts` — `useApiClient`
129
+ inside a TanStack Query hook (the dominant pattern)
130
+
131
+ ## Don'ts
132
+
133
+ - **Never** create a parallel React context that wraps another client
134
+ instance. One client per app, mounted once at the top.
135
+ - **Never** drive `session` manually in a consumer — the auth provider
136
+ (`AuthProvider` / `LegacyAuthProvider`) owns the drive-to-ready lifecycle.
137
+ - **Never** import from a deep path (`@keboola/api-client-react/src/...`).
138
+ The package only exports `src/index.ts`.
package/CHANGELOG.md ADDED
@@ -0,0 +1,337 @@
1
+ # @keboola/api-client-react
2
+
3
+ ## 31.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies:
8
+ - @keboola/api-client@31.0.0
9
+
10
+ ## 30.0.0
11
+
12
+ ### Patch Changes
13
+
14
+ - The published tarball now carries a `CHANGELOG.md`, so a consumer can read what changed in a release — breaking changes included — without leaving their `node_modules`.
15
+
16
+ It could not simply be added to `files`. This repo is private, so every reference `@changesets/changelog-github` emits is a dead link for anyone reading from npm: PR links, commit SHAs, author handles, and the Linear and cross-repo links that changeset prose carries. Across the publishable packages that came to 490 PR links, 863 commit links, 490 author credits and 102 dependency-bump blocks.
17
+
18
+ The published file is generated, not maintained. `scripts/public-changelog.mjs` removes those links ahead of the publish and leaves the prose. An identifier the author typed themselves stays as text — `UT-4009`, `connection#8040` — because it is part of the sentence and, without its URL, resolves to nothing outside Keboola. The repo-side `CHANGELOG.md` keeps every link, because that is how a release gets traced internally. It is rewritten only for the moment the tarballs are packed, then restored — which the release also depends on: `changesets/action` reads each changelog back off disk _after_ the publish command returns, to build that version's GitHub Release body, so without the restore the internal releases would carry the public text. A reference the rules do not cover fails the publish rather than shipping.
19
+
20
+ One incidental fix: a hex colour written as `#222529` in changeset prose had been autolinked into a link to issue 222529. Unwrapping restores the colour, so the published notes read as the author wrote them.
21
+
22
+ - Updated dependencies:
23
+ - @keboola/api-client@30.0.0
24
+
25
+ ## 29.0.0
26
+
27
+ ### Patch Changes
28
+
29
+ - Updated dependencies:
30
+ - @keboola/api-client@29.0.0
31
+
32
+ ## 28.0.0
33
+
34
+ ### Patch Changes
35
+
36
+ - Build with tsdown instead of tsup. Fixes declaration bundling against the new `@keboola/api-client` output: tsup's dts pass inlined `@keboola/api-client/*` subpath types and leaked unresolvable relative chunk imports into `dist/index.d.ts` (attw red in all four modes); with tsdown, peer dependencies stay external in declarations — subpaths included.
37
+
38
+ - Updated dependencies:
39
+ - @keboola/api-client@28.0.0
40
+
41
+ ## 27.0.0
42
+
43
+ ### Minor Changes
44
+
45
+ - `LegacyAuthProvider` gained an `errorFallback` slot, the counterpart of the one its bearer twin `AuthProvider` already had.
46
+
47
+ It previously asked only `session.isStorageReady()`, so an errored storage build was indistinguishable from a pending one and kept rendering `fallback` — a consumer whose SAPI token had expired showed a loading state forever. It now reads the build state from `debug()`/`subscribe`, renders `errorFallback` on failure (defaulting to `fallback`, so the old behaviour stands when it is omitted) and logs the failure, which nothing else did.
48
+
49
+ ### Patch Changes
50
+
51
+ - Updated dependencies:
52
+ - @keboola/api-client@27.0.0
53
+
54
+ ## 26.0.0
55
+
56
+ ### Patch Changes
57
+
58
+ - These packages now ship their `AGENTS.md` usage contract to npm, so external
59
+ consumers (and their AI agents) can read it at
60
+ `node_modules/@keboola/<name>/AGENTS.md`, version-pinned to the release they
61
+ actually installed.
62
+
63
+ Previously only `@keboola/design` published its `AGENTS.md`; every other package
64
+ omitted it from `files`, so instructions that point agents at that path — such as
65
+ `apps/boilerplate/AGENTS.md` — silently resolved to nothing outside the monorepo.
66
+ No code or type changes.
67
+
68
+ - Updated dependencies:
69
+ - @keboola/api-client@26.0.0
70
+
71
+ ## 25.0.0
72
+
73
+ ### Patch Changes
74
+
75
+ - Updated dependencies:
76
+ - @keboola/api-client@25.0.0
77
+
78
+ ## 24.0.0
79
+
80
+ ### Patch Changes
81
+
82
+ - Updated dependencies:
83
+ - @keboola/api-client@24.0.0
84
+
85
+ ## 23.0.0
86
+
87
+ ### Patch Changes
88
+
89
+ - Updated dependencies:
90
+ - @keboola/api-client@23.0.0
91
+
92
+ ## 22.0.0
93
+
94
+ ### Patch Changes
95
+
96
+ - Updated dependencies:
97
+ - @keboola/api-client@22.0.0
98
+
99
+ ## 21.0.0
100
+
101
+ ### Major Changes
102
+
103
+ - Reshape the SDK lifecycle around two authentication flows behind one product surface.
104
+ - **Breaking:** the entry points are now `createKeboola()` (bearer / OAuth) and `createLegacyKeboola()` (legacy SAPI + management token). Each returns `{ api, session }` — `api` is the flow-agnostic product surface (`auth`, `management`, `storage`, `queue`, `context`, `sdk`, …); `session` is the flow-specific lifecycle (bearer: `authenticate(credential)` → `setProject(id)`; legacy: `authenticateStorage(sapiToken)` / `authenticateManagement(manageToken)`). The old `createApiClient()` / `init()` lifecycle and the `ApiClient` type are removed.
105
+ - **Breaking:** per-service factories take an `auth` strategy instead of a bare token — `createStorageClient({ baseUrl, auth: { type: 'sapi-token', token } })`, `createManagementClient({ baseUrl, auth: { type: 'management-token', token } })` (bearer: `{ type: 'bearer', token }`). `createManagementClient` keeps `withAuthMiddleware` (default `true`; pass `false` for a raw validity-check client).
106
+ - `@keboola/api-client-react` exposes three providers: `ApiClientProvider` (propagates `api` to `useApiClient()`), `LegacyAuthProvider` (drives the legacy session to ready and gates on a fallback), and `AuthProvider` (bearer; finished with the login flow in a follow-up). `useApiClient` / `useProject` / `useStack` return the `api` surface.
107
+ - **Breaking:** the token-less public clients `assets` / `status` are not part of the keboola client — import `createAssetsClient` / `createStatusClient` from `@keboola/api-client/assets` and `@keboola/api-client/status`. `metastore` is a stack-discovered service, exposed as `api.metastore`.
108
+ - `KeboolaError` / `isKeboolaError` are exported from the package root and are the errors the client actually throws (lifecycle gating: `NotReady`, `Unconfigured`, `NoManagementToken`, …).
109
+
110
+ Migration: `const api = createApiClient(); await api.init(opts)` → `const { api, session } = createLegacyKeboola(opts); await session.authenticateStorageAsync(token)` (or `createKeboola` for the bearer flow). Per-service: `createStorageClient({ baseUrl, token })` → `createStorageClient({ baseUrl, auth: { type: 'sapi-token', token } })`.
111
+
112
+ - Give `AuthProvider` one slot per session state, and make the interactive mode's login slot mandatory.
113
+ - **Breaking:** the single `fallback` prop is replaced by three, so a genuine failure is no longer indistinguishable from "not signed in yet": `loadingFallback` (restoring / bootstrapping), `anonymousFallback` (no session — render the sign-in UI), and `errorFallback` (the storage build failed). `children` still render only once the session is scoped and storage is ready.
114
+ - **Breaking:** props are a discriminated union over the two bootstrap modes. Programmatic (`credential` + `projectId`) requires `baseUrl`, since a credential is bound to the stack that issued it. Interactive takes neither credential nor `baseUrl` — the stack comes from the restored session or from the login UI — and **requires** `anonymousFallback`, so omitting the login UI is a compile error instead of a permanently blank screen.
115
+ - `children` may now be a function receiving the scoped `{ projectId, baseUrl }`, so consumers don't re-narrow session state to read the project they landed on.
116
+ - The loading state is seeded from `session.hasPersistedValue()`: with nothing persisted there is nothing to wait for, so the login UI paints on the first render instead of flashing a loader for an empty, network-free restore.
117
+
118
+ ### Minor Changes
119
+
120
+ - Finish the bearer (programmatic) auth flow. `AuthProvider` is now the bearer twin of `LegacyAuthProvider`: it takes `baseUrl` / `credential` / `projectId` (plus optional `onAccessTokenChange` and `fallback`), drives the session to ready on mount, mirrors the rotating access token out via `onAccessTokenChange`, and gates its children behind readiness.
121
+
122
+ - Rework the bearer (OAuth) auth internals for a cleaner separation of concerns. Token handling now lives in a `TokenCredential`-style provider — `getAccessToken({ forceRefresh })` always returns a usable access token, refreshing (deduped) on near-expiry or when forced — consumed by a thin auth middleware that stamps the live token on every request and replays once on a 401. The bearer session config is a discriminated-union state machine (`anonymous` / `authenticated` / `scoped`) that owns its own credential model and the fire-once session-expiry latch: `session.authenticate` now takes a `TokenSet` (`accessToken`, `refreshToken`, `expiresIn`) rather than the full login credential, and `SessionSnapshot.config` is that state union. Also adds a `dedupe` (single-flight) util.
123
+
124
+ ### Patch Changes
125
+
126
+ - Updated dependencies:
127
+ - @keboola/api-client@21.0.0
128
+
129
+ ## 20.0.0
130
+
131
+ ### Patch Changes
132
+
133
+ - Updated dependencies:
134
+ - @keboola/api-client@20.0.0
135
+
136
+ ## 19.0.0
137
+
138
+ ### Patch Changes
139
+
140
+ - Updated dependencies:
141
+ - @keboola/api-client@19.0.0
142
+
143
+ ## 18.0.0
144
+
145
+ ### Major Changes
146
+
147
+ - Discover the metastore service from stack info instead of taking a `metastoreBaseUrl` option.
148
+ - **Breaking:** `metastoreBaseUrl` is removed from `ApiClientOptions`. `createApiClient`/`init()` no longer accept it, and `ApiClientProvider` no longer accepts the `metastoreBaseUrl` prop.
149
+ - `metastore` is now a stack-discovered service client (like `queue`, `vault`, …): its base URL comes from `getStackInfo` service discovery, exposed on the client as `api.metastore` and consumed by the tag SDK. On stacks that don't advertise a metastore service, the client resolves to a lazy no-op that throws only when a metastore method is actually called.
150
+
151
+ Migration: drop `metastoreBaseUrl` from every `createApiClient`/`init()`/`ApiClientProvider` call — the URL is resolved automatically from the stack.
152
+
153
+ ### Patch Changes
154
+
155
+ - Updated dependencies:
156
+ - @keboola/api-client@18.0.0
157
+
158
+ ## 17.0.0
159
+
160
+ ### Patch Changes
161
+
162
+ - Updated dependencies:
163
+ - @keboola/api-client@17.0.0
164
+
165
+ ## 16.0.0
166
+
167
+ ### Major Changes
168
+
169
+ - Remove `createDevApiClient` (and, in `@keboola/api-client-react`, `DevApiClientProvider` / `useDevApiClient`).
170
+
171
+ `createDevApiClient` was a stateless pass-through — `{ verify: { storageApiToken, managementApiToken } }` with no lifecycle, no base-URL registry, no `init()`. It doesn't fit the client model; it's just two host-parameterized verify calls. The React dev-provider layer existed only to carry that object through context.
172
+
173
+ Verify a candidate token with the real per-service clients directly (host-parameterized per call, no provider):
174
+ - storage: `createStorageClient({ baseUrl: host, token }).tokens.verify()`
175
+ - management: `createManagementClient({ baseUrl: host, token, withAuthMiddleware: false }).verifyToken()`
176
+
177
+ ### Patch Changes
178
+
179
+ - Updated dependencies:
180
+ - @keboola/api-client@16.0.0
181
+
182
+ ## 15.0.0
183
+
184
+ ### Patch Changes
185
+
186
+ - Updated dependencies:
187
+ - @keboola/api-client@15.0.0
188
+
189
+ ## 14.0.0
190
+
191
+ ### Patch Changes
192
+
193
+ - Updated dependencies:
194
+ - @keboola/api-client@14.0.0
195
+
196
+ ## 13.0.0
197
+
198
+ ### Patch Changes
199
+
200
+ - Updated dependencies:
201
+ - @keboola/api-client@13.0.0
202
+
203
+ ## 12.0.0
204
+
205
+ ### Patch Changes
206
+
207
+ - Updated dependencies:
208
+ - @keboola/api-client@12.0.0
209
+
210
+ ## 11.0.0
211
+
212
+ ### Patch Changes
213
+
214
+ - Updated dependencies:
215
+ - @keboola/api-client@11.0.0
216
+
217
+ ## 10.0.0
218
+
219
+ ### Patch Changes
220
+
221
+ - Updated dependencies:
222
+ - @keboola/api-client@10.0.0
223
+
224
+ ## 9.0.0
225
+
226
+ ### Patch Changes
227
+
228
+ - Updated dependencies:
229
+ - @keboola/api-client@9.0.0
230
+
231
+ ## 8.0.2
232
+
233
+ ### Patch Changes
234
+
235
+ - docs: document the sanctioned non-component data-access pattern (loaders / module-scope services) — use a per-service client or a bootstrap `createApiClient` instance, not the `useApiClient` hook
236
+
237
+ - Updated dependencies:
238
+ - @keboola/api-client@8.0.2
239
+
240
+ ## 8.0.0
241
+
242
+ ### Patch Changes
243
+
244
+ - Updated dependencies:
245
+ - @keboola/api-client@8.0.0
246
+
247
+ ## 7.0.0
248
+
249
+ ### Patch Changes
250
+
251
+ - Updated dependencies:
252
+ - @keboola/api-client@7.0.0
253
+
254
+ ## 6.0.0
255
+
256
+ ### Patch Changes
257
+
258
+ - Updated dependencies:
259
+ - @keboola/api-client@6.0.0
260
+
261
+ ## 5.0.0
262
+
263
+ ### Patch Changes
264
+
265
+ - Updated dependencies:
266
+ - @keboola/api-client@5.0.0
267
+
268
+ ## 4.0.0
269
+
270
+ ### Patch Changes
271
+
272
+ - Updated dependencies:
273
+ - @keboola/api-client@4.0.0
274
+
275
+ ## 3.0.0
276
+
277
+ ### Patch Changes
278
+
279
+ - Updated dependencies:
280
+ - @keboola/api-client@3.0.0
281
+
282
+ ## 2.0.0
283
+
284
+ ### Patch Changes
285
+
286
+ - Re-publish to scrub `workspace:^` from the npm tarball manifests.
287
+
288
+ `@keboola/design@1.2.0` shipped with literal `workspace:^` strings in
289
+ `dependencies` (`codemirror-lang-sfsql`, `codemirror-lang-sql`,
290
+ `tailwind-config`), making `npm install @keboola/design` fail with
291
+ `EUNSUPPORTEDPROTOCOL` — npm has no way to resolve the yarn-only
292
+ workspace protocol against a public registry.
293
+ `@keboola/api-client-react@1.0.1` shipped with the same
294
+ leak in `peerDependencies` (`@keboola/api-client`) — less fatal
295
+ because peerDeps are warnings, not errors, but still wrong.
296
+
297
+ Root cause was the publish workflow invoking plain `npm publish`
298
+ (which doesn't understand `workspace:^`) instead of
299
+ `yarn npm publish` (which rewrites it just-in-time). This changeset
300
+ rides alongside the workflow script fix, so the next release cycle
301
+ republishes both packages cleanly through the corrected path.
302
+
303
+ The other recently-bumped packages (`api-client`, `brand-registry`,
304
+ `brand-audit`, `codemirror-lang-*`, `agent-precheck`,
305
+ `oxlint-config`) don't need patches — they happen to have no
306
+ `@keboola/*` runtime or peer deps, so the bug couldn't bite them.
307
+
308
+ - Updated dependencies:
309
+ - @keboola/api-client@2.0.0
310
+
311
+ ## 1.0.1
312
+
313
+ ### Patch Changes
314
+
315
+ - Re-publish to fix unresolved `workspace:^` protocol references in the npm tarball manifests.
316
+
317
+ The initial bootstrap publishes (2026-05-18 for `@keboola/api-client` and `@keboola/api-client-react`, later for the rest) were run manually with `npm publish` from a maintainer machine. Bare `npm publish` doesn't understand yarn's `workspace:` protocol, so the published `package.json` files shipped with literal `workspace:^` strings in `dependencies`, `peerDependencies`, and `devDependencies`.
318
+
319
+ The blocker is `@keboola/api-client-react@1.0.0`'s `peerDependencies` declaring `@keboola/api-client: workspace:^`. Running `npm install @keboola/api-client-react` from outside the monorepo fails with `EUNSUPPORTEDPROTOCOL` because npm can't resolve the `workspace:` protocol. The same string also appears in `@keboola/api-client`, `@keboola/brand-registry`, and `@keboola/oxlint-config` `devDependencies` — npm ignores those for transitive installs, but they're still wrong in the published manifests and worth cleaning up in the same release.
320
+
321
+ This patch bump triggers a regular changesets-driven release. When `changeset publish` runs in CI, it rewrites `workspace:*` references to the actual resolved version ranges before calling `npm publish`, restoring a consumable npm surface for every package.
322
+
323
+ `@keboola/codemirror-lang-sql` has the same issue but is already covered by an existing pending changeset (`codemirror-lang-sql-publish.md`, minor bump for initial publish setup); the next release will fix it through that bump.
324
+
325
+ No source code or runtime behavior changes. The local `workspace:^` references in source `package.json` files stay (they're correct for monorepo workspace deps; the rewrite happens only at publish time).
326
+
327
+ - Updated dependencies:
328
+ - @keboola/api-client@1.0.1
329
+
330
+ ## 1.0.0
331
+
332
+ ### Patch Changes
333
+
334
+ - Initial publish setup for `@keboola/api-client-react` — React provider + hooks (`useApiClient`, `useProject`, `useStack`, `useDevApiClient`) for the Keboola SDK. Ships dual ESM/CJS bundles via `tsup` with React 18/19 as peer dependencies. Linked with `@keboola/api-client` so both packages release together.
335
+
336
+ - Updated dependencies:
337
+ - @keboola/api-client@1.0.0