@ycadence/sdk 0.1.0 → 0.3.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/README.md +38 -0
- package/dist/client.d.ts +123 -122
- package/dist/client.d.ts.map +1 -1
- package/dist/errors.d.ts +100 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +457 -64
- package/dist/index.js.map +9 -4
- package/dist/operations.d.ts +128 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/pagination.d.ts +13 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/types.d.ts +284 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/client.ts +393 -135
- package/src/errors.ts +144 -0
- package/src/index.ts +31 -4
- package/src/operations.ts +74 -0
- package/src/pagination.ts +36 -0
- package/src/types.ts +368 -0
- package/src/version.ts +11 -0
package/README.md
CHANGED
|
@@ -53,6 +53,41 @@ try {
|
|
|
53
53
|
}
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
+
### Writes, retries and concurrency
|
|
57
|
+
|
|
58
|
+
Every method takes an optional last argument of request options:
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
await client.createWorkItem(projectId, { name: 'Fix login' }, { idempotencyKey: 'import-row-17' })
|
|
62
|
+
await client.updateWorkItem(id, { priority: 'urgent' }, { expectedVersion: 7 }) // If-Match: "7"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- `idempotencyKey` is sent as `Idempotency-Key`, and makes the write safe to retry.
|
|
66
|
+
- `expectedVersion` is sent as `If-Match`. A server that versions the resource answers 409
|
|
67
|
+
`version_conflict` (or 412) when it has moved on; one that does not ignores the header.
|
|
68
|
+
- GET requests, and writes that carry an idempotency key, are retried on 429, 5xx, timeouts
|
|
69
|
+
and network errors: twice by default, with exponential backoff and jitter, honouring
|
|
70
|
+
`Retry-After`. Other writes are never retried, since they may already have been applied.
|
|
71
|
+
|
|
72
|
+
### Errors
|
|
73
|
+
|
|
74
|
+
Every failure is a `YCadenceError` with `status`, `code`, `message`, `issues`, `details`,
|
|
75
|
+
`requestId` and `retryable`, and is also an instance of a class for its kind:
|
|
76
|
+
`YCadenceValidationError` (400, 422), `YCadencePermissionError` (401, 403),
|
|
77
|
+
`YCadenceNotFoundError` (404), `YCadenceConflictError` (409), `YCadencePreconditionError`
|
|
78
|
+
(412), `YCadenceRateLimitError` (429, with `retryAfter`) and `YCadenceNetworkError`
|
|
79
|
+
(unreachable or timed out).
|
|
80
|
+
|
|
81
|
+
### Pages
|
|
82
|
+
|
|
83
|
+
Lists return `{ items, nextCursor }`. `iterateWorkItems` follows the cursor lazily, and
|
|
84
|
+
`paginate` / `collect` do the same for any list:
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
import { collect, paginate } from '@ycadence/sdk'
|
|
88
|
+
const all = await collect(paginate((cursor) => client.listWorkItems(projectId, { cursor })))
|
|
89
|
+
```
|
|
90
|
+
|
|
56
91
|
### Options
|
|
57
92
|
|
|
58
93
|
| Option | Meaning |
|
|
@@ -62,6 +97,9 @@ try {
|
|
|
62
97
|
| `identityToken` | Only for an instance behind Google IAP or authenticated Cloud Run. Pass a string or a function, which is called before each request; it is sent as `Authorization: Bearer`. |
|
|
63
98
|
| `timeoutMs` | Defaults to 30000. |
|
|
64
99
|
| `fetch` | A custom `fetch`, for tests or proxies. |
|
|
100
|
+
| `retry` | `{ retries, baseDelayMs, maxDelayMs }`; `{ retries: 0 }` turns retrying off. |
|
|
101
|
+
| `userAgent` | Prepended to `User-Agent` (`ycadence-sdk/<version>`). |
|
|
102
|
+
| `onResponse` | Called after every response with method, path, status, request id, duration and attempt. Never sees credentials. |
|
|
65
103
|
|
|
66
104
|
## Renamed from DevPulse
|
|
67
105
|
|
package/dist/client.d.ts
CHANGED
|
@@ -3,77 +3,105 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Shared by the CLI, the MCP server and anyone integrating from TypeScript, so
|
|
5
5
|
* there is one place that knows how to talk to the API — how errors are shaped,
|
|
6
|
-
* how paging works, how a key is presented
|
|
7
|
-
* that would disagree, and the disagreement
|
|
8
|
-
* the MCP server does not".
|
|
6
|
+
* how paging works, how a key is presented, when a request is safe to retry.
|
|
7
|
+
* Three separate implementations of that would disagree, and the disagreement
|
|
8
|
+
* would surface as "the CLI works but the MCP server does not".
|
|
9
9
|
*/
|
|
10
|
+
import { YCadenceError } from './errors';
|
|
11
|
+
import { type OperationId } from './operations';
|
|
12
|
+
import type { CreateViewInput, CreateWorkItemInput, Cycle, CycleProgress, Health, ImportInput, ImportPreview, ImportRun, IntakeItem, Label, ListWorkItemsOptions, Me, Page, Project, State, SubmitIntakeInput, SubmitIntakeResult, TriageInput, TriageResult, UpdateWorkItemInput, View, WorkItem, WorkItemDetail } from './types';
|
|
13
|
+
export interface RetryOptions {
|
|
14
|
+
/** Attempts after the first. Default 2. `0` turns retrying off. */
|
|
15
|
+
retries?: number;
|
|
16
|
+
/** First backoff, doubled each attempt, with jitter. Default 250ms. */
|
|
17
|
+
baseDelayMs?: number;
|
|
18
|
+
/** Ceiling for one wait, including a server's `Retry-After`. Default 8s. */
|
|
19
|
+
maxDelayMs?: number;
|
|
20
|
+
}
|
|
21
|
+
/** What happened to one HTTP exchange; for logging. Never carries credentials. */
|
|
22
|
+
export interface ResponseInfo {
|
|
23
|
+
method: string;
|
|
24
|
+
path: string;
|
|
25
|
+
status: number;
|
|
26
|
+
requestId: string | undefined;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
attempt: number;
|
|
29
|
+
replayed: boolean;
|
|
30
|
+
}
|
|
10
31
|
export interface ClientOptions {
|
|
11
|
-
/** e.g. https://
|
|
32
|
+
/** e.g. https://ycadence.example.com. Trailing slashes are tolerated. */
|
|
12
33
|
baseUrl: string;
|
|
13
34
|
apiKey: string;
|
|
14
35
|
/**
|
|
15
36
|
* A Google identity token for an instance behind IAP or an authenticated
|
|
16
37
|
* Cloud Run service, sent as `Authorization: Bearer`. The transport's
|
|
17
|
-
* credential and
|
|
38
|
+
* credential and the product's are different things and travel in different
|
|
18
39
|
* headers: the key always goes in `x-api-key`.
|
|
19
40
|
*
|
|
20
41
|
* A function is called before every request, because these tokens last
|
|
21
42
|
* about an hour and a long-running caller — the MCP server — outlives one.
|
|
22
43
|
*/
|
|
23
|
-
identityToken?: string | (() => string | Promise<string>);
|
|
44
|
+
identityToken?: string | (() => string | undefined | Promise<string | undefined>);
|
|
24
45
|
/** Defaults to 30s. A request that hangs forever is worse than one that fails. */
|
|
25
46
|
timeoutMs?: number;
|
|
26
47
|
fetch?: typeof globalThis.fetch;
|
|
48
|
+
/**
|
|
49
|
+
* Retries for 429, 5xx, timeouts and network errors. Only GET requests, and
|
|
50
|
+
* mutations sent with an idempotency key, are retried: repeating any other
|
|
51
|
+
* write could apply it twice.
|
|
52
|
+
*/
|
|
53
|
+
retry?: RetryOptions;
|
|
54
|
+
/** Prepended to the default `User-Agent`, e.g. `ycadence-cli/0.2.0`. */
|
|
55
|
+
userAgent?: string;
|
|
56
|
+
/** Called after every response, including ones that are retried. */
|
|
57
|
+
onResponse?: (info: ResponseInfo) => void;
|
|
58
|
+
/** Injected for tests; defaults to a timer. */
|
|
59
|
+
sleep?: (ms: number) => Promise<void>;
|
|
27
60
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
export interface WorkItem {
|
|
45
|
-
id: string;
|
|
46
|
-
key: string;
|
|
47
|
-
sequenceId: number;
|
|
48
|
-
name: string;
|
|
49
|
-
priority: 'urgent' | 'high' | 'medium' | 'low' | 'none';
|
|
50
|
-
stateId: string | null;
|
|
51
|
-
assigneeIds: string[];
|
|
52
|
-
labelIds: string[];
|
|
53
|
-
parentId: string | null;
|
|
54
|
-
sortOrder: string;
|
|
55
|
-
createdAt: string;
|
|
56
|
-
}
|
|
57
|
-
export interface Page<T> {
|
|
58
|
-
items: T[];
|
|
59
|
-
nextCursor: string | null;
|
|
61
|
+
/** Per-call options for any request. */
|
|
62
|
+
export interface RequestOptions {
|
|
63
|
+
/**
|
|
64
|
+
* Sent as `Idempotency-Key` on a mutation, which also makes the mutation
|
|
65
|
+
* safe to retry. Servers that do not support the header ignore it.
|
|
66
|
+
*/
|
|
67
|
+
idempotencyKey?: string;
|
|
68
|
+
/**
|
|
69
|
+
* The version the caller last saw, sent as `If-Match: "<version>"`. A server
|
|
70
|
+
* that versions the resource answers 409 `version_conflict` or 412 when it
|
|
71
|
+
* has moved on; one that does not ignores the header.
|
|
72
|
+
*/
|
|
73
|
+
expectedVersion?: number | string;
|
|
74
|
+
signal?: AbortSignal;
|
|
75
|
+
/** Overrides the client's retry count for this call. */
|
|
76
|
+
retries?: number;
|
|
60
77
|
}
|
|
61
78
|
export declare class YCadenceClient {
|
|
79
|
+
private readonly options;
|
|
62
80
|
private readonly baseUrl;
|
|
63
81
|
private readonly apiKey;
|
|
64
82
|
private readonly identityToken;
|
|
65
83
|
private readonly timeoutMs;
|
|
66
84
|
private readonly doFetch;
|
|
85
|
+
private readonly retry;
|
|
86
|
+
private readonly userAgent;
|
|
87
|
+
private readonly onResponse;
|
|
88
|
+
private readonly sleep;
|
|
67
89
|
constructor(options: ClientOptions);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
90
|
+
/** A copy of this client with some options replaced. */
|
|
91
|
+
withOptions(overrides: Partial<ClientOptions>): YCadenceClient;
|
|
92
|
+
/** The fetch this client sends with; for wrapping in `withOptions`. */
|
|
93
|
+
get fetchImplementation(): typeof globalThis.fetch;
|
|
94
|
+
health(): Promise<Health>;
|
|
95
|
+
/** Who the credential is. A 404 means the server predates Slice 2A. */
|
|
96
|
+
me(options?: RequestOptions): Promise<Me>;
|
|
97
|
+
/** Projects the credential can read; `q` matches a name or identifier prefix. */
|
|
98
|
+
listProjects(query?: {
|
|
99
|
+
q?: string;
|
|
100
|
+
archived?: boolean;
|
|
74
101
|
limit?: number;
|
|
75
102
|
cursor?: string;
|
|
76
|
-
}): Promise<Page<
|
|
103
|
+
}, options?: RequestOptions): Promise<Page<Project>>;
|
|
104
|
+
listWorkItems(projectId: string, query?: ListWorkItemsOptions, options?: RequestOptions): Promise<Page<WorkItem>>;
|
|
77
105
|
/**
|
|
78
106
|
* Every work item matching a filter, following the cursor.
|
|
79
107
|
*
|
|
@@ -85,93 +113,65 @@ export declare class YCadenceClient {
|
|
|
85
113
|
filter?: unknown;
|
|
86
114
|
pageSize?: number;
|
|
87
115
|
}): AsyncGenerator<WorkItem>;
|
|
88
|
-
createWorkItem(projectId: string, body: Record<string, unknown
|
|
89
|
-
getWorkItem(workItemId: string): Promise<
|
|
90
|
-
|
|
116
|
+
createWorkItem(projectId: string, body: CreateWorkItemInput | Record<string, unknown>, options?: RequestOptions): Promise<WorkItem>;
|
|
117
|
+
getWorkItem(workItemId: string, options?: RequestOptions): Promise<WorkItemDetail>;
|
|
118
|
+
updateWorkItem(workItemId: string, body: UpdateWorkItemInput | Record<string, unknown>, options?: RequestOptions): Promise<WorkItem>;
|
|
119
|
+
deleteWorkItem(workItemId: string, options?: RequestOptions): Promise<void>;
|
|
120
|
+
listStates(projectId: string, options?: RequestOptions): Promise<{
|
|
121
|
+
states: State[];
|
|
91
122
|
}>;
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
listStates(projectId: string): Promise<{
|
|
95
|
-
states: {
|
|
96
|
-
id: string;
|
|
97
|
-
name: string;
|
|
98
|
-
group: string;
|
|
99
|
-
}[];
|
|
123
|
+
listLabels(projectId: string, options?: RequestOptions): Promise<{
|
|
124
|
+
labels: Label[];
|
|
100
125
|
}>;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
126
|
+
createLabel(projectId: string, body: {
|
|
127
|
+
name: string;
|
|
128
|
+
color: string;
|
|
129
|
+
description?: string;
|
|
130
|
+
}, options?: RequestOptions): Promise<Label>;
|
|
131
|
+
listTypes(projectId: string, options?: RequestOptions): Promise<{
|
|
132
|
+
types: unknown[];
|
|
133
|
+
}>;
|
|
134
|
+
listCycles(projectId: string, options?: RequestOptions): Promise<{
|
|
135
|
+
cycles: Cycle[];
|
|
136
|
+
}>;
|
|
137
|
+
createCycle(projectId: string, body: {
|
|
138
|
+
name: string;
|
|
139
|
+
description?: string;
|
|
140
|
+
startDate?: string;
|
|
141
|
+
endDate?: string;
|
|
142
|
+
}, options?: RequestOptions): Promise<Cycle>;
|
|
143
|
+
getCycleProgress(cycleId: string, options?: RequestOptions): Promise<CycleProgress>;
|
|
144
|
+
addWorkItemsToCycle(cycleId: string, workItemIds: string[], options?: RequestOptions): Promise<{
|
|
145
|
+
added: number;
|
|
146
|
+
}>;
|
|
147
|
+
listViews(projectId: string, options?: RequestOptions): Promise<{
|
|
148
|
+
views: View[];
|
|
106
149
|
}>;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}[];
|
|
150
|
+
createView(projectId: string, body: CreateViewInput, options?: RequestOptions): Promise<View>;
|
|
151
|
+
listIntake(projectId: string, query?: {
|
|
152
|
+
includeDecided?: boolean;
|
|
153
|
+
}, options?: RequestOptions): Promise<{
|
|
154
|
+
items: IntakeItem[];
|
|
113
155
|
}>;
|
|
114
|
-
|
|
115
|
-
|
|
156
|
+
submitIntake(projectId: string, body: SubmitIntakeInput, options?: RequestOptions): Promise<SubmitIntakeResult>;
|
|
157
|
+
triageIntake(intakeItemId: string, body: TriageInput, options?: RequestOptions): Promise<TriageResult>;
|
|
158
|
+
previewImport(projectId: string, body: ImportInput | Record<string, unknown>, options?: RequestOptions): Promise<ImportPreview>;
|
|
159
|
+
startImport(projectId: string, body: ImportInput | Record<string, unknown>, options?: RequestOptions): Promise<{
|
|
116
160
|
runId: string;
|
|
117
161
|
}>;
|
|
118
|
-
getImport(runId: string): Promise<ImportRun>;
|
|
119
|
-
listImports(projectId: string): Promise<{
|
|
162
|
+
getImport(runId: string, options?: RequestOptions): Promise<ImportRun>;
|
|
163
|
+
listImports(projectId: string, options?: RequestOptions): Promise<{
|
|
120
164
|
runs: ImportRun[];
|
|
121
165
|
}>;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
id: string;
|
|
125
|
-
name: string;
|
|
126
|
-
}[];
|
|
127
|
-
}>;
|
|
166
|
+
/** Call any operation in the table by id. */
|
|
167
|
+
call<T>(operation: OperationId, params?: Record<string, string>, query?: Record<string, string | number | boolean | undefined>, body?: unknown, options?: RequestOptions): Promise<T>;
|
|
128
168
|
private request;
|
|
169
|
+
private backoff;
|
|
170
|
+
private send;
|
|
129
171
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
states: {
|
|
134
|
-
name: string;
|
|
135
|
-
suggestedStateId: string | null;
|
|
136
|
-
}[];
|
|
137
|
-
labels: {
|
|
138
|
-
name: string;
|
|
139
|
-
exists: boolean;
|
|
140
|
-
}[];
|
|
141
|
-
assignees: {
|
|
142
|
-
value: string;
|
|
143
|
-
matched: boolean;
|
|
144
|
-
}[];
|
|
145
|
-
skipped: {
|
|
146
|
-
row: number;
|
|
147
|
-
reason: string;
|
|
148
|
-
}[];
|
|
149
|
-
unmappedPriorities: string[];
|
|
150
|
-
/**
|
|
151
|
-
* False when re-importing would create duplicates rather than update — a CSV
|
|
152
|
-
* with no id column. Worth showing before the import, not after.
|
|
153
|
-
*/
|
|
154
|
-
idempotent: boolean;
|
|
155
|
-
}
|
|
156
|
-
export interface ImportRun {
|
|
157
|
-
id: string;
|
|
158
|
-
source: string;
|
|
159
|
-
status: string;
|
|
160
|
-
totalItems: number;
|
|
161
|
-
createdCount: number;
|
|
162
|
-
updatedCount: number;
|
|
163
|
-
cursor: number;
|
|
164
|
-
skipped: {
|
|
165
|
-
row: number;
|
|
166
|
-
reason: string;
|
|
167
|
-
}[];
|
|
168
|
-
unmatched: {
|
|
169
|
-
kind: string;
|
|
170
|
-
value: string;
|
|
171
|
-
item: string;
|
|
172
|
-
}[];
|
|
173
|
-
error: string | null;
|
|
174
|
-
}
|
|
172
|
+
/** Seconds, from either form `Retry-After` takes: a number or an HTTP date. */
|
|
173
|
+
export declare function parseRetryAfter(value: string | null, now?: number): number | undefined;
|
|
174
|
+
export type { ImportPreview, ImportRun, Page, WorkItem } from './types';
|
|
175
175
|
/**
|
|
176
176
|
* @deprecated Renamed to {@link YCadenceClient}. This alias stays for one
|
|
177
177
|
* release so existing integrations keep compiling.
|
|
@@ -179,6 +179,7 @@ export interface ImportRun {
|
|
|
179
179
|
export declare const DevPulseClient: typeof YCadenceClient;
|
|
180
180
|
/** @deprecated Renamed to {@link YCadenceClient}. */
|
|
181
181
|
export type DevPulseClient = YCadenceClient;
|
|
182
|
+
export { type ApiFailure, YCadenceError } from './errors';
|
|
182
183
|
/**
|
|
183
184
|
* @deprecated Renamed to {@link YCadenceError}. The alias is the same class,
|
|
184
185
|
* so `error instanceof DevPulseError` still matches errors the client throws.
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Errors the client throws.
|
|
3
|
+
*
|
|
4
|
+
* One base class, `YCadenceError`, so `instanceof YCadenceError` catches every
|
|
5
|
+
* failure the client produces, and a subclass per kind of failure, so a caller
|
|
6
|
+
* can branch on the class instead of comparing status codes. The base keeps its
|
|
7
|
+
* original positional constructor `(status, code, message, issues)`, because
|
|
8
|
+
* integrations construct it in their own tests.
|
|
9
|
+
*/
|
|
10
|
+
export interface ApiIssue {
|
|
11
|
+
path: string;
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
/** The error body every v1 route returns (`packages/api/src/types.ts`). */
|
|
15
|
+
export interface ApiFailure {
|
|
16
|
+
error: string;
|
|
17
|
+
code: string;
|
|
18
|
+
issues?: ApiIssue[];
|
|
19
|
+
/** Added by the work management contracts; absent on older servers. */
|
|
20
|
+
details?: Record<string, unknown>;
|
|
21
|
+
requestId?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ErrorExtras {
|
|
24
|
+
/** The server's request id, from the body or the `x-request-id` header. */
|
|
25
|
+
requestId?: string;
|
|
26
|
+
details?: Record<string, unknown>;
|
|
27
|
+
/** Seconds, from `Retry-After`, when the server sent one. */
|
|
28
|
+
retryAfter?: number;
|
|
29
|
+
method?: string;
|
|
30
|
+
path?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare class YCadenceError extends Error {
|
|
33
|
+
readonly status: number;
|
|
34
|
+
readonly code: string;
|
|
35
|
+
readonly issues?: ApiIssue[] | undefined;
|
|
36
|
+
readonly requestId: string | undefined;
|
|
37
|
+
readonly details: Record<string, unknown> | undefined;
|
|
38
|
+
readonly retryAfter: number | undefined;
|
|
39
|
+
readonly method: string | undefined;
|
|
40
|
+
readonly path: string | undefined;
|
|
41
|
+
constructor(status: number, code: string, message: string, issues?: ApiIssue[] | undefined, extras?: ErrorExtras);
|
|
42
|
+
/**
|
|
43
|
+
* Whether retrying unchanged could plausibly succeed: rate limits, server
|
|
44
|
+
* errors, timeouts and an unreachable host. A 4xx means the request itself
|
|
45
|
+
* needs to change.
|
|
46
|
+
*/
|
|
47
|
+
get retryable(): boolean;
|
|
48
|
+
}
|
|
49
|
+
/** 400 or 422: the request was understood and refused as invalid. */
|
|
50
|
+
export declare class YCadenceValidationError extends YCadenceError {
|
|
51
|
+
name: string;
|
|
52
|
+
}
|
|
53
|
+
/** 401 or 403: no credential, a bad one, or not allowed. */
|
|
54
|
+
export declare class YCadencePermissionError extends YCadenceError {
|
|
55
|
+
name: string;
|
|
56
|
+
}
|
|
57
|
+
/** 404: missing, deleted, or in another organization. */
|
|
58
|
+
export declare class YCadenceNotFoundError extends YCadenceError {
|
|
59
|
+
name: string;
|
|
60
|
+
}
|
|
61
|
+
/** 409: a domain rule, a version conflict, or the same idempotency key still running. */
|
|
62
|
+
export declare class YCadenceConflictError extends YCadenceError {
|
|
63
|
+
name: string;
|
|
64
|
+
}
|
|
65
|
+
/** 412: an `If-Match` precondition failed; reload and try again. */
|
|
66
|
+
export declare class YCadencePreconditionError extends YCadenceError {
|
|
67
|
+
name: string;
|
|
68
|
+
}
|
|
69
|
+
/** 429: slow down; `retryAfter` says for how long when the server said. */
|
|
70
|
+
export declare class YCadenceRateLimitError extends YCadenceError {
|
|
71
|
+
name: string;
|
|
72
|
+
}
|
|
73
|
+
/** Status 0 or 408: the host could not be reached, or did not answer in time. */
|
|
74
|
+
export declare class YCadenceNetworkError extends YCadenceError {
|
|
75
|
+
name: string;
|
|
76
|
+
}
|
|
77
|
+
/** The class that matches a status. */
|
|
78
|
+
export declare function errorClassFor(status: number): typeof YCadenceError;
|
|
79
|
+
export declare function createError(status: number, code: string, message: string, issues?: ApiIssue[], extras?: ErrorExtras): YCadenceError;
|
|
80
|
+
/**
|
|
81
|
+
* Thrown, unchanged, through the client by a custom `fetch` that wants to stop
|
|
82
|
+
* a request without it being reported as a network error. The CLI's
|
|
83
|
+
* `--dry-run` uses it to show a mutation instead of sending it.
|
|
84
|
+
*/
|
|
85
|
+
export declare class RequestIntercepted extends Error {
|
|
86
|
+
readonly request: {
|
|
87
|
+
method: string;
|
|
88
|
+
url: string;
|
|
89
|
+
headers: Record<string, string>;
|
|
90
|
+
body: unknown;
|
|
91
|
+
};
|
|
92
|
+
name: string;
|
|
93
|
+
constructor(request: {
|
|
94
|
+
method: string;
|
|
95
|
+
url: string;
|
|
96
|
+
headers: Record<string, string>;
|
|
97
|
+
body: unknown;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
export { type
|
|
1
|
+
export { type ClientOptions, DevPulseClient, DevPulseError, parseRetryAfter, type RequestOptions, type ResponseInfo, type RetryOptions, YCadenceClient, } from './client.js';
|
|
2
|
+
export { type ApiFailure, type ApiIssue, createError, type ErrorExtras, errorClassFor, RequestIntercepted, YCadenceConflictError, YCadenceError, YCadenceNetworkError, YCadenceNotFoundError, YCadencePermissionError, YCadencePreconditionError, YCadenceRateLimitError, YCadenceValidationError, } from './errors.js';
|
|
3
|
+
export { buildPath, type HttpMethod, isIdempotentMethod, OPERATIONS, type Operation, type OperationId, } from './operations.js';
|
|
4
|
+
export { collect, paginate } from './pagination.js';
|
|
5
|
+
export * from './types.js';
|
|
6
|
+
export { SDK_VERSION } from './version.js';
|
|
2
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,cAAc,EACd,aAAa,EACb,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,cAAc,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,WAAW,EACX,KAAK,WAAW,EAChB,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,SAAS,EACT,KAAK,UAAU,EACf,kBAAkB,EAClB,UAAU,EACV,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AACnD,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA"}
|