uidex 0.2.0 → 0.2.4
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 +132 -32
- package/claude/audit-command.md +40 -10
- package/claude/rules.md +99 -20
- package/dist/api/index.cjs +254 -0
- package/dist/api/index.cjs.map +1 -0
- package/dist/api/index.d.cts +236 -0
- package/dist/api/index.d.ts +236 -0
- package/dist/api/index.js +226 -0
- package/dist/api/index.js.map +1 -0
- package/dist/core/index.cjs +10149 -2576
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +155 -170
- package/dist/core/index.d.ts +155 -170
- package/dist/core/index.global.js +65920 -2855
- package/dist/core/index.global.js.map +1 -1
- package/dist/core/index.js +10145 -2576
- package/dist/core/index.js.map +1 -1
- package/dist/core/style.css +1170 -612
- package/dist/index.cjs +10129 -2536
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +43 -8
- package/dist/index.d.ts +43 -8
- package/dist/index.js +10132 -2541
- package/dist/index.js.map +1 -1
- package/dist/playwright/index.cjs.map +1 -1
- package/dist/playwright/index.d.cts +2 -2
- package/dist/playwright/index.d.ts +2 -2
- package/dist/playwright/index.js.map +1 -1
- package/dist/playwright/reporter.cjs.map +1 -1
- package/dist/playwright/reporter.js.map +1 -1
- package/dist/react/index.cjs +10129 -2536
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +43 -8
- package/dist/react/index.d.ts +43 -8
- package/dist/react/index.js +10132 -2541
- package/dist/react/index.js.map +1 -1
- package/dist/scripts/cli.cjs +3237 -500
- package/package.json +20 -8
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
interface PaginatedResponse<T> {
|
|
2
|
+
data: T[];
|
|
3
|
+
total: number;
|
|
4
|
+
page: number;
|
|
5
|
+
limit: number;
|
|
6
|
+
}
|
|
7
|
+
interface FeedbackRow {
|
|
8
|
+
id: string;
|
|
9
|
+
sequence_number: number;
|
|
10
|
+
project_id: string;
|
|
11
|
+
organization_id: string;
|
|
12
|
+
type: 'bug' | 'feature' | 'improvement' | 'question';
|
|
13
|
+
severity: 'low' | 'medium' | 'high' | 'critical';
|
|
14
|
+
title: string | null;
|
|
15
|
+
description: string;
|
|
16
|
+
component_id: string;
|
|
17
|
+
element: string | null;
|
|
18
|
+
sources: {
|
|
19
|
+
filePath: string;
|
|
20
|
+
line: number;
|
|
21
|
+
}[] | null;
|
|
22
|
+
url: string;
|
|
23
|
+
path: string;
|
|
24
|
+
route: string | null;
|
|
25
|
+
page_title: string | null;
|
|
26
|
+
session_id: string | null;
|
|
27
|
+
reporter_email: string | null;
|
|
28
|
+
reporter_name: string | null;
|
|
29
|
+
client_timestamp: string;
|
|
30
|
+
viewport: {
|
|
31
|
+
width: number;
|
|
32
|
+
height: number;
|
|
33
|
+
} | null;
|
|
34
|
+
screen_size: {
|
|
35
|
+
width: number;
|
|
36
|
+
height: number;
|
|
37
|
+
} | null;
|
|
38
|
+
user_agent: string;
|
|
39
|
+
locale: string | null;
|
|
40
|
+
environment: string | null;
|
|
41
|
+
app_version: string | null;
|
|
42
|
+
browser_name: string | null;
|
|
43
|
+
browser_version: string | null;
|
|
44
|
+
os_name: string | null;
|
|
45
|
+
os_version: string | null;
|
|
46
|
+
device_type: string | null;
|
|
47
|
+
console_logs: {
|
|
48
|
+
level: string;
|
|
49
|
+
message: string;
|
|
50
|
+
timestamp: string;
|
|
51
|
+
}[] | null;
|
|
52
|
+
network_errors: {
|
|
53
|
+
url: string;
|
|
54
|
+
method: string;
|
|
55
|
+
status: number | null;
|
|
56
|
+
statusText: string;
|
|
57
|
+
timestamp: string;
|
|
58
|
+
}[] | null;
|
|
59
|
+
metadata: Record<string, string> | null;
|
|
60
|
+
screenshot_url: string | null;
|
|
61
|
+
status: 'open' | 'triaged' | 'in_progress' | 'resolved' | 'closed';
|
|
62
|
+
priority: 'low' | 'medium' | 'high' | 'urgent' | null;
|
|
63
|
+
resolution: FeedbackResolution | null;
|
|
64
|
+
assignee_id: string | null;
|
|
65
|
+
duplicate_of_id: string | null;
|
|
66
|
+
api_key_id: string | null;
|
|
67
|
+
archived_at: string | null;
|
|
68
|
+
created_at: string;
|
|
69
|
+
updated_at: string;
|
|
70
|
+
tags?: string[];
|
|
71
|
+
}
|
|
72
|
+
type FeedbackType = 'bug' | 'feature' | 'improvement' | 'question';
|
|
73
|
+
type FeedbackSeverity = 'low' | 'medium' | 'high' | 'critical';
|
|
74
|
+
type FeedbackStatus = 'open' | 'triaged' | 'in_progress' | 'resolved' | 'closed';
|
|
75
|
+
type FeedbackPriority = 'low' | 'medium' | 'high' | 'urgent';
|
|
76
|
+
type FeedbackResolution = 'fixed' | 'duplicate' | 'wont_fix' | 'by_design';
|
|
77
|
+
interface FeedbackListParams {
|
|
78
|
+
status?: FeedbackStatus | FeedbackStatus[];
|
|
79
|
+
type?: FeedbackType | FeedbackType[];
|
|
80
|
+
severity?: FeedbackSeverity | FeedbackSeverity[];
|
|
81
|
+
componentId?: string;
|
|
82
|
+
assigneeId?: string;
|
|
83
|
+
environment?: string;
|
|
84
|
+
tag?: string;
|
|
85
|
+
search?: string;
|
|
86
|
+
sequence_number?: number;
|
|
87
|
+
sort?: string;
|
|
88
|
+
order?: 'asc' | 'desc';
|
|
89
|
+
page?: number;
|
|
90
|
+
limit?: number;
|
|
91
|
+
}
|
|
92
|
+
interface FeedbackUpdateParams {
|
|
93
|
+
status?: FeedbackStatus;
|
|
94
|
+
priority?: FeedbackPriority | null;
|
|
95
|
+
resolution?: FeedbackResolution | null;
|
|
96
|
+
assignee_id?: string | null;
|
|
97
|
+
duplicate_of_id?: string | null;
|
|
98
|
+
tags?: string[];
|
|
99
|
+
}
|
|
100
|
+
interface IssueDraftRow {
|
|
101
|
+
id: string;
|
|
102
|
+
organization_id: string;
|
|
103
|
+
project_id: string | null;
|
|
104
|
+
integration_id: string | null;
|
|
105
|
+
target_config: unknown;
|
|
106
|
+
title: string;
|
|
107
|
+
body: string;
|
|
108
|
+
labels: string[];
|
|
109
|
+
composed_by: 'manual' | 'auto';
|
|
110
|
+
status: 'suggested' | 'draft' | 'submitted' | 'dismissed';
|
|
111
|
+
reasoning: string | null;
|
|
112
|
+
created_by: string | null;
|
|
113
|
+
created_at: string;
|
|
114
|
+
feedback_count?: number;
|
|
115
|
+
feedback_ids?: string[];
|
|
116
|
+
}
|
|
117
|
+
interface TriageResult {
|
|
118
|
+
proposals: IssueDraftRow[];
|
|
119
|
+
updated: IssueDraftRow[];
|
|
120
|
+
}
|
|
121
|
+
type IssueDraftStatus = 'suggested' | 'draft' | 'submitted' | 'dismissed';
|
|
122
|
+
interface DraftUpdateParams {
|
|
123
|
+
title?: string;
|
|
124
|
+
body?: string;
|
|
125
|
+
labels?: string[];
|
|
126
|
+
status?: IssueDraftStatus;
|
|
127
|
+
integration_id?: string | null;
|
|
128
|
+
target_config?: unknown;
|
|
129
|
+
}
|
|
130
|
+
interface ProjectRow {
|
|
131
|
+
id: string;
|
|
132
|
+
organization_id: string;
|
|
133
|
+
name: string;
|
|
134
|
+
slug: string;
|
|
135
|
+
description: string | null;
|
|
136
|
+
created_by: string | null;
|
|
137
|
+
created_at: string;
|
|
138
|
+
updated_at: string;
|
|
139
|
+
}
|
|
140
|
+
interface OrganizationRow {
|
|
141
|
+
id: string;
|
|
142
|
+
name: string;
|
|
143
|
+
slug: string;
|
|
144
|
+
avatar_url: string | null;
|
|
145
|
+
created_at: string;
|
|
146
|
+
updated_at: string;
|
|
147
|
+
}
|
|
148
|
+
interface TokenRow {
|
|
149
|
+
id: string;
|
|
150
|
+
token?: string;
|
|
151
|
+
token_prefix: string;
|
|
152
|
+
label: string;
|
|
153
|
+
last_used_at: string | null;
|
|
154
|
+
expires_at: string | null;
|
|
155
|
+
revoked_at: string | null;
|
|
156
|
+
created_at: string;
|
|
157
|
+
}
|
|
158
|
+
interface IntegrationRow {
|
|
159
|
+
id: string;
|
|
160
|
+
organization_id: string;
|
|
161
|
+
provider: 'github' | 'jira';
|
|
162
|
+
label: string;
|
|
163
|
+
config: Record<string, unknown>;
|
|
164
|
+
created_by: string | null;
|
|
165
|
+
created_at: string;
|
|
166
|
+
updated_at: string;
|
|
167
|
+
}
|
|
168
|
+
interface CreateIntegrationParams {
|
|
169
|
+
provider: 'github' | 'jira';
|
|
170
|
+
label: string;
|
|
171
|
+
config: Record<string, unknown>;
|
|
172
|
+
credentials: Record<string, unknown>;
|
|
173
|
+
}
|
|
174
|
+
interface TestConnectionResult {
|
|
175
|
+
ok: boolean;
|
|
176
|
+
error?: string;
|
|
177
|
+
}
|
|
178
|
+
interface TargetOption {
|
|
179
|
+
id: string;
|
|
180
|
+
label: string;
|
|
181
|
+
children?: boolean;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
interface ClientConfig {
|
|
185
|
+
endpoint: string;
|
|
186
|
+
token: string;
|
|
187
|
+
}
|
|
188
|
+
declare class ApiError extends Error {
|
|
189
|
+
status: number;
|
|
190
|
+
constructor(status: number, message: string);
|
|
191
|
+
}
|
|
192
|
+
type Fetcher = <T = unknown>(path: string, init?: RequestInit) => Promise<T>;
|
|
193
|
+
declare function createClient(config: ClientConfig): {
|
|
194
|
+
feedback: {
|
|
195
|
+
list(orgId: string, projectId: string, params?: FeedbackListParams): Promise<PaginatedResponse<FeedbackRow>>;
|
|
196
|
+
get(orgId: string, projectId: string, feedbackId: string): Promise<FeedbackRow>;
|
|
197
|
+
update(orgId: string, projectId: string, feedbackId: string, params: FeedbackUpdateParams): Promise<FeedbackRow>;
|
|
198
|
+
delete(orgId: string, projectId: string, feedbackId: string): Promise<void>;
|
|
199
|
+
};
|
|
200
|
+
triage: {
|
|
201
|
+
run(orgId: string, projectId: string): Promise<TriageResult>;
|
|
202
|
+
};
|
|
203
|
+
drafts: {
|
|
204
|
+
list(orgId: string, projectId: string, params?: {
|
|
205
|
+
status?: string;
|
|
206
|
+
composed_by?: string;
|
|
207
|
+
}): Promise<IssueDraftRow[]>;
|
|
208
|
+
get(orgId: string, draftId: string): Promise<IssueDraftRow>;
|
|
209
|
+
update(orgId: string, draftId: string, params: DraftUpdateParams): Promise<IssueDraftRow>;
|
|
210
|
+
submit(orgId: string, draftId: string): Promise<{
|
|
211
|
+
external_url: string;
|
|
212
|
+
}>;
|
|
213
|
+
};
|
|
214
|
+
projects: {
|
|
215
|
+
list(orgId: string): Promise<ProjectRow[]>;
|
|
216
|
+
};
|
|
217
|
+
orgs: {
|
|
218
|
+
list(): Promise<OrganizationRow[]>;
|
|
219
|
+
};
|
|
220
|
+
user: {
|
|
221
|
+
createToken(label: string, expiresAt?: string | null): Promise<TokenRow>;
|
|
222
|
+
listTokens(): Promise<TokenRow[]>;
|
|
223
|
+
revokeToken(tokenId: string): Promise<void>;
|
|
224
|
+
};
|
|
225
|
+
integrations: {
|
|
226
|
+
list(orgId: string): Promise<IntegrationRow[]>;
|
|
227
|
+
create(orgId: string, params: CreateIntegrationParams): Promise<IntegrationRow>;
|
|
228
|
+
get(orgId: string, integrationId: string): Promise<IntegrationRow>;
|
|
229
|
+
delete(orgId: string, integrationId: string): Promise<void>;
|
|
230
|
+
test(orgId: string, integrationId: string): Promise<TestConnectionResult>;
|
|
231
|
+
listTargets(orgId: string, integrationId: string, parentId?: string): Promise<TargetOption[]>;
|
|
232
|
+
};
|
|
233
|
+
};
|
|
234
|
+
type UidexClient = ReturnType<typeof createClient>;
|
|
235
|
+
|
|
236
|
+
export { ApiError, type ClientConfig, type CreateIntegrationParams, type DraftUpdateParams, type FeedbackListParams, type FeedbackPriority, type FeedbackResolution, type FeedbackRow, type FeedbackSeverity, type FeedbackStatus, type FeedbackType, type FeedbackUpdateParams, type Fetcher, type IntegrationRow, type IssueDraftRow, type IssueDraftStatus, type OrganizationRow, type PaginatedResponse, type ProjectRow, type TargetOption, type TestConnectionResult, type TokenRow, type TriageResult, type UidexClient, createClient };
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// src/api/feedback.ts
|
|
2
|
+
function buildQuery(params) {
|
|
3
|
+
const parts = [];
|
|
4
|
+
for (const [key, value] of Object.entries(params)) {
|
|
5
|
+
if (value === void 0 || value === null) continue;
|
|
6
|
+
if (Array.isArray(value)) {
|
|
7
|
+
for (const v of value) {
|
|
8
|
+
parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(v)}`);
|
|
9
|
+
}
|
|
10
|
+
} else {
|
|
11
|
+
parts.push(
|
|
12
|
+
`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return parts.length > 0 ? `?${parts.join("&")}` : "";
|
|
17
|
+
}
|
|
18
|
+
function createFeedbackAPI(fetcher) {
|
|
19
|
+
return {
|
|
20
|
+
async list(orgId, projectId, params = {}) {
|
|
21
|
+
const query = buildQuery(params);
|
|
22
|
+
return fetcher(
|
|
23
|
+
`/api/organizations/${orgId}/projects/${projectId}/feedback${query}`
|
|
24
|
+
);
|
|
25
|
+
},
|
|
26
|
+
async get(orgId, projectId, feedbackId) {
|
|
27
|
+
return fetcher(
|
|
28
|
+
`/api/organizations/${orgId}/projects/${projectId}/feedback/${feedbackId}`
|
|
29
|
+
);
|
|
30
|
+
},
|
|
31
|
+
async update(orgId, projectId, feedbackId, params) {
|
|
32
|
+
return fetcher(
|
|
33
|
+
`/api/organizations/${orgId}/projects/${projectId}/feedback/${feedbackId}`,
|
|
34
|
+
{
|
|
35
|
+
method: "PATCH",
|
|
36
|
+
body: JSON.stringify(params)
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
},
|
|
40
|
+
async delete(orgId, projectId, feedbackId) {
|
|
41
|
+
await fetcher(
|
|
42
|
+
`/api/organizations/${orgId}/projects/${projectId}/feedback/${feedbackId}`,
|
|
43
|
+
{ method: "DELETE" }
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// src/api/triage.ts
|
|
50
|
+
function createTriageAPI(fetcher) {
|
|
51
|
+
return {
|
|
52
|
+
async run(orgId, projectId) {
|
|
53
|
+
return fetcher(
|
|
54
|
+
`/api/organizations/${orgId}/projects/${projectId}/triage`,
|
|
55
|
+
{ method: "POST" }
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// src/api/drafts.ts
|
|
62
|
+
function createDraftsAPI(fetcher) {
|
|
63
|
+
return {
|
|
64
|
+
async list(orgId, projectId, params = {}) {
|
|
65
|
+
const query = new URLSearchParams();
|
|
66
|
+
query.set("projectId", projectId);
|
|
67
|
+
if (params.status) query.set("status", params.status);
|
|
68
|
+
if (params.composed_by) query.set("composed_by", params.composed_by);
|
|
69
|
+
return fetcher(
|
|
70
|
+
`/api/organizations/${orgId}/issue-drafts?${query.toString()}`
|
|
71
|
+
);
|
|
72
|
+
},
|
|
73
|
+
async get(orgId, draftId) {
|
|
74
|
+
return fetcher(
|
|
75
|
+
`/api/organizations/${orgId}/issue-drafts/${draftId}`
|
|
76
|
+
);
|
|
77
|
+
},
|
|
78
|
+
async update(orgId, draftId, params) {
|
|
79
|
+
return fetcher(
|
|
80
|
+
`/api/organizations/${orgId}/issue-drafts/${draftId}`,
|
|
81
|
+
{
|
|
82
|
+
method: "PATCH",
|
|
83
|
+
body: JSON.stringify(params)
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
},
|
|
87
|
+
async submit(orgId, draftId) {
|
|
88
|
+
return fetcher(
|
|
89
|
+
`/api/organizations/${orgId}/issue-drafts/${draftId}/submit`,
|
|
90
|
+
{ method: "POST" }
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// src/api/projects.ts
|
|
97
|
+
function createProjectsAPI(fetcher) {
|
|
98
|
+
return {
|
|
99
|
+
async list(orgId) {
|
|
100
|
+
return fetcher(`/api/organizations/${orgId}/projects`);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// src/api/orgs.ts
|
|
106
|
+
function createOrgsAPI(fetcher) {
|
|
107
|
+
return {
|
|
108
|
+
async list() {
|
|
109
|
+
return fetcher("/api/organizations");
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// src/api/tokens.ts
|
|
115
|
+
function createUserAPI(fetcher) {
|
|
116
|
+
return {
|
|
117
|
+
async createToken(label, expiresAt) {
|
|
118
|
+
return fetcher("/api/user/tokens", {
|
|
119
|
+
method: "POST",
|
|
120
|
+
body: JSON.stringify({
|
|
121
|
+
label,
|
|
122
|
+
expires_at: expiresAt ?? null
|
|
123
|
+
})
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
async listTokens() {
|
|
127
|
+
return fetcher("/api/user/tokens");
|
|
128
|
+
},
|
|
129
|
+
async revokeToken(tokenId) {
|
|
130
|
+
await fetcher(`/api/user/tokens/${tokenId}`, {
|
|
131
|
+
method: "DELETE"
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// src/api/integrations.ts
|
|
138
|
+
function createIntegrationsAPI(fetcher) {
|
|
139
|
+
return {
|
|
140
|
+
async list(orgId) {
|
|
141
|
+
return fetcher(
|
|
142
|
+
`/api/organizations/${orgId}/integrations`
|
|
143
|
+
);
|
|
144
|
+
},
|
|
145
|
+
async create(orgId, params) {
|
|
146
|
+
return fetcher(
|
|
147
|
+
`/api/organizations/${orgId}/integrations`,
|
|
148
|
+
{
|
|
149
|
+
method: "POST",
|
|
150
|
+
body: JSON.stringify(params)
|
|
151
|
+
}
|
|
152
|
+
);
|
|
153
|
+
},
|
|
154
|
+
async get(orgId, integrationId) {
|
|
155
|
+
return fetcher(
|
|
156
|
+
`/api/organizations/${orgId}/integrations/${integrationId}`
|
|
157
|
+
);
|
|
158
|
+
},
|
|
159
|
+
async delete(orgId, integrationId) {
|
|
160
|
+
await fetcher(
|
|
161
|
+
`/api/organizations/${orgId}/integrations/${integrationId}`,
|
|
162
|
+
{ method: "DELETE" }
|
|
163
|
+
);
|
|
164
|
+
},
|
|
165
|
+
async test(orgId, integrationId) {
|
|
166
|
+
return fetcher(
|
|
167
|
+
`/api/organizations/${orgId}/integrations/${integrationId}/test`,
|
|
168
|
+
{ method: "POST" }
|
|
169
|
+
);
|
|
170
|
+
},
|
|
171
|
+
async listTargets(orgId, integrationId, parentId) {
|
|
172
|
+
const query = parentId ? `?parentId=${encodeURIComponent(parentId)}` : "";
|
|
173
|
+
return fetcher(
|
|
174
|
+
`/api/organizations/${orgId}/integrations/${integrationId}/targets${query}`
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// src/api/client.ts
|
|
181
|
+
var ApiError = class extends Error {
|
|
182
|
+
status;
|
|
183
|
+
constructor(status, message) {
|
|
184
|
+
super(message);
|
|
185
|
+
this.name = "ApiError";
|
|
186
|
+
this.status = status;
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
function createFetcher(config) {
|
|
190
|
+
return async (path, init) => {
|
|
191
|
+
const res = await fetch(`${config.endpoint}${path}`, {
|
|
192
|
+
...init,
|
|
193
|
+
headers: {
|
|
194
|
+
"Content-Type": "application/json",
|
|
195
|
+
Authorization: `Bearer ${config.token}`,
|
|
196
|
+
...init?.headers
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
if (!res.ok) {
|
|
200
|
+
const body = await res.json().catch(() => ({}));
|
|
201
|
+
throw new ApiError(
|
|
202
|
+
res.status,
|
|
203
|
+
body.error || res.statusText
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
if (res.status === 204) return null;
|
|
207
|
+
return res.json();
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function createClient(config) {
|
|
211
|
+
const fetcher = createFetcher(config);
|
|
212
|
+
return {
|
|
213
|
+
feedback: createFeedbackAPI(fetcher),
|
|
214
|
+
triage: createTriageAPI(fetcher),
|
|
215
|
+
drafts: createDraftsAPI(fetcher),
|
|
216
|
+
projects: createProjectsAPI(fetcher),
|
|
217
|
+
orgs: createOrgsAPI(fetcher),
|
|
218
|
+
user: createUserAPI(fetcher),
|
|
219
|
+
integrations: createIntegrationsAPI(fetcher)
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
export {
|
|
223
|
+
ApiError,
|
|
224
|
+
createClient
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/api/feedback.ts","../../src/api/triage.ts","../../src/api/drafts.ts","../../src/api/projects.ts","../../src/api/orgs.ts","../../src/api/tokens.ts","../../src/api/integrations.ts","../../src/api/client.ts"],"sourcesContent":["import type { Fetcher } from './client';\nimport type {\n FeedbackRow,\n FeedbackListParams,\n FeedbackUpdateParams,\n PaginatedResponse,\n} from './types';\n\nfunction buildQuery(params: FeedbackListParams): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n for (const v of value) {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(v)}`);\n }\n } else {\n parts.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n );\n }\n }\n return parts.length > 0 ? `?${parts.join('&')}` : '';\n}\n\nexport function createFeedbackAPI(fetcher: Fetcher) {\n return {\n async list(\n orgId: string,\n projectId: string,\n params: FeedbackListParams = {}\n ): Promise<PaginatedResponse<FeedbackRow>> {\n const query = buildQuery(params);\n return fetcher<PaginatedResponse<FeedbackRow>>(\n `/api/organizations/${orgId}/projects/${projectId}/feedback${query}`\n );\n },\n\n async get(\n orgId: string,\n projectId: string,\n feedbackId: string\n ): Promise<FeedbackRow> {\n return fetcher<FeedbackRow>(\n `/api/organizations/${orgId}/projects/${projectId}/feedback/${feedbackId}`\n );\n },\n\n async update(\n orgId: string,\n projectId: string,\n feedbackId: string,\n params: FeedbackUpdateParams\n ): Promise<FeedbackRow> {\n return fetcher<FeedbackRow>(\n `/api/organizations/${orgId}/projects/${projectId}/feedback/${feedbackId}`,\n {\n method: 'PATCH',\n body: JSON.stringify(params),\n }\n );\n },\n\n async delete(\n orgId: string,\n projectId: string,\n feedbackId: string\n ): Promise<void> {\n await fetcher(\n `/api/organizations/${orgId}/projects/${projectId}/feedback/${feedbackId}`,\n { method: 'DELETE' }\n );\n },\n };\n}\n","import type { Fetcher } from './client';\nimport type { TriageResult } from './types';\n\nexport function createTriageAPI(fetcher: Fetcher) {\n return {\n async run(orgId: string, projectId: string): Promise<TriageResult> {\n return fetcher<TriageResult>(\n `/api/organizations/${orgId}/projects/${projectId}/triage`,\n { method: 'POST' }\n );\n },\n };\n}\n","import type { Fetcher } from './client';\nimport type { IssueDraftRow, DraftUpdateParams } from './types';\n\nexport function createDraftsAPI(fetcher: Fetcher) {\n return {\n async list(\n orgId: string,\n projectId: string,\n params: { status?: string; composed_by?: string } = {}\n ): Promise<IssueDraftRow[]> {\n const query = new URLSearchParams();\n query.set('projectId', projectId);\n if (params.status) query.set('status', params.status);\n if (params.composed_by) query.set('composed_by', params.composed_by);\n return fetcher<IssueDraftRow[]>(\n `/api/organizations/${orgId}/issue-drafts?${query.toString()}`\n );\n },\n\n async get(orgId: string, draftId: string): Promise<IssueDraftRow> {\n return fetcher<IssueDraftRow>(\n `/api/organizations/${orgId}/issue-drafts/${draftId}`\n );\n },\n\n async update(\n orgId: string,\n draftId: string,\n params: DraftUpdateParams\n ): Promise<IssueDraftRow> {\n return fetcher<IssueDraftRow>(\n `/api/organizations/${orgId}/issue-drafts/${draftId}`,\n {\n method: 'PATCH',\n body: JSON.stringify(params),\n }\n );\n },\n\n async submit(\n orgId: string,\n draftId: string\n ): Promise<{ external_url: string }> {\n return fetcher<{ external_url: string }>(\n `/api/organizations/${orgId}/issue-drafts/${draftId}/submit`,\n { method: 'POST' }\n );\n },\n };\n}\n","import type { Fetcher } from './client';\nimport type { ProjectRow } from './types';\n\nexport function createProjectsAPI(fetcher: Fetcher) {\n return {\n async list(orgId: string): Promise<ProjectRow[]> {\n return fetcher<ProjectRow[]>(`/api/organizations/${orgId}/projects`);\n },\n };\n}\n","import type { Fetcher } from './client';\nimport type { OrganizationRow } from './types';\n\nexport function createOrgsAPI(fetcher: Fetcher) {\n return {\n async list(): Promise<OrganizationRow[]> {\n return fetcher<OrganizationRow[]>('/api/organizations');\n },\n };\n}\n","import type { Fetcher } from './client';\nimport type { TokenRow } from './types';\n\nexport function createUserAPI(fetcher: Fetcher) {\n return {\n async createToken(\n label: string,\n expiresAt?: string | null\n ): Promise<TokenRow> {\n return fetcher<TokenRow>('/api/user/tokens', {\n method: 'POST',\n body: JSON.stringify({\n label,\n expires_at: expiresAt ?? null,\n }),\n });\n },\n\n async listTokens(): Promise<TokenRow[]> {\n return fetcher<TokenRow[]>('/api/user/tokens');\n },\n\n async revokeToken(tokenId: string): Promise<void> {\n await fetcher(`/api/user/tokens/${tokenId}`, {\n method: 'DELETE',\n });\n },\n };\n}\n","import type { Fetcher } from './client';\nimport type {\n IntegrationRow,\n CreateIntegrationParams,\n TestConnectionResult,\n TargetOption,\n} from './types';\n\nexport function createIntegrationsAPI(fetcher: Fetcher) {\n return {\n async list(orgId: string): Promise<IntegrationRow[]> {\n return fetcher<IntegrationRow[]>(\n `/api/organizations/${orgId}/integrations`\n );\n },\n\n async create(\n orgId: string,\n params: CreateIntegrationParams\n ): Promise<IntegrationRow> {\n return fetcher<IntegrationRow>(\n `/api/organizations/${orgId}/integrations`,\n {\n method: 'POST',\n body: JSON.stringify(params),\n }\n );\n },\n\n async get(\n orgId: string,\n integrationId: string\n ): Promise<IntegrationRow> {\n return fetcher<IntegrationRow>(\n `/api/organizations/${orgId}/integrations/${integrationId}`\n );\n },\n\n async delete(orgId: string, integrationId: string): Promise<void> {\n await fetcher(\n `/api/organizations/${orgId}/integrations/${integrationId}`,\n { method: 'DELETE' }\n );\n },\n\n async test(\n orgId: string,\n integrationId: string\n ): Promise<TestConnectionResult> {\n return fetcher<TestConnectionResult>(\n `/api/organizations/${orgId}/integrations/${integrationId}/test`,\n { method: 'POST' }\n );\n },\n\n async listTargets(\n orgId: string,\n integrationId: string,\n parentId?: string\n ): Promise<TargetOption[]> {\n const query = parentId\n ? `?parentId=${encodeURIComponent(parentId)}`\n : '';\n return fetcher<TargetOption[]>(\n `/api/organizations/${orgId}/integrations/${integrationId}/targets${query}`\n );\n },\n };\n}\n","import { createFeedbackAPI } from './feedback';\nimport { createTriageAPI } from './triage';\nimport { createDraftsAPI } from './drafts';\nimport { createProjectsAPI } from './projects';\nimport { createOrgsAPI } from './orgs';\nimport { createUserAPI } from './tokens';\nimport { createIntegrationsAPI } from './integrations';\n\nexport interface ClientConfig {\n endpoint: string;\n token: string;\n}\n\nexport class ApiError extends Error {\n status: number;\n constructor(status: number, message: string) {\n super(message);\n this.name = 'ApiError';\n this.status = status;\n }\n}\n\nexport type Fetcher = <T = unknown>(\n path: string,\n init?: RequestInit\n) => Promise<T>;\n\nfunction createFetcher(config: ClientConfig): Fetcher {\n return async <T = unknown>(path: string, init?: RequestInit): Promise<T> => {\n const res = await fetch(`${config.endpoint}${path}`, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${config.token}`,\n ...init?.headers,\n },\n });\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new ApiError(\n res.status,\n (body as Record<string, string>).error || res.statusText\n );\n }\n if (res.status === 204) return null as T;\n return res.json() as Promise<T>;\n };\n}\n\nexport function createClient(config: ClientConfig) {\n const fetcher = createFetcher(config);\n return {\n feedback: createFeedbackAPI(fetcher),\n triage: createTriageAPI(fetcher),\n drafts: createDraftsAPI(fetcher),\n projects: createProjectsAPI(fetcher),\n orgs: createOrgsAPI(fetcher),\n user: createUserAPI(fetcher),\n integrations: createIntegrationsAPI(fetcher),\n };\n}\n\nexport type UidexClient = ReturnType<typeof createClient>;\n"],"mappings":"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","names":[]}
|