@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 +138 -0
- package/CHANGELOG.md +337 -0
- package/dist/index.cjs +152 -119
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +171 -168
- package/dist/index.d.ts +171 -168
- package/dist/index.js +151 -117
- package/dist/index.js.map +1 -1
- package/package.json +11 -10
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
|