hibi-client 0.0.0 → 0.1.1
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/dist/index.cjs +193 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +261 -3
- package/dist/index.d.ts +261 -3
- package/dist/index.js +181 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -2
package/dist/index.cjs
CHANGED
|
@@ -1,21 +1,177 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var types = require('@hibi/types');
|
|
4
3
|
var zod = require('zod');
|
|
5
4
|
|
|
6
|
-
// src/
|
|
7
|
-
var
|
|
5
|
+
// src/_vendored/hibi-types/account.ts
|
|
6
|
+
var UUIDSchema = zod.z.uuid();
|
|
7
|
+
var TimestampSchema = zod.z.iso.datetime({ offset: true });
|
|
8
|
+
zod.z.object({
|
|
9
|
+
limit: zod.z.coerce.number().int().min(1).max(200).default(50),
|
|
10
|
+
cursor: zod.z.string().optional()
|
|
11
|
+
});
|
|
12
|
+
var PaginatedSchema = (item) => zod.z.object({
|
|
13
|
+
items: zod.z.array(item),
|
|
14
|
+
nextCursor: zod.z.string().nullable()
|
|
15
|
+
});
|
|
16
|
+
zod.z.object({
|
|
17
|
+
error: zod.z.object({
|
|
18
|
+
code: zod.z.string(),
|
|
19
|
+
message: zod.z.string(),
|
|
20
|
+
details: zod.z.unknown().optional()
|
|
21
|
+
})
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// src/_vendored/hibi-types/account.ts
|
|
25
|
+
zod.z.object({
|
|
26
|
+
id: UUIDSchema,
|
|
27
|
+
email: zod.z.email(),
|
|
28
|
+
createdAt: TimestampSchema
|
|
29
|
+
});
|
|
30
|
+
var ApiKeySchema = zod.z.object({
|
|
31
|
+
id: UUIDSchema,
|
|
32
|
+
name: zod.z.string().min(1).max(80),
|
|
33
|
+
lastUsedAt: TimestampSchema.nullable(),
|
|
34
|
+
createdAt: TimestampSchema,
|
|
35
|
+
revokedAt: TimestampSchema.nullable()
|
|
36
|
+
});
|
|
37
|
+
zod.z.object({
|
|
38
|
+
name: zod.z.string().min(1).max(80)
|
|
39
|
+
});
|
|
40
|
+
zod.z.object({
|
|
41
|
+
apiKey: ApiKeySchema,
|
|
42
|
+
rawKey: zod.z.string()
|
|
43
|
+
});
|
|
44
|
+
var FuriganaPairSchema = zod.z.object({
|
|
45
|
+
base: zod.z.string(),
|
|
46
|
+
reading: zod.z.string()
|
|
47
|
+
});
|
|
48
|
+
var KanjiEntrySchema = zod.z.object({
|
|
49
|
+
kanji: zod.z.string().length(1),
|
|
50
|
+
meaning: zod.z.string(),
|
|
51
|
+
wanikaniLevel: zod.z.number().int().min(1).max(60).nullable()
|
|
52
|
+
});
|
|
53
|
+
var CardSchema = zod.z.object({
|
|
54
|
+
id: UUIDSchema,
|
|
55
|
+
userId: UUIDSchema,
|
|
56
|
+
createdAt: TimestampSchema,
|
|
57
|
+
updatedAt: TimestampSchema,
|
|
58
|
+
sentence: zod.z.string().min(1),
|
|
59
|
+
focusWord: zod.z.string().min(1),
|
|
60
|
+
focusWordReading: zod.z.string().min(1),
|
|
61
|
+
furigana: zod.z.array(FuriganaPairSchema),
|
|
62
|
+
english: zod.z.string(),
|
|
63
|
+
glosses: zod.z.array(zod.z.string()),
|
|
64
|
+
grammarNote: zod.z.string().nullable(),
|
|
65
|
+
kanjiList: zod.z.array(KanjiEntrySchema),
|
|
66
|
+
imageKey: zod.z.string().nullable(),
|
|
67
|
+
audioKey: zod.z.string().nullable(),
|
|
68
|
+
source: zod.z.string(),
|
|
69
|
+
tags: zod.z.array(zod.z.string())
|
|
70
|
+
});
|
|
71
|
+
var CreateCardInputSchema = CardSchema.omit({
|
|
72
|
+
id: true,
|
|
73
|
+
userId: true,
|
|
74
|
+
createdAt: true,
|
|
75
|
+
updatedAt: true
|
|
76
|
+
});
|
|
77
|
+
var UpdateCardInputSchema = CreateCardInputSchema.partial();
|
|
78
|
+
zod.z.object({
|
|
79
|
+
limit: zod.z.coerce.number().int().min(1).max(200).default(50),
|
|
80
|
+
cursor: zod.z.string().optional(),
|
|
81
|
+
tag: zod.z.string().optional(),
|
|
82
|
+
source: zod.z.string().optional()
|
|
83
|
+
});
|
|
84
|
+
var CardStateSchema = zod.z.enum(["new", "learning", "review", "relearning"]);
|
|
85
|
+
var ReviewRatingSchema = zod.z.union([zod.z.literal(1), zod.z.literal(2), zod.z.literal(3), zod.z.literal(4)]);
|
|
86
|
+
var ReviewSchema = zod.z.object({
|
|
87
|
+
id: UUIDSchema,
|
|
88
|
+
userId: UUIDSchema,
|
|
89
|
+
cardId: UUIDSchema,
|
|
90
|
+
rating: ReviewRatingSchema,
|
|
91
|
+
reviewedAt: TimestampSchema,
|
|
92
|
+
elapsedDays: zod.z.number(),
|
|
93
|
+
scheduledDays: zod.z.number(),
|
|
94
|
+
stateBefore: CardStateSchema,
|
|
95
|
+
stateAfter: CardStateSchema
|
|
96
|
+
});
|
|
97
|
+
var CardStateRowSchema = zod.z.object({
|
|
98
|
+
cardId: UUIDSchema,
|
|
99
|
+
userId: UUIDSchema,
|
|
100
|
+
due: TimestampSchema,
|
|
101
|
+
stability: zod.z.number(),
|
|
102
|
+
difficulty: zod.z.number(),
|
|
103
|
+
elapsedDays: zod.z.number(),
|
|
104
|
+
scheduledDays: zod.z.number(),
|
|
105
|
+
reps: zod.z.number().int().nonnegative(),
|
|
106
|
+
lapses: zod.z.number().int().nonnegative(),
|
|
107
|
+
learningSteps: zod.z.number().int().nonnegative(),
|
|
108
|
+
state: CardStateSchema,
|
|
109
|
+
lastReview: TimestampSchema.nullable()
|
|
110
|
+
});
|
|
111
|
+
zod.z.object({
|
|
112
|
+
limit: zod.z.coerce.number().int().min(1).max(200).default(50),
|
|
113
|
+
before: TimestampSchema.optional()
|
|
114
|
+
});
|
|
115
|
+
var SubmitReviewInputSchema = zod.z.object({
|
|
116
|
+
cardId: UUIDSchema,
|
|
117
|
+
rating: ReviewRatingSchema,
|
|
118
|
+
reviewedAt: TimestampSchema.optional()
|
|
119
|
+
});
|
|
120
|
+
var SubmitReviewResultSchema = zod.z.object({
|
|
121
|
+
review: ReviewSchema,
|
|
122
|
+
cardState: CardStateRowSchema
|
|
123
|
+
});
|
|
124
|
+
var HeatmapDaySchema = zod.z.object({
|
|
125
|
+
date: zod.z.iso.date(),
|
|
126
|
+
count: zod.z.number().int().nonnegative()
|
|
127
|
+
});
|
|
128
|
+
zod.z.object({
|
|
129
|
+
year: zod.z.coerce.number().int().min(2e3).max(2100)
|
|
130
|
+
});
|
|
131
|
+
var HeatmapResponseSchema = zod.z.object({
|
|
132
|
+
year: zod.z.number().int(),
|
|
133
|
+
days: zod.z.array(HeatmapDaySchema)
|
|
134
|
+
});
|
|
135
|
+
var RetentionPointSchema = zod.z.object({
|
|
136
|
+
intervalDays: zod.z.number().int().nonnegative(),
|
|
137
|
+
retention: zod.z.number().min(0).max(1),
|
|
138
|
+
sampleSize: zod.z.number().int().nonnegative()
|
|
139
|
+
});
|
|
140
|
+
var RetentionResponseSchema = zod.z.object({
|
|
141
|
+
generatedAt: TimestampSchema,
|
|
142
|
+
points: zod.z.array(RetentionPointSchema)
|
|
143
|
+
});
|
|
144
|
+
zod.z.object({
|
|
145
|
+
from: zod.z.iso.date(),
|
|
146
|
+
to: zod.z.iso.date()
|
|
147
|
+
});
|
|
148
|
+
var DailyCountSchema = zod.z.object({
|
|
149
|
+
date: zod.z.iso.date(),
|
|
150
|
+
reviews: zod.z.number().int().nonnegative(),
|
|
151
|
+
again: zod.z.number().int().nonnegative(),
|
|
152
|
+
hard: zod.z.number().int().nonnegative(),
|
|
153
|
+
good: zod.z.number().int().nonnegative(),
|
|
154
|
+
easy: zod.z.number().int().nonnegative()
|
|
155
|
+
});
|
|
156
|
+
var DailyCountResponseSchema = zod.z.object({
|
|
157
|
+
days: zod.z.array(DailyCountSchema)
|
|
158
|
+
});
|
|
159
|
+
var PaginatedCardSchema = PaginatedSchema(CardSchema);
|
|
8
160
|
var DueResponseSchema = zod.z.object({
|
|
9
161
|
items: zod.z.array(
|
|
10
|
-
zod.z.object({ card:
|
|
162
|
+
zod.z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState })
|
|
11
163
|
)
|
|
12
164
|
});
|
|
165
|
+
var UploadAudioResponseSchema = zod.z.object({ key: zod.z.string() });
|
|
13
166
|
function asError(status, body) {
|
|
14
167
|
const err = new Error(`Hibi API error: ${status}`);
|
|
15
168
|
err.status = status;
|
|
16
169
|
err.body = body;
|
|
17
170
|
return err;
|
|
18
171
|
}
|
|
172
|
+
function isFormData(value) {
|
|
173
|
+
return typeof FormData !== "undefined" && value instanceof FormData;
|
|
174
|
+
}
|
|
19
175
|
function createHibiClient(config) {
|
|
20
176
|
const fetchImpl = config.fetch ?? fetch;
|
|
21
177
|
const base = config.baseUrl.replace(/\/+$/, "");
|
|
@@ -31,8 +187,12 @@ function createHibiClient(config) {
|
|
|
31
187
|
};
|
|
32
188
|
const requestInit = { method, headers };
|
|
33
189
|
if (init.body !== void 0) {
|
|
34
|
-
|
|
35
|
-
|
|
190
|
+
if (isFormData(init.body)) {
|
|
191
|
+
requestInit.body = init.body;
|
|
192
|
+
} else {
|
|
193
|
+
headers["Content-Type"] = "application/json";
|
|
194
|
+
requestInit.body = JSON.stringify(init.body);
|
|
195
|
+
}
|
|
36
196
|
}
|
|
37
197
|
const res = await fetchImpl(url.toString(), requestInit);
|
|
38
198
|
if (res.status === 204) return void 0;
|
|
@@ -41,11 +201,21 @@ function createHibiClient(config) {
|
|
|
41
201
|
if (!res.ok) throw asError(res.status, body);
|
|
42
202
|
return schema.parse(body);
|
|
43
203
|
}
|
|
204
|
+
function buildAudioForm(input) {
|
|
205
|
+
const fd = new FormData();
|
|
206
|
+
if (typeof Blob !== "undefined" && input instanceof Blob) {
|
|
207
|
+
const name = "name" in input && typeof input.name === "string" ? input.name : "clip.m4a";
|
|
208
|
+
fd.append("file", input, name);
|
|
209
|
+
} else {
|
|
210
|
+
fd.append("file", input);
|
|
211
|
+
}
|
|
212
|
+
return fd;
|
|
213
|
+
}
|
|
44
214
|
return {
|
|
45
215
|
cards: {
|
|
46
216
|
async create(input) {
|
|
47
|
-
const validated =
|
|
48
|
-
return request("POST", "/v1/cards",
|
|
217
|
+
const validated = CreateCardInputSchema.parse(input);
|
|
218
|
+
return request("POST", "/v1/cards", CardSchema, { body: validated });
|
|
49
219
|
},
|
|
50
220
|
async list(query = { limit: 50 }) {
|
|
51
221
|
return request("GET", "/v1/cards", PaginatedCardSchema, {
|
|
@@ -53,16 +223,23 @@ function createHibiClient(config) {
|
|
|
53
223
|
});
|
|
54
224
|
},
|
|
55
225
|
async get(id) {
|
|
56
|
-
return request("GET", `/v1/cards/${id}`,
|
|
226
|
+
return request("GET", `/v1/cards/${id}`, CardSchema);
|
|
57
227
|
},
|
|
58
228
|
async update(id, input) {
|
|
59
|
-
const validated =
|
|
60
|
-
return request("PATCH", `/v1/cards/${id}`,
|
|
229
|
+
const validated = UpdateCardInputSchema.parse(input);
|
|
230
|
+
return request("PATCH", `/v1/cards/${id}`, CardSchema, { body: validated });
|
|
61
231
|
},
|
|
62
232
|
async remove(id) {
|
|
63
233
|
await request("DELETE", `/v1/cards/${id}`, zod.z.unknown());
|
|
64
234
|
}
|
|
65
235
|
},
|
|
236
|
+
uploads: {
|
|
237
|
+
async audio(input) {
|
|
238
|
+
return request("POST", "/v1/uploads/audio", UploadAudioResponseSchema, {
|
|
239
|
+
body: buildAudioForm(input)
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
},
|
|
66
243
|
reviews: {
|
|
67
244
|
async due(query = {}) {
|
|
68
245
|
return request("GET", "/v1/reviews/due", DueResponseSchema, {
|
|
@@ -70,21 +247,21 @@ function createHibiClient(config) {
|
|
|
70
247
|
});
|
|
71
248
|
},
|
|
72
249
|
async submit(input) {
|
|
73
|
-
const validated =
|
|
74
|
-
return request("POST", "/v1/reviews",
|
|
250
|
+
const validated = SubmitReviewInputSchema.parse(input);
|
|
251
|
+
return request("POST", "/v1/reviews", SubmitReviewResultSchema, { body: validated });
|
|
75
252
|
}
|
|
76
253
|
},
|
|
77
254
|
stats: {
|
|
78
255
|
async heatmap(query) {
|
|
79
|
-
return request("GET", "/v1/stats/heatmap",
|
|
256
|
+
return request("GET", "/v1/stats/heatmap", HeatmapResponseSchema, {
|
|
80
257
|
query: { year: query.year }
|
|
81
258
|
});
|
|
82
259
|
},
|
|
83
260
|
async retention() {
|
|
84
|
-
return request("GET", "/v1/stats/retention",
|
|
261
|
+
return request("GET", "/v1/stats/retention", RetentionResponseSchema);
|
|
85
262
|
},
|
|
86
263
|
async daily(query) {
|
|
87
|
-
return request("GET", "/v1/stats/daily",
|
|
264
|
+
return request("GET", "/v1/stats/daily", DailyCountResponseSchema, {
|
|
88
265
|
query: { from: query.from, to: query.to }
|
|
89
266
|
});
|
|
90
267
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"names":["PaginatedSchema","CardSchema","z","SubmitReviewResultSchema","CreateCardInputSchema","UpdateCardInputSchema","SubmitReviewInputSchema","HeatmapResponseSchema","RetentionResponseSchema","DailyCountResponseSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n CardSchema,\n type CreateCardInput,\n CreateCardInputSchema,\n type DailyCountQuery,\n DailyCountResponseSchema,\n type HeatmapQuery,\n HeatmapResponseSchema,\n type ListCardsQuery,\n PaginatedSchema,\n RetentionResponseSchema,\n type SubmitReviewInput,\n SubmitReviewInputSchema,\n SubmitReviewResultSchema,\n type UpdateCardInput,\n UpdateCardInputSchema,\n} from \"@hibi/types\";\nimport { z } from \"zod\";\n\nexport interface HibiClientConfig {\n apiKey: string;\n baseUrl: string;\n fetch?: typeof fetch;\n}\n\nexport interface HibiClientError extends Error {\n status: number;\n body: unknown;\n}\n\nconst PaginatedCardSchema = PaginatedSchema(CardSchema);\nconst DueResponseSchema = z.object({\n items: z.array(\n z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState }),\n ),\n});\n\nfunction asError(status: number, body: unknown): HibiClientError {\n const err = new Error(`Hibi API error: ${status}`) as HibiClientError;\n err.status = status;\n err.body = body;\n return err;\n}\n\nexport function createHibiClient(config: HibiClientConfig) {\n const fetchImpl = config.fetch ?? fetch;\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n\n async function request<T>(\n method: string,\n path: string,\n schema: z.ZodType<T>,\n init: { body?: unknown; query?: Record<string, string | number | undefined> } = {},\n ): Promise<T> {\n const url = new URL(`${base}${path}`);\n if (init.query) {\n for (const [k, v] of Object.entries(init.query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n const requestInit: RequestInit = { method, headers };\n if (init.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n requestInit.body = JSON.stringify(init.body);\n }\n\n const res = await fetchImpl(url.toString(), requestInit);\n\n if (res.status === 204) return undefined as T;\n\n const text = await res.text();\n const body = text ? JSON.parse(text) : null;\n\n if (!res.ok) throw asError(res.status, body);\n return schema.parse(body);\n }\n\n return {\n cards: {\n async create(input: CreateCardInput) {\n const validated = CreateCardInputSchema.parse(input);\n return request(\"POST\", \"/v1/cards\", CardSchema, { body: validated });\n },\n async list(query: ListCardsQuery = { limit: 50 }) {\n return request(\"GET\", \"/v1/cards\", PaginatedCardSchema, {\n query: { limit: query.limit, cursor: query.cursor, tag: query.tag, source: query.source },\n });\n },\n async get(id: string) {\n return request(\"GET\", `/v1/cards/${id}`, CardSchema);\n },\n async update(id: string, input: UpdateCardInput) {\n const validated = UpdateCardInputSchema.parse(input);\n return request(\"PATCH\", `/v1/cards/${id}`, CardSchema, { body: validated });\n },\n async remove(id: string): Promise<void> {\n await request(\"DELETE\", `/v1/cards/${id}`, z.unknown());\n },\n },\n\n reviews: {\n async due(query: { limit?: number; before?: string } = {}) {\n return request(\"GET\", \"/v1/reviews/due\", DueResponseSchema, {\n query: { limit: query.limit, before: query.before },\n });\n },\n async submit(input: SubmitReviewInput) {\n const validated = SubmitReviewInputSchema.parse(input);\n return request(\"POST\", \"/v1/reviews\", SubmitReviewResultSchema, { body: validated });\n },\n },\n\n stats: {\n async heatmap(query: HeatmapQuery) {\n return request(\"GET\", \"/v1/stats/heatmap\", HeatmapResponseSchema, {\n query: { year: query.year },\n });\n },\n async retention() {\n return request(\"GET\", \"/v1/stats/retention\", RetentionResponseSchema);\n },\n async daily(query: DailyCountQuery) {\n return request(\"GET\", \"/v1/stats/daily\", DailyCountResponseSchema, {\n query: { from: query.from, to: query.to },\n });\n },\n },\n };\n}\n\nexport type HibiClient = ReturnType<typeof createHibiClient>;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/_vendored/hibi-types/common.ts","../src/_vendored/hibi-types/account.ts","../src/_vendored/hibi-types/cards.ts","../src/_vendored/hibi-types/reviews.ts","../src/_vendored/hibi-types/stats.ts","../src/client.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\nexport const UUIDSchema = z.uuid();\n\nexport const TimestampSchema = z.iso.datetime({ offset: true });\n\nexport const PaginationQuerySchema = z.object({\n limit: z.coerce.number().int().min(1).max(200).default(50),\n cursor: z.string().optional(),\n});\n\nexport type PaginationQuery = z.infer<typeof PaginationQuerySchema>;\n\nexport const PaginatedSchema = <T extends z.ZodTypeAny>(item: T) =>\n z.object({\n items: z.array(item),\n nextCursor: z.string().nullable(),\n });\n\nexport const ErrorResponseSchema = z.object({\n error: z.object({\n code: z.string(),\n message: z.string(),\n details: z.unknown().optional(),\n }),\n});\n\nexport type ErrorResponse = z.infer<typeof ErrorResponseSchema>;\n","import { z } from \"zod\";\nimport { TimestampSchema, UUIDSchema } from \"./common.ts\";\n\nexport const AccountSchema = z.object({\n id: UUIDSchema,\n email: z.email(),\n createdAt: TimestampSchema,\n});\nexport type Account = z.infer<typeof AccountSchema>;\n\nexport const ApiKeySchema = z.object({\n id: UUIDSchema,\n name: z.string().min(1).max(80),\n lastUsedAt: TimestampSchema.nullable(),\n createdAt: TimestampSchema,\n revokedAt: TimestampSchema.nullable(),\n});\nexport type ApiKey = z.infer<typeof ApiKeySchema>;\n\nexport const CreateApiKeyInputSchema = z.object({\n name: z.string().min(1).max(80),\n});\nexport type CreateApiKeyInput = z.infer<typeof CreateApiKeyInputSchema>;\n\nexport const CreateApiKeyResponseSchema = z.object({\n apiKey: ApiKeySchema,\n rawKey: z.string(),\n});\nexport type CreateApiKeyResponse = z.infer<typeof CreateApiKeyResponseSchema>;\n","import { z } from \"zod\";\nimport { TimestampSchema, UUIDSchema } from \"./common.ts\";\n\nexport const FuriganaPairSchema = z.object({\n base: z.string(),\n reading: z.string(),\n});\nexport type FuriganaPair = z.infer<typeof FuriganaPairSchema>;\n\nexport const KanjiEntrySchema = z.object({\n kanji: z.string().length(1),\n meaning: z.string(),\n wanikaniLevel: z.number().int().min(1).max(60).nullable(),\n});\nexport type KanjiEntry = z.infer<typeof KanjiEntrySchema>;\n\nexport const CardSchema = z.object({\n id: UUIDSchema,\n userId: UUIDSchema,\n createdAt: TimestampSchema,\n updatedAt: TimestampSchema,\n\n sentence: z.string().min(1),\n focusWord: z.string().min(1),\n focusWordReading: z.string().min(1),\n furigana: z.array(FuriganaPairSchema),\n english: z.string(),\n glosses: z.array(z.string()),\n grammarNote: z.string().nullable(),\n kanjiList: z.array(KanjiEntrySchema),\n\n imageKey: z.string().nullable(),\n audioKey: z.string().nullable(),\n\n source: z.string(),\n tags: z.array(z.string()),\n});\nexport type Card = z.infer<typeof CardSchema>;\n\nexport const CreateCardInputSchema = CardSchema.omit({\n id: true,\n userId: true,\n createdAt: true,\n updatedAt: true,\n});\nexport type CreateCardInput = z.infer<typeof CreateCardInputSchema>;\n\nexport const UpdateCardInputSchema = CreateCardInputSchema.partial();\nexport type UpdateCardInput = z.infer<typeof UpdateCardInputSchema>;\n\nexport const ListCardsQuerySchema = z.object({\n limit: z.coerce.number().int().min(1).max(200).default(50),\n cursor: z.string().optional(),\n tag: z.string().optional(),\n source: z.string().optional(),\n});\nexport type ListCardsQuery = z.infer<typeof ListCardsQuerySchema>;\n","import { z } from \"zod\";\nimport { TimestampSchema, UUIDSchema } from \"./common.ts\";\n\nexport const CardStateSchema = z.enum([\"new\", \"learning\", \"review\", \"relearning\"]);\nexport type CardStateValue = z.infer<typeof CardStateSchema>;\n\nexport const ReviewRatingSchema = z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]);\nexport type ReviewRating = z.infer<typeof ReviewRatingSchema>;\n\nexport const ReviewSchema = z.object({\n id: UUIDSchema,\n userId: UUIDSchema,\n cardId: UUIDSchema,\n rating: ReviewRatingSchema,\n reviewedAt: TimestampSchema,\n elapsedDays: z.number(),\n scheduledDays: z.number(),\n stateBefore: CardStateSchema,\n stateAfter: CardStateSchema,\n});\nexport type Review = z.infer<typeof ReviewSchema>;\n\nexport const CardStateRowSchema = z.object({\n cardId: UUIDSchema,\n userId: UUIDSchema,\n due: TimestampSchema,\n stability: z.number(),\n difficulty: z.number(),\n elapsedDays: z.number(),\n scheduledDays: z.number(),\n reps: z.number().int().nonnegative(),\n lapses: z.number().int().nonnegative(),\n learningSteps: z.number().int().nonnegative(),\n state: CardStateSchema,\n lastReview: TimestampSchema.nullable(),\n});\nexport type CardStateRow = z.infer<typeof CardStateRowSchema>;\n\nexport const DueReviewsQuerySchema = z.object({\n limit: z.coerce.number().int().min(1).max(200).default(50),\n before: TimestampSchema.optional(),\n});\nexport type DueReviewsQuery = z.infer<typeof DueReviewsQuerySchema>;\n\nexport const SubmitReviewInputSchema = z.object({\n cardId: UUIDSchema,\n rating: ReviewRatingSchema,\n reviewedAt: TimestampSchema.optional(),\n});\nexport type SubmitReviewInput = z.infer<typeof SubmitReviewInputSchema>;\n\nexport const SubmitReviewResultSchema = z.object({\n review: ReviewSchema,\n cardState: CardStateRowSchema,\n});\nexport type SubmitReviewResult = z.infer<typeof SubmitReviewResultSchema>;\n","import { z } from \"zod\";\nimport { TimestampSchema } from \"./common.ts\";\n\nexport const HeatmapDaySchema = z.object({\n date: z.iso.date(),\n count: z.number().int().nonnegative(),\n});\nexport type HeatmapDay = z.infer<typeof HeatmapDaySchema>;\n\nexport const HeatmapQuerySchema = z.object({\n year: z.coerce.number().int().min(2000).max(2100),\n});\nexport type HeatmapQuery = z.infer<typeof HeatmapQuerySchema>;\n\nexport const HeatmapResponseSchema = z.object({\n year: z.number().int(),\n days: z.array(HeatmapDaySchema),\n});\nexport type HeatmapResponse = z.infer<typeof HeatmapResponseSchema>;\n\nexport const RetentionPointSchema = z.object({\n intervalDays: z.number().int().nonnegative(),\n retention: z.number().min(0).max(1),\n sampleSize: z.number().int().nonnegative(),\n});\nexport type RetentionPoint = z.infer<typeof RetentionPointSchema>;\n\nexport const RetentionResponseSchema = z.object({\n generatedAt: TimestampSchema,\n points: z.array(RetentionPointSchema),\n});\nexport type RetentionResponse = z.infer<typeof RetentionResponseSchema>;\n\nexport const DailyCountQuerySchema = z.object({\n from: z.iso.date(),\n to: z.iso.date(),\n});\nexport type DailyCountQuery = z.infer<typeof DailyCountQuerySchema>;\n\nexport const DailyCountSchema = z.object({\n date: z.iso.date(),\n reviews: z.number().int().nonnegative(),\n again: z.number().int().nonnegative(),\n hard: z.number().int().nonnegative(),\n good: z.number().int().nonnegative(),\n easy: z.number().int().nonnegative(),\n});\nexport type DailyCount = z.infer<typeof DailyCountSchema>;\n\nexport const DailyCountResponseSchema = z.object({\n days: z.array(DailyCountSchema),\n});\nexport type DailyCountResponse = z.infer<typeof DailyCountResponseSchema>;\n","import {\n CardSchema,\n type CreateCardInput,\n CreateCardInputSchema,\n type DailyCountQuery,\n DailyCountResponseSchema,\n type HeatmapQuery,\n HeatmapResponseSchema,\n type ListCardsQuery,\n PaginatedSchema,\n RetentionResponseSchema,\n type SubmitReviewInput,\n SubmitReviewInputSchema,\n SubmitReviewResultSchema,\n type UpdateCardInput,\n UpdateCardInputSchema,\n} from \"./_vendored/hibi-types/index.ts\";\nimport { z } from \"zod\";\n\nexport interface HibiClientConfig {\n apiKey: string;\n baseUrl: string;\n fetch?: typeof fetch;\n}\n\nexport interface HibiClientError extends Error {\n status: number;\n body: unknown;\n}\n\nconst PaginatedCardSchema = PaginatedSchema(CardSchema);\nconst DueResponseSchema = z.object({\n items: z.array(\n z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState }),\n ),\n});\nconst UploadAudioResponseSchema = z.object({ key: z.string() });\n\n// React-Native-style file reference. RN's FormData.append accepts this\n// shape directly; we type it explicitly so consumers can build it\n// without depending on RN-specific globals.\nexport type RNFileRef = { uri: string; name: string; type: string };\n\n// What client.uploads.audio() accepts. On web pass a Blob/File; on RN\n// pass an RNFileRef. In both cases the SDK builds the multipart body.\nexport type AudioUploadInput = Blob | RNFileRef;\n\nfunction asError(status: number, body: unknown): HibiClientError {\n const err = new Error(`Hibi API error: ${status}`) as HibiClientError;\n err.status = status;\n err.body = body;\n return err;\n}\n\nfunction isFormData(value: unknown): value is FormData {\n return typeof FormData !== \"undefined\" && value instanceof FormData;\n}\n\nexport function createHibiClient(config: HibiClientConfig) {\n const fetchImpl = config.fetch ?? fetch;\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n\n async function request<T>(\n method: string,\n path: string,\n schema: z.ZodType<T>,\n init: {\n body?: unknown;\n query?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${base}${path}`);\n if (init.query) {\n for (const [k, v] of Object.entries(init.query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n const requestInit: RequestInit = { method, headers };\n if (init.body !== undefined) {\n if (isFormData(init.body)) {\n // Don't set Content-Type for multipart — the runtime appends\n // the correct boundary. RN in particular breaks if we set it.\n requestInit.body = init.body;\n } else {\n headers[\"Content-Type\"] = \"application/json\";\n requestInit.body = JSON.stringify(init.body);\n }\n }\n\n const res = await fetchImpl(url.toString(), requestInit);\n\n if (res.status === 204) return undefined as T;\n\n const text = await res.text();\n const body = text ? JSON.parse(text) : null;\n\n if (!res.ok) throw asError(res.status, body);\n return schema.parse(body);\n }\n\n function buildAudioForm(input: AudioUploadInput): FormData {\n const fd = new FormData();\n if (typeof Blob !== \"undefined\" && input instanceof Blob) {\n // Blob/File on web/node20+. Pass a name so the server sees a filename.\n const name = \"name\" in input && typeof input.name === \"string\" ? input.name : \"clip.m4a\";\n fd.append(\"file\", input, name);\n } else {\n // RN file ref. The cast is unavoidable: RN's FormData accepts this\n // shape but the lib.dom.d.ts FormData type doesn't model it.\n fd.append(\"file\", input as unknown as Blob);\n }\n return fd;\n }\n\n return {\n cards: {\n async create(input: CreateCardInput) {\n const validated = CreateCardInputSchema.parse(input);\n return request(\"POST\", \"/v1/cards\", CardSchema, { body: validated });\n },\n async list(query: ListCardsQuery = { limit: 50 }) {\n return request(\"GET\", \"/v1/cards\", PaginatedCardSchema, {\n query: { limit: query.limit, cursor: query.cursor, tag: query.tag, source: query.source },\n });\n },\n async get(id: string) {\n return request(\"GET\", `/v1/cards/${id}`, CardSchema);\n },\n async update(id: string, input: UpdateCardInput) {\n const validated = UpdateCardInputSchema.parse(input);\n return request(\"PATCH\", `/v1/cards/${id}`, CardSchema, { body: validated });\n },\n async remove(id: string): Promise<void> {\n await request(\"DELETE\", `/v1/cards/${id}`, z.unknown());\n },\n },\n\n uploads: {\n async audio(input: AudioUploadInput) {\n return request(\"POST\", \"/v1/uploads/audio\", UploadAudioResponseSchema, {\n body: buildAudioForm(input),\n });\n },\n },\n\n reviews: {\n async due(query: { limit?: number; before?: string } = {}) {\n return request(\"GET\", \"/v1/reviews/due\", DueResponseSchema, {\n query: { limit: query.limit, before: query.before },\n });\n },\n async submit(input: SubmitReviewInput) {\n const validated = SubmitReviewInputSchema.parse(input);\n return request(\"POST\", \"/v1/reviews\", SubmitReviewResultSchema, { body: validated });\n },\n },\n\n stats: {\n async heatmap(query: HeatmapQuery) {\n return request(\"GET\", \"/v1/stats/heatmap\", HeatmapResponseSchema, {\n query: { year: query.year },\n });\n },\n async retention() {\n return request(\"GET\", \"/v1/stats/retention\", RetentionResponseSchema);\n },\n async daily(query: DailyCountQuery) {\n return request(\"GET\", \"/v1/stats/daily\", DailyCountResponseSchema, {\n query: { from: query.from, to: query.to },\n });\n },\n },\n };\n}\n\nexport type HibiClient = ReturnType<typeof createHibiClient>;\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,252 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
declare const FuriganaPairSchema: z.ZodObject<{
|
|
4
|
+
base: z.ZodString;
|
|
5
|
+
reading: z.ZodString;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
type FuriganaPair = z.infer<typeof FuriganaPairSchema>;
|
|
8
|
+
declare const KanjiEntrySchema: z.ZodObject<{
|
|
9
|
+
kanji: z.ZodString;
|
|
10
|
+
meaning: z.ZodString;
|
|
11
|
+
wanikaniLevel: z.ZodNullable<z.ZodNumber>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
type KanjiEntry = z.infer<typeof KanjiEntrySchema>;
|
|
14
|
+
declare const CardSchema: z.ZodObject<{
|
|
15
|
+
id: z.ZodUUID;
|
|
16
|
+
userId: z.ZodUUID;
|
|
17
|
+
createdAt: z.ZodISODateTime;
|
|
18
|
+
updatedAt: z.ZodISODateTime;
|
|
19
|
+
sentence: z.ZodString;
|
|
20
|
+
focusWord: z.ZodString;
|
|
21
|
+
focusWordReading: z.ZodString;
|
|
22
|
+
furigana: z.ZodArray<z.ZodObject<{
|
|
23
|
+
base: z.ZodString;
|
|
24
|
+
reading: z.ZodString;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
english: z.ZodString;
|
|
27
|
+
glosses: z.ZodArray<z.ZodString>;
|
|
28
|
+
grammarNote: z.ZodNullable<z.ZodString>;
|
|
29
|
+
kanjiList: z.ZodArray<z.ZodObject<{
|
|
30
|
+
kanji: z.ZodString;
|
|
31
|
+
meaning: z.ZodString;
|
|
32
|
+
wanikaniLevel: z.ZodNullable<z.ZodNumber>;
|
|
33
|
+
}, z.core.$strip>>;
|
|
34
|
+
imageKey: z.ZodNullable<z.ZodString>;
|
|
35
|
+
audioKey: z.ZodNullable<z.ZodString>;
|
|
36
|
+
source: z.ZodString;
|
|
37
|
+
tags: z.ZodArray<z.ZodString>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
type Card = z.infer<typeof CardSchema>;
|
|
40
|
+
declare const CreateCardInputSchema: z.ZodObject<{
|
|
41
|
+
sentence: z.ZodString;
|
|
42
|
+
focusWord: z.ZodString;
|
|
43
|
+
focusWordReading: z.ZodString;
|
|
44
|
+
furigana: z.ZodArray<z.ZodObject<{
|
|
45
|
+
base: z.ZodString;
|
|
46
|
+
reading: z.ZodString;
|
|
47
|
+
}, z.core.$strip>>;
|
|
48
|
+
english: z.ZodString;
|
|
49
|
+
glosses: z.ZodArray<z.ZodString>;
|
|
50
|
+
grammarNote: z.ZodNullable<z.ZodString>;
|
|
51
|
+
kanjiList: z.ZodArray<z.ZodObject<{
|
|
52
|
+
kanji: z.ZodString;
|
|
53
|
+
meaning: z.ZodString;
|
|
54
|
+
wanikaniLevel: z.ZodNullable<z.ZodNumber>;
|
|
55
|
+
}, z.core.$strip>>;
|
|
56
|
+
imageKey: z.ZodNullable<z.ZodString>;
|
|
57
|
+
audioKey: z.ZodNullable<z.ZodString>;
|
|
58
|
+
source: z.ZodString;
|
|
59
|
+
tags: z.ZodArray<z.ZodString>;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
type CreateCardInput = z.infer<typeof CreateCardInputSchema>;
|
|
62
|
+
declare const UpdateCardInputSchema: z.ZodObject<{
|
|
63
|
+
sentence: z.ZodOptional<z.ZodString>;
|
|
64
|
+
focusWord: z.ZodOptional<z.ZodString>;
|
|
65
|
+
focusWordReading: z.ZodOptional<z.ZodString>;
|
|
66
|
+
furigana: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
67
|
+
base: z.ZodString;
|
|
68
|
+
reading: z.ZodString;
|
|
69
|
+
}, z.core.$strip>>>;
|
|
70
|
+
english: z.ZodOptional<z.ZodString>;
|
|
71
|
+
glosses: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
72
|
+
grammarNote: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
73
|
+
kanjiList: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
74
|
+
kanji: z.ZodString;
|
|
75
|
+
meaning: z.ZodString;
|
|
76
|
+
wanikaniLevel: z.ZodNullable<z.ZodNumber>;
|
|
77
|
+
}, z.core.$strip>>>;
|
|
78
|
+
imageKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
79
|
+
audioKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
80
|
+
source: z.ZodOptional<z.ZodString>;
|
|
81
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
82
|
+
}, z.core.$strip>;
|
|
83
|
+
type UpdateCardInput = z.infer<typeof UpdateCardInputSchema>;
|
|
84
|
+
declare const ListCardsQuerySchema: z.ZodObject<{
|
|
85
|
+
limit: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
86
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
87
|
+
tag: z.ZodOptional<z.ZodString>;
|
|
88
|
+
source: z.ZodOptional<z.ZodString>;
|
|
89
|
+
}, z.core.$strip>;
|
|
90
|
+
type ListCardsQuery = z.infer<typeof ListCardsQuerySchema>;
|
|
91
|
+
|
|
92
|
+
declare const CardStateSchema: z.ZodEnum<{
|
|
93
|
+
new: "new";
|
|
94
|
+
learning: "learning";
|
|
95
|
+
review: "review";
|
|
96
|
+
relearning: "relearning";
|
|
97
|
+
}>;
|
|
98
|
+
type CardStateValue = z.infer<typeof CardStateSchema>;
|
|
99
|
+
declare const ReviewRatingSchema: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>;
|
|
100
|
+
type ReviewRating = z.infer<typeof ReviewRatingSchema>;
|
|
101
|
+
declare const ReviewSchema: z.ZodObject<{
|
|
102
|
+
id: z.ZodUUID;
|
|
103
|
+
userId: z.ZodUUID;
|
|
104
|
+
cardId: z.ZodUUID;
|
|
105
|
+
rating: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>;
|
|
106
|
+
reviewedAt: z.ZodISODateTime;
|
|
107
|
+
elapsedDays: z.ZodNumber;
|
|
108
|
+
scheduledDays: z.ZodNumber;
|
|
109
|
+
stateBefore: z.ZodEnum<{
|
|
110
|
+
new: "new";
|
|
111
|
+
learning: "learning";
|
|
112
|
+
review: "review";
|
|
113
|
+
relearning: "relearning";
|
|
114
|
+
}>;
|
|
115
|
+
stateAfter: z.ZodEnum<{
|
|
116
|
+
new: "new";
|
|
117
|
+
learning: "learning";
|
|
118
|
+
review: "review";
|
|
119
|
+
relearning: "relearning";
|
|
120
|
+
}>;
|
|
121
|
+
}, z.core.$strip>;
|
|
122
|
+
type Review = z.infer<typeof ReviewSchema>;
|
|
123
|
+
declare const CardStateRowSchema: z.ZodObject<{
|
|
124
|
+
cardId: z.ZodUUID;
|
|
125
|
+
userId: z.ZodUUID;
|
|
126
|
+
due: z.ZodISODateTime;
|
|
127
|
+
stability: z.ZodNumber;
|
|
128
|
+
difficulty: z.ZodNumber;
|
|
129
|
+
elapsedDays: z.ZodNumber;
|
|
130
|
+
scheduledDays: z.ZodNumber;
|
|
131
|
+
reps: z.ZodNumber;
|
|
132
|
+
lapses: z.ZodNumber;
|
|
133
|
+
learningSteps: z.ZodNumber;
|
|
134
|
+
state: z.ZodEnum<{
|
|
135
|
+
new: "new";
|
|
136
|
+
learning: "learning";
|
|
137
|
+
review: "review";
|
|
138
|
+
relearning: "relearning";
|
|
139
|
+
}>;
|
|
140
|
+
lastReview: z.ZodNullable<z.ZodISODateTime>;
|
|
141
|
+
}, z.core.$strip>;
|
|
142
|
+
type CardStateRow = z.infer<typeof CardStateRowSchema>;
|
|
143
|
+
declare const SubmitReviewInputSchema: z.ZodObject<{
|
|
144
|
+
cardId: z.ZodUUID;
|
|
145
|
+
rating: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>;
|
|
146
|
+
reviewedAt: z.ZodOptional<z.ZodISODateTime>;
|
|
147
|
+
}, z.core.$strip>;
|
|
148
|
+
type SubmitReviewInput = z.infer<typeof SubmitReviewInputSchema>;
|
|
149
|
+
declare const SubmitReviewResultSchema: z.ZodObject<{
|
|
150
|
+
review: z.ZodObject<{
|
|
151
|
+
id: z.ZodUUID;
|
|
152
|
+
userId: z.ZodUUID;
|
|
153
|
+
cardId: z.ZodUUID;
|
|
154
|
+
rating: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>;
|
|
155
|
+
reviewedAt: z.ZodISODateTime;
|
|
156
|
+
elapsedDays: z.ZodNumber;
|
|
157
|
+
scheduledDays: z.ZodNumber;
|
|
158
|
+
stateBefore: z.ZodEnum<{
|
|
159
|
+
new: "new";
|
|
160
|
+
learning: "learning";
|
|
161
|
+
review: "review";
|
|
162
|
+
relearning: "relearning";
|
|
163
|
+
}>;
|
|
164
|
+
stateAfter: z.ZodEnum<{
|
|
165
|
+
new: "new";
|
|
166
|
+
learning: "learning";
|
|
167
|
+
review: "review";
|
|
168
|
+
relearning: "relearning";
|
|
169
|
+
}>;
|
|
170
|
+
}, z.core.$strip>;
|
|
171
|
+
cardState: z.ZodObject<{
|
|
172
|
+
cardId: z.ZodUUID;
|
|
173
|
+
userId: z.ZodUUID;
|
|
174
|
+
due: z.ZodISODateTime;
|
|
175
|
+
stability: z.ZodNumber;
|
|
176
|
+
difficulty: z.ZodNumber;
|
|
177
|
+
elapsedDays: z.ZodNumber;
|
|
178
|
+
scheduledDays: z.ZodNumber;
|
|
179
|
+
reps: z.ZodNumber;
|
|
180
|
+
lapses: z.ZodNumber;
|
|
181
|
+
learningSteps: z.ZodNumber;
|
|
182
|
+
state: z.ZodEnum<{
|
|
183
|
+
new: "new";
|
|
184
|
+
learning: "learning";
|
|
185
|
+
review: "review";
|
|
186
|
+
relearning: "relearning";
|
|
187
|
+
}>;
|
|
188
|
+
lastReview: z.ZodNullable<z.ZodISODateTime>;
|
|
189
|
+
}, z.core.$strip>;
|
|
190
|
+
}, z.core.$strip>;
|
|
191
|
+
type SubmitReviewResult = z.infer<typeof SubmitReviewResultSchema>;
|
|
192
|
+
|
|
193
|
+
declare const HeatmapDaySchema: z.ZodObject<{
|
|
194
|
+
date: z.ZodISODate;
|
|
195
|
+
count: z.ZodNumber;
|
|
196
|
+
}, z.core.$strip>;
|
|
197
|
+
type HeatmapDay = z.infer<typeof HeatmapDaySchema>;
|
|
198
|
+
declare const HeatmapQuerySchema: z.ZodObject<{
|
|
199
|
+
year: z.ZodCoercedNumber<unknown>;
|
|
200
|
+
}, z.core.$strip>;
|
|
201
|
+
type HeatmapQuery = z.infer<typeof HeatmapQuerySchema>;
|
|
202
|
+
declare const HeatmapResponseSchema: z.ZodObject<{
|
|
203
|
+
year: z.ZodNumber;
|
|
204
|
+
days: z.ZodArray<z.ZodObject<{
|
|
205
|
+
date: z.ZodISODate;
|
|
206
|
+
count: z.ZodNumber;
|
|
207
|
+
}, z.core.$strip>>;
|
|
208
|
+
}, z.core.$strip>;
|
|
209
|
+
type HeatmapResponse = z.infer<typeof HeatmapResponseSchema>;
|
|
210
|
+
declare const RetentionPointSchema: z.ZodObject<{
|
|
211
|
+
intervalDays: z.ZodNumber;
|
|
212
|
+
retention: z.ZodNumber;
|
|
213
|
+
sampleSize: z.ZodNumber;
|
|
214
|
+
}, z.core.$strip>;
|
|
215
|
+
type RetentionPoint = z.infer<typeof RetentionPointSchema>;
|
|
216
|
+
declare const RetentionResponseSchema: z.ZodObject<{
|
|
217
|
+
generatedAt: z.ZodISODateTime;
|
|
218
|
+
points: z.ZodArray<z.ZodObject<{
|
|
219
|
+
intervalDays: z.ZodNumber;
|
|
220
|
+
retention: z.ZodNumber;
|
|
221
|
+
sampleSize: z.ZodNumber;
|
|
222
|
+
}, z.core.$strip>>;
|
|
223
|
+
}, z.core.$strip>;
|
|
224
|
+
type RetentionResponse = z.infer<typeof RetentionResponseSchema>;
|
|
225
|
+
declare const DailyCountQuerySchema: z.ZodObject<{
|
|
226
|
+
from: z.ZodISODate;
|
|
227
|
+
to: z.ZodISODate;
|
|
228
|
+
}, z.core.$strip>;
|
|
229
|
+
type DailyCountQuery = z.infer<typeof DailyCountQuerySchema>;
|
|
230
|
+
declare const DailyCountSchema: z.ZodObject<{
|
|
231
|
+
date: z.ZodISODate;
|
|
232
|
+
reviews: z.ZodNumber;
|
|
233
|
+
again: z.ZodNumber;
|
|
234
|
+
hard: z.ZodNumber;
|
|
235
|
+
good: z.ZodNumber;
|
|
236
|
+
easy: z.ZodNumber;
|
|
237
|
+
}, z.core.$strip>;
|
|
238
|
+
type DailyCount = z.infer<typeof DailyCountSchema>;
|
|
239
|
+
declare const DailyCountResponseSchema: z.ZodObject<{
|
|
240
|
+
days: z.ZodArray<z.ZodObject<{
|
|
241
|
+
date: z.ZodISODate;
|
|
242
|
+
reviews: z.ZodNumber;
|
|
243
|
+
again: z.ZodNumber;
|
|
244
|
+
hard: z.ZodNumber;
|
|
245
|
+
good: z.ZodNumber;
|
|
246
|
+
easy: z.ZodNumber;
|
|
247
|
+
}, z.core.$strip>>;
|
|
248
|
+
}, z.core.$strip>;
|
|
249
|
+
type DailyCountResponse = z.infer<typeof DailyCountResponseSchema>;
|
|
3
250
|
|
|
4
251
|
interface HibiClientConfig {
|
|
5
252
|
apiKey: string;
|
|
@@ -10,6 +257,12 @@ interface HibiClientError extends Error {
|
|
|
10
257
|
status: number;
|
|
11
258
|
body: unknown;
|
|
12
259
|
}
|
|
260
|
+
type RNFileRef = {
|
|
261
|
+
uri: string;
|
|
262
|
+
name: string;
|
|
263
|
+
type: string;
|
|
264
|
+
};
|
|
265
|
+
type AudioUploadInput = Blob | RNFileRef;
|
|
13
266
|
declare function createHibiClient(config: HibiClientConfig): {
|
|
14
267
|
cards: {
|
|
15
268
|
create(input: CreateCardInput): Promise<{
|
|
@@ -117,6 +370,11 @@ declare function createHibiClient(config: HibiClientConfig): {
|
|
|
117
370
|
}>;
|
|
118
371
|
remove(id: string): Promise<void>;
|
|
119
372
|
};
|
|
373
|
+
uploads: {
|
|
374
|
+
audio(input: AudioUploadInput): Promise<{
|
|
375
|
+
key: string;
|
|
376
|
+
}>;
|
|
377
|
+
};
|
|
120
378
|
reviews: {
|
|
121
379
|
due(query?: {
|
|
122
380
|
limit?: number;
|
|
@@ -222,4 +480,4 @@ declare function createHibiClient(config: HibiClientConfig): {
|
|
|
222
480
|
};
|
|
223
481
|
type HibiClient = ReturnType<typeof createHibiClient>;
|
|
224
482
|
|
|
225
|
-
export { type HibiClient, type HibiClientConfig, type HibiClientError, createHibiClient };
|
|
483
|
+
export { type AudioUploadInput, type Card, type CardStateRow, type CardStateValue, type CreateCardInput, type DailyCount, type DailyCountResponse, type FuriganaPair, type HeatmapDay, type HeatmapResponse, type HibiClient, type HibiClientConfig, type HibiClientError, type KanjiEntry, type ListCardsQuery, type RNFileRef, type RetentionPoint, type RetentionResponse, type Review, type ReviewRating, type SubmitReviewInput, type SubmitReviewResult, type UpdateCardInput, createHibiClient };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,252 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
declare const FuriganaPairSchema: z.ZodObject<{
|
|
4
|
+
base: z.ZodString;
|
|
5
|
+
reading: z.ZodString;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
type FuriganaPair = z.infer<typeof FuriganaPairSchema>;
|
|
8
|
+
declare const KanjiEntrySchema: z.ZodObject<{
|
|
9
|
+
kanji: z.ZodString;
|
|
10
|
+
meaning: z.ZodString;
|
|
11
|
+
wanikaniLevel: z.ZodNullable<z.ZodNumber>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
type KanjiEntry = z.infer<typeof KanjiEntrySchema>;
|
|
14
|
+
declare const CardSchema: z.ZodObject<{
|
|
15
|
+
id: z.ZodUUID;
|
|
16
|
+
userId: z.ZodUUID;
|
|
17
|
+
createdAt: z.ZodISODateTime;
|
|
18
|
+
updatedAt: z.ZodISODateTime;
|
|
19
|
+
sentence: z.ZodString;
|
|
20
|
+
focusWord: z.ZodString;
|
|
21
|
+
focusWordReading: z.ZodString;
|
|
22
|
+
furigana: z.ZodArray<z.ZodObject<{
|
|
23
|
+
base: z.ZodString;
|
|
24
|
+
reading: z.ZodString;
|
|
25
|
+
}, z.core.$strip>>;
|
|
26
|
+
english: z.ZodString;
|
|
27
|
+
glosses: z.ZodArray<z.ZodString>;
|
|
28
|
+
grammarNote: z.ZodNullable<z.ZodString>;
|
|
29
|
+
kanjiList: z.ZodArray<z.ZodObject<{
|
|
30
|
+
kanji: z.ZodString;
|
|
31
|
+
meaning: z.ZodString;
|
|
32
|
+
wanikaniLevel: z.ZodNullable<z.ZodNumber>;
|
|
33
|
+
}, z.core.$strip>>;
|
|
34
|
+
imageKey: z.ZodNullable<z.ZodString>;
|
|
35
|
+
audioKey: z.ZodNullable<z.ZodString>;
|
|
36
|
+
source: z.ZodString;
|
|
37
|
+
tags: z.ZodArray<z.ZodString>;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
type Card = z.infer<typeof CardSchema>;
|
|
40
|
+
declare const CreateCardInputSchema: z.ZodObject<{
|
|
41
|
+
sentence: z.ZodString;
|
|
42
|
+
focusWord: z.ZodString;
|
|
43
|
+
focusWordReading: z.ZodString;
|
|
44
|
+
furigana: z.ZodArray<z.ZodObject<{
|
|
45
|
+
base: z.ZodString;
|
|
46
|
+
reading: z.ZodString;
|
|
47
|
+
}, z.core.$strip>>;
|
|
48
|
+
english: z.ZodString;
|
|
49
|
+
glosses: z.ZodArray<z.ZodString>;
|
|
50
|
+
grammarNote: z.ZodNullable<z.ZodString>;
|
|
51
|
+
kanjiList: z.ZodArray<z.ZodObject<{
|
|
52
|
+
kanji: z.ZodString;
|
|
53
|
+
meaning: z.ZodString;
|
|
54
|
+
wanikaniLevel: z.ZodNullable<z.ZodNumber>;
|
|
55
|
+
}, z.core.$strip>>;
|
|
56
|
+
imageKey: z.ZodNullable<z.ZodString>;
|
|
57
|
+
audioKey: z.ZodNullable<z.ZodString>;
|
|
58
|
+
source: z.ZodString;
|
|
59
|
+
tags: z.ZodArray<z.ZodString>;
|
|
60
|
+
}, z.core.$strip>;
|
|
61
|
+
type CreateCardInput = z.infer<typeof CreateCardInputSchema>;
|
|
62
|
+
declare const UpdateCardInputSchema: z.ZodObject<{
|
|
63
|
+
sentence: z.ZodOptional<z.ZodString>;
|
|
64
|
+
focusWord: z.ZodOptional<z.ZodString>;
|
|
65
|
+
focusWordReading: z.ZodOptional<z.ZodString>;
|
|
66
|
+
furigana: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
67
|
+
base: z.ZodString;
|
|
68
|
+
reading: z.ZodString;
|
|
69
|
+
}, z.core.$strip>>>;
|
|
70
|
+
english: z.ZodOptional<z.ZodString>;
|
|
71
|
+
glosses: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
72
|
+
grammarNote: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
73
|
+
kanjiList: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
74
|
+
kanji: z.ZodString;
|
|
75
|
+
meaning: z.ZodString;
|
|
76
|
+
wanikaniLevel: z.ZodNullable<z.ZodNumber>;
|
|
77
|
+
}, z.core.$strip>>>;
|
|
78
|
+
imageKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
79
|
+
audioKey: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
80
|
+
source: z.ZodOptional<z.ZodString>;
|
|
81
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
82
|
+
}, z.core.$strip>;
|
|
83
|
+
type UpdateCardInput = z.infer<typeof UpdateCardInputSchema>;
|
|
84
|
+
declare const ListCardsQuerySchema: z.ZodObject<{
|
|
85
|
+
limit: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
86
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
87
|
+
tag: z.ZodOptional<z.ZodString>;
|
|
88
|
+
source: z.ZodOptional<z.ZodString>;
|
|
89
|
+
}, z.core.$strip>;
|
|
90
|
+
type ListCardsQuery = z.infer<typeof ListCardsQuerySchema>;
|
|
91
|
+
|
|
92
|
+
declare const CardStateSchema: z.ZodEnum<{
|
|
93
|
+
new: "new";
|
|
94
|
+
learning: "learning";
|
|
95
|
+
review: "review";
|
|
96
|
+
relearning: "relearning";
|
|
97
|
+
}>;
|
|
98
|
+
type CardStateValue = z.infer<typeof CardStateSchema>;
|
|
99
|
+
declare const ReviewRatingSchema: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>;
|
|
100
|
+
type ReviewRating = z.infer<typeof ReviewRatingSchema>;
|
|
101
|
+
declare const ReviewSchema: z.ZodObject<{
|
|
102
|
+
id: z.ZodUUID;
|
|
103
|
+
userId: z.ZodUUID;
|
|
104
|
+
cardId: z.ZodUUID;
|
|
105
|
+
rating: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>;
|
|
106
|
+
reviewedAt: z.ZodISODateTime;
|
|
107
|
+
elapsedDays: z.ZodNumber;
|
|
108
|
+
scheduledDays: z.ZodNumber;
|
|
109
|
+
stateBefore: z.ZodEnum<{
|
|
110
|
+
new: "new";
|
|
111
|
+
learning: "learning";
|
|
112
|
+
review: "review";
|
|
113
|
+
relearning: "relearning";
|
|
114
|
+
}>;
|
|
115
|
+
stateAfter: z.ZodEnum<{
|
|
116
|
+
new: "new";
|
|
117
|
+
learning: "learning";
|
|
118
|
+
review: "review";
|
|
119
|
+
relearning: "relearning";
|
|
120
|
+
}>;
|
|
121
|
+
}, z.core.$strip>;
|
|
122
|
+
type Review = z.infer<typeof ReviewSchema>;
|
|
123
|
+
declare const CardStateRowSchema: z.ZodObject<{
|
|
124
|
+
cardId: z.ZodUUID;
|
|
125
|
+
userId: z.ZodUUID;
|
|
126
|
+
due: z.ZodISODateTime;
|
|
127
|
+
stability: z.ZodNumber;
|
|
128
|
+
difficulty: z.ZodNumber;
|
|
129
|
+
elapsedDays: z.ZodNumber;
|
|
130
|
+
scheduledDays: z.ZodNumber;
|
|
131
|
+
reps: z.ZodNumber;
|
|
132
|
+
lapses: z.ZodNumber;
|
|
133
|
+
learningSteps: z.ZodNumber;
|
|
134
|
+
state: z.ZodEnum<{
|
|
135
|
+
new: "new";
|
|
136
|
+
learning: "learning";
|
|
137
|
+
review: "review";
|
|
138
|
+
relearning: "relearning";
|
|
139
|
+
}>;
|
|
140
|
+
lastReview: z.ZodNullable<z.ZodISODateTime>;
|
|
141
|
+
}, z.core.$strip>;
|
|
142
|
+
type CardStateRow = z.infer<typeof CardStateRowSchema>;
|
|
143
|
+
declare const SubmitReviewInputSchema: z.ZodObject<{
|
|
144
|
+
cardId: z.ZodUUID;
|
|
145
|
+
rating: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>;
|
|
146
|
+
reviewedAt: z.ZodOptional<z.ZodISODateTime>;
|
|
147
|
+
}, z.core.$strip>;
|
|
148
|
+
type SubmitReviewInput = z.infer<typeof SubmitReviewInputSchema>;
|
|
149
|
+
declare const SubmitReviewResultSchema: z.ZodObject<{
|
|
150
|
+
review: z.ZodObject<{
|
|
151
|
+
id: z.ZodUUID;
|
|
152
|
+
userId: z.ZodUUID;
|
|
153
|
+
cardId: z.ZodUUID;
|
|
154
|
+
rating: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>]>;
|
|
155
|
+
reviewedAt: z.ZodISODateTime;
|
|
156
|
+
elapsedDays: z.ZodNumber;
|
|
157
|
+
scheduledDays: z.ZodNumber;
|
|
158
|
+
stateBefore: z.ZodEnum<{
|
|
159
|
+
new: "new";
|
|
160
|
+
learning: "learning";
|
|
161
|
+
review: "review";
|
|
162
|
+
relearning: "relearning";
|
|
163
|
+
}>;
|
|
164
|
+
stateAfter: z.ZodEnum<{
|
|
165
|
+
new: "new";
|
|
166
|
+
learning: "learning";
|
|
167
|
+
review: "review";
|
|
168
|
+
relearning: "relearning";
|
|
169
|
+
}>;
|
|
170
|
+
}, z.core.$strip>;
|
|
171
|
+
cardState: z.ZodObject<{
|
|
172
|
+
cardId: z.ZodUUID;
|
|
173
|
+
userId: z.ZodUUID;
|
|
174
|
+
due: z.ZodISODateTime;
|
|
175
|
+
stability: z.ZodNumber;
|
|
176
|
+
difficulty: z.ZodNumber;
|
|
177
|
+
elapsedDays: z.ZodNumber;
|
|
178
|
+
scheduledDays: z.ZodNumber;
|
|
179
|
+
reps: z.ZodNumber;
|
|
180
|
+
lapses: z.ZodNumber;
|
|
181
|
+
learningSteps: z.ZodNumber;
|
|
182
|
+
state: z.ZodEnum<{
|
|
183
|
+
new: "new";
|
|
184
|
+
learning: "learning";
|
|
185
|
+
review: "review";
|
|
186
|
+
relearning: "relearning";
|
|
187
|
+
}>;
|
|
188
|
+
lastReview: z.ZodNullable<z.ZodISODateTime>;
|
|
189
|
+
}, z.core.$strip>;
|
|
190
|
+
}, z.core.$strip>;
|
|
191
|
+
type SubmitReviewResult = z.infer<typeof SubmitReviewResultSchema>;
|
|
192
|
+
|
|
193
|
+
declare const HeatmapDaySchema: z.ZodObject<{
|
|
194
|
+
date: z.ZodISODate;
|
|
195
|
+
count: z.ZodNumber;
|
|
196
|
+
}, z.core.$strip>;
|
|
197
|
+
type HeatmapDay = z.infer<typeof HeatmapDaySchema>;
|
|
198
|
+
declare const HeatmapQuerySchema: z.ZodObject<{
|
|
199
|
+
year: z.ZodCoercedNumber<unknown>;
|
|
200
|
+
}, z.core.$strip>;
|
|
201
|
+
type HeatmapQuery = z.infer<typeof HeatmapQuerySchema>;
|
|
202
|
+
declare const HeatmapResponseSchema: z.ZodObject<{
|
|
203
|
+
year: z.ZodNumber;
|
|
204
|
+
days: z.ZodArray<z.ZodObject<{
|
|
205
|
+
date: z.ZodISODate;
|
|
206
|
+
count: z.ZodNumber;
|
|
207
|
+
}, z.core.$strip>>;
|
|
208
|
+
}, z.core.$strip>;
|
|
209
|
+
type HeatmapResponse = z.infer<typeof HeatmapResponseSchema>;
|
|
210
|
+
declare const RetentionPointSchema: z.ZodObject<{
|
|
211
|
+
intervalDays: z.ZodNumber;
|
|
212
|
+
retention: z.ZodNumber;
|
|
213
|
+
sampleSize: z.ZodNumber;
|
|
214
|
+
}, z.core.$strip>;
|
|
215
|
+
type RetentionPoint = z.infer<typeof RetentionPointSchema>;
|
|
216
|
+
declare const RetentionResponseSchema: z.ZodObject<{
|
|
217
|
+
generatedAt: z.ZodISODateTime;
|
|
218
|
+
points: z.ZodArray<z.ZodObject<{
|
|
219
|
+
intervalDays: z.ZodNumber;
|
|
220
|
+
retention: z.ZodNumber;
|
|
221
|
+
sampleSize: z.ZodNumber;
|
|
222
|
+
}, z.core.$strip>>;
|
|
223
|
+
}, z.core.$strip>;
|
|
224
|
+
type RetentionResponse = z.infer<typeof RetentionResponseSchema>;
|
|
225
|
+
declare const DailyCountQuerySchema: z.ZodObject<{
|
|
226
|
+
from: z.ZodISODate;
|
|
227
|
+
to: z.ZodISODate;
|
|
228
|
+
}, z.core.$strip>;
|
|
229
|
+
type DailyCountQuery = z.infer<typeof DailyCountQuerySchema>;
|
|
230
|
+
declare const DailyCountSchema: z.ZodObject<{
|
|
231
|
+
date: z.ZodISODate;
|
|
232
|
+
reviews: z.ZodNumber;
|
|
233
|
+
again: z.ZodNumber;
|
|
234
|
+
hard: z.ZodNumber;
|
|
235
|
+
good: z.ZodNumber;
|
|
236
|
+
easy: z.ZodNumber;
|
|
237
|
+
}, z.core.$strip>;
|
|
238
|
+
type DailyCount = z.infer<typeof DailyCountSchema>;
|
|
239
|
+
declare const DailyCountResponseSchema: z.ZodObject<{
|
|
240
|
+
days: z.ZodArray<z.ZodObject<{
|
|
241
|
+
date: z.ZodISODate;
|
|
242
|
+
reviews: z.ZodNumber;
|
|
243
|
+
again: z.ZodNumber;
|
|
244
|
+
hard: z.ZodNumber;
|
|
245
|
+
good: z.ZodNumber;
|
|
246
|
+
easy: z.ZodNumber;
|
|
247
|
+
}, z.core.$strip>>;
|
|
248
|
+
}, z.core.$strip>;
|
|
249
|
+
type DailyCountResponse = z.infer<typeof DailyCountResponseSchema>;
|
|
3
250
|
|
|
4
251
|
interface HibiClientConfig {
|
|
5
252
|
apiKey: string;
|
|
@@ -10,6 +257,12 @@ interface HibiClientError extends Error {
|
|
|
10
257
|
status: number;
|
|
11
258
|
body: unknown;
|
|
12
259
|
}
|
|
260
|
+
type RNFileRef = {
|
|
261
|
+
uri: string;
|
|
262
|
+
name: string;
|
|
263
|
+
type: string;
|
|
264
|
+
};
|
|
265
|
+
type AudioUploadInput = Blob | RNFileRef;
|
|
13
266
|
declare function createHibiClient(config: HibiClientConfig): {
|
|
14
267
|
cards: {
|
|
15
268
|
create(input: CreateCardInput): Promise<{
|
|
@@ -117,6 +370,11 @@ declare function createHibiClient(config: HibiClientConfig): {
|
|
|
117
370
|
}>;
|
|
118
371
|
remove(id: string): Promise<void>;
|
|
119
372
|
};
|
|
373
|
+
uploads: {
|
|
374
|
+
audio(input: AudioUploadInput): Promise<{
|
|
375
|
+
key: string;
|
|
376
|
+
}>;
|
|
377
|
+
};
|
|
120
378
|
reviews: {
|
|
121
379
|
due(query?: {
|
|
122
380
|
limit?: number;
|
|
@@ -222,4 +480,4 @@ declare function createHibiClient(config: HibiClientConfig): {
|
|
|
222
480
|
};
|
|
223
481
|
type HibiClient = ReturnType<typeof createHibiClient>;
|
|
224
482
|
|
|
225
|
-
export { type HibiClient, type HibiClientConfig, type HibiClientError, createHibiClient };
|
|
483
|
+
export { type AudioUploadInput, type Card, type CardStateRow, type CardStateValue, type CreateCardInput, type DailyCount, type DailyCountResponse, type FuriganaPair, type HeatmapDay, type HeatmapResponse, type HibiClient, type HibiClientConfig, type HibiClientError, type KanjiEntry, type ListCardsQuery, type RNFileRef, type RetentionPoint, type RetentionResponse, type Review, type ReviewRating, type SubmitReviewInput, type SubmitReviewResult, type UpdateCardInput, createHibiClient };
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,175 @@
|
|
|
1
|
-
import { PaginatedSchema, CardSchema, SubmitReviewResultSchema, DailyCountResponseSchema, HeatmapResponseSchema, SubmitReviewInputSchema, UpdateCardInputSchema, CreateCardInputSchema, RetentionResponseSchema } from '@hibi/types';
|
|
2
1
|
import { z } from 'zod';
|
|
3
2
|
|
|
4
|
-
// src/
|
|
3
|
+
// src/_vendored/hibi-types/account.ts
|
|
4
|
+
var UUIDSchema = z.uuid();
|
|
5
|
+
var TimestampSchema = z.iso.datetime({ offset: true });
|
|
6
|
+
z.object({
|
|
7
|
+
limit: z.coerce.number().int().min(1).max(200).default(50),
|
|
8
|
+
cursor: z.string().optional()
|
|
9
|
+
});
|
|
10
|
+
var PaginatedSchema = (item) => z.object({
|
|
11
|
+
items: z.array(item),
|
|
12
|
+
nextCursor: z.string().nullable()
|
|
13
|
+
});
|
|
14
|
+
z.object({
|
|
15
|
+
error: z.object({
|
|
16
|
+
code: z.string(),
|
|
17
|
+
message: z.string(),
|
|
18
|
+
details: z.unknown().optional()
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// src/_vendored/hibi-types/account.ts
|
|
23
|
+
z.object({
|
|
24
|
+
id: UUIDSchema,
|
|
25
|
+
email: z.email(),
|
|
26
|
+
createdAt: TimestampSchema
|
|
27
|
+
});
|
|
28
|
+
var ApiKeySchema = z.object({
|
|
29
|
+
id: UUIDSchema,
|
|
30
|
+
name: z.string().min(1).max(80),
|
|
31
|
+
lastUsedAt: TimestampSchema.nullable(),
|
|
32
|
+
createdAt: TimestampSchema,
|
|
33
|
+
revokedAt: TimestampSchema.nullable()
|
|
34
|
+
});
|
|
35
|
+
z.object({
|
|
36
|
+
name: z.string().min(1).max(80)
|
|
37
|
+
});
|
|
38
|
+
z.object({
|
|
39
|
+
apiKey: ApiKeySchema,
|
|
40
|
+
rawKey: z.string()
|
|
41
|
+
});
|
|
42
|
+
var FuriganaPairSchema = z.object({
|
|
43
|
+
base: z.string(),
|
|
44
|
+
reading: z.string()
|
|
45
|
+
});
|
|
46
|
+
var KanjiEntrySchema = z.object({
|
|
47
|
+
kanji: z.string().length(1),
|
|
48
|
+
meaning: z.string(),
|
|
49
|
+
wanikaniLevel: z.number().int().min(1).max(60).nullable()
|
|
50
|
+
});
|
|
51
|
+
var CardSchema = z.object({
|
|
52
|
+
id: UUIDSchema,
|
|
53
|
+
userId: UUIDSchema,
|
|
54
|
+
createdAt: TimestampSchema,
|
|
55
|
+
updatedAt: TimestampSchema,
|
|
56
|
+
sentence: z.string().min(1),
|
|
57
|
+
focusWord: z.string().min(1),
|
|
58
|
+
focusWordReading: z.string().min(1),
|
|
59
|
+
furigana: z.array(FuriganaPairSchema),
|
|
60
|
+
english: z.string(),
|
|
61
|
+
glosses: z.array(z.string()),
|
|
62
|
+
grammarNote: z.string().nullable(),
|
|
63
|
+
kanjiList: z.array(KanjiEntrySchema),
|
|
64
|
+
imageKey: z.string().nullable(),
|
|
65
|
+
audioKey: z.string().nullable(),
|
|
66
|
+
source: z.string(),
|
|
67
|
+
tags: z.array(z.string())
|
|
68
|
+
});
|
|
69
|
+
var CreateCardInputSchema = CardSchema.omit({
|
|
70
|
+
id: true,
|
|
71
|
+
userId: true,
|
|
72
|
+
createdAt: true,
|
|
73
|
+
updatedAt: true
|
|
74
|
+
});
|
|
75
|
+
var UpdateCardInputSchema = CreateCardInputSchema.partial();
|
|
76
|
+
z.object({
|
|
77
|
+
limit: z.coerce.number().int().min(1).max(200).default(50),
|
|
78
|
+
cursor: z.string().optional(),
|
|
79
|
+
tag: z.string().optional(),
|
|
80
|
+
source: z.string().optional()
|
|
81
|
+
});
|
|
82
|
+
var CardStateSchema = z.enum(["new", "learning", "review", "relearning"]);
|
|
83
|
+
var ReviewRatingSchema = z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]);
|
|
84
|
+
var ReviewSchema = z.object({
|
|
85
|
+
id: UUIDSchema,
|
|
86
|
+
userId: UUIDSchema,
|
|
87
|
+
cardId: UUIDSchema,
|
|
88
|
+
rating: ReviewRatingSchema,
|
|
89
|
+
reviewedAt: TimestampSchema,
|
|
90
|
+
elapsedDays: z.number(),
|
|
91
|
+
scheduledDays: z.number(),
|
|
92
|
+
stateBefore: CardStateSchema,
|
|
93
|
+
stateAfter: CardStateSchema
|
|
94
|
+
});
|
|
95
|
+
var CardStateRowSchema = z.object({
|
|
96
|
+
cardId: UUIDSchema,
|
|
97
|
+
userId: UUIDSchema,
|
|
98
|
+
due: TimestampSchema,
|
|
99
|
+
stability: z.number(),
|
|
100
|
+
difficulty: z.number(),
|
|
101
|
+
elapsedDays: z.number(),
|
|
102
|
+
scheduledDays: z.number(),
|
|
103
|
+
reps: z.number().int().nonnegative(),
|
|
104
|
+
lapses: z.number().int().nonnegative(),
|
|
105
|
+
learningSteps: z.number().int().nonnegative(),
|
|
106
|
+
state: CardStateSchema,
|
|
107
|
+
lastReview: TimestampSchema.nullable()
|
|
108
|
+
});
|
|
109
|
+
z.object({
|
|
110
|
+
limit: z.coerce.number().int().min(1).max(200).default(50),
|
|
111
|
+
before: TimestampSchema.optional()
|
|
112
|
+
});
|
|
113
|
+
var SubmitReviewInputSchema = z.object({
|
|
114
|
+
cardId: UUIDSchema,
|
|
115
|
+
rating: ReviewRatingSchema,
|
|
116
|
+
reviewedAt: TimestampSchema.optional()
|
|
117
|
+
});
|
|
118
|
+
var SubmitReviewResultSchema = z.object({
|
|
119
|
+
review: ReviewSchema,
|
|
120
|
+
cardState: CardStateRowSchema
|
|
121
|
+
});
|
|
122
|
+
var HeatmapDaySchema = z.object({
|
|
123
|
+
date: z.iso.date(),
|
|
124
|
+
count: z.number().int().nonnegative()
|
|
125
|
+
});
|
|
126
|
+
z.object({
|
|
127
|
+
year: z.coerce.number().int().min(2e3).max(2100)
|
|
128
|
+
});
|
|
129
|
+
var HeatmapResponseSchema = z.object({
|
|
130
|
+
year: z.number().int(),
|
|
131
|
+
days: z.array(HeatmapDaySchema)
|
|
132
|
+
});
|
|
133
|
+
var RetentionPointSchema = z.object({
|
|
134
|
+
intervalDays: z.number().int().nonnegative(),
|
|
135
|
+
retention: z.number().min(0).max(1),
|
|
136
|
+
sampleSize: z.number().int().nonnegative()
|
|
137
|
+
});
|
|
138
|
+
var RetentionResponseSchema = z.object({
|
|
139
|
+
generatedAt: TimestampSchema,
|
|
140
|
+
points: z.array(RetentionPointSchema)
|
|
141
|
+
});
|
|
142
|
+
z.object({
|
|
143
|
+
from: z.iso.date(),
|
|
144
|
+
to: z.iso.date()
|
|
145
|
+
});
|
|
146
|
+
var DailyCountSchema = z.object({
|
|
147
|
+
date: z.iso.date(),
|
|
148
|
+
reviews: z.number().int().nonnegative(),
|
|
149
|
+
again: z.number().int().nonnegative(),
|
|
150
|
+
hard: z.number().int().nonnegative(),
|
|
151
|
+
good: z.number().int().nonnegative(),
|
|
152
|
+
easy: z.number().int().nonnegative()
|
|
153
|
+
});
|
|
154
|
+
var DailyCountResponseSchema = z.object({
|
|
155
|
+
days: z.array(DailyCountSchema)
|
|
156
|
+
});
|
|
5
157
|
var PaginatedCardSchema = PaginatedSchema(CardSchema);
|
|
6
158
|
var DueResponseSchema = z.object({
|
|
7
159
|
items: z.array(
|
|
8
160
|
z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState })
|
|
9
161
|
)
|
|
10
162
|
});
|
|
163
|
+
var UploadAudioResponseSchema = z.object({ key: z.string() });
|
|
11
164
|
function asError(status, body) {
|
|
12
165
|
const err = new Error(`Hibi API error: ${status}`);
|
|
13
166
|
err.status = status;
|
|
14
167
|
err.body = body;
|
|
15
168
|
return err;
|
|
16
169
|
}
|
|
170
|
+
function isFormData(value) {
|
|
171
|
+
return typeof FormData !== "undefined" && value instanceof FormData;
|
|
172
|
+
}
|
|
17
173
|
function createHibiClient(config) {
|
|
18
174
|
const fetchImpl = config.fetch ?? fetch;
|
|
19
175
|
const base = config.baseUrl.replace(/\/+$/, "");
|
|
@@ -29,8 +185,12 @@ function createHibiClient(config) {
|
|
|
29
185
|
};
|
|
30
186
|
const requestInit = { method, headers };
|
|
31
187
|
if (init.body !== void 0) {
|
|
32
|
-
|
|
33
|
-
|
|
188
|
+
if (isFormData(init.body)) {
|
|
189
|
+
requestInit.body = init.body;
|
|
190
|
+
} else {
|
|
191
|
+
headers["Content-Type"] = "application/json";
|
|
192
|
+
requestInit.body = JSON.stringify(init.body);
|
|
193
|
+
}
|
|
34
194
|
}
|
|
35
195
|
const res = await fetchImpl(url.toString(), requestInit);
|
|
36
196
|
if (res.status === 204) return void 0;
|
|
@@ -39,6 +199,16 @@ function createHibiClient(config) {
|
|
|
39
199
|
if (!res.ok) throw asError(res.status, body);
|
|
40
200
|
return schema.parse(body);
|
|
41
201
|
}
|
|
202
|
+
function buildAudioForm(input) {
|
|
203
|
+
const fd = new FormData();
|
|
204
|
+
if (typeof Blob !== "undefined" && input instanceof Blob) {
|
|
205
|
+
const name = "name" in input && typeof input.name === "string" ? input.name : "clip.m4a";
|
|
206
|
+
fd.append("file", input, name);
|
|
207
|
+
} else {
|
|
208
|
+
fd.append("file", input);
|
|
209
|
+
}
|
|
210
|
+
return fd;
|
|
211
|
+
}
|
|
42
212
|
return {
|
|
43
213
|
cards: {
|
|
44
214
|
async create(input) {
|
|
@@ -61,6 +231,13 @@ function createHibiClient(config) {
|
|
|
61
231
|
await request("DELETE", `/v1/cards/${id}`, z.unknown());
|
|
62
232
|
}
|
|
63
233
|
},
|
|
234
|
+
uploads: {
|
|
235
|
+
async audio(input) {
|
|
236
|
+
return request("POST", "/v1/uploads/audio", UploadAudioResponseSchema, {
|
|
237
|
+
body: buildAudioForm(input)
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
},
|
|
64
241
|
reviews: {
|
|
65
242
|
async due(query = {}) {
|
|
66
243
|
return request("GET", "/v1/reviews/due", DueResponseSchema, {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client.ts"],"names":[],"mappings":";;;;AA8BA,IAAM,mBAAA,GAAsB,gBAAgB,UAAU,CAAA;AACtD,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACjC,OAAO,CAAA,CAAE,KAAA;AAAA,IACP,CAAA,CAAE,OAAO,EAAE,IAAA,EAAM,YAAY,SAAA,EAAW,wBAAA,CAAyB,KAAA,CAAM,SAAA,EAAW;AAAA;AAEtF,CAAC,CAAA;AAED,SAAS,OAAA,CAAQ,QAAgB,IAAA,EAAgC;AAC/D,EAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AACjD,EAAA,GAAA,CAAI,MAAA,GAAS,MAAA;AACb,EAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AACX,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,iBAAiB,MAAA,EAA0B;AACzD,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,IAAS,KAAA;AAClC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAE9C,EAAA,eAAe,QACb,MAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,GAAgF,EAAC,EACrE;AACZ,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AACpC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AAC/C,QAAA,IAAI,CAAA,KAAM,QAAW,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MACxD;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,aAAA,EAAe,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,KACxC;AACA,IAAA,MAAM,WAAA,GAA2B,EAAE,MAAA,EAAQ,OAAA,EAAQ;AACnD,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAC1B,MAAA,WAAA,CAAY,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,MAAM,MAAM,SAAA,CAAU,GAAA,CAAI,QAAA,IAAY,WAAW,CAAA;AAEvD,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AAE/B,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAEvC,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,QAAU,OAAA,CAAQ,GAAA,CAAI,QAAQ,IAAI,CAAA;AAC3C,IAAA,OAAO,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA,MACL,MAAM,OAAO,KAAA,EAAwB;AACnC,QAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,KAAA,CAAM,KAAK,CAAA;AACnD,QAAA,OAAO,QAAQ,MAAA,EAAQ,WAAA,EAAa,YAAY,EAAE,IAAA,EAAM,WAAW,CAAA;AAAA,MACrE,CAAA;AAAA,MACA,MAAM,IAAA,CAAK,KAAA,GAAwB,EAAE,KAAA,EAAO,IAAG,EAAG;AAChD,QAAA,OAAO,OAAA,CAAQ,KAAA,EAAO,WAAA,EAAa,mBAAA,EAAqB;AAAA,UACtD,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,GAAA,EAAK,KAAA,CAAM,GAAA,EAAK,MAAA,EAAQ,MAAM,MAAA;AAAO,SACzF,CAAA;AAAA,MACH,CAAA;AAAA,MACA,MAAM,IAAI,EAAA,EAAY;AACpB,QAAA,OAAO,OAAA,CAAQ,KAAA,EAAO,CAAA,UAAA,EAAa,EAAE,IAAI,UAAU,CAAA;AAAA,MACrD,CAAA;AAAA,MACA,MAAM,MAAA,CAAO,EAAA,EAAY,KAAA,EAAwB;AAC/C,QAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,KAAA,CAAM,KAAK,CAAA;AACnD,QAAA,OAAO,OAAA,CAAQ,SAAS,CAAA,UAAA,EAAa,EAAE,IAAI,UAAA,EAAY,EAAE,IAAA,EAAM,SAAA,EAAW,CAAA;AAAA,MAC5E,CAAA;AAAA,MACA,MAAM,OAAO,EAAA,EAA2B;AACtC,QAAA,MAAM,QAAQ,QAAA,EAAU,CAAA,UAAA,EAAa,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,CAAA;AAAA,MACxD;AAAA,KACF;AAAA,IAEA,OAAA,EAAS;AAAA,MACP,MAAM,GAAA,CAAI,KAAA,GAA6C,EAAC,EAAG;AACzD,QAAA,OAAO,OAAA,CAAQ,KAAA,EAAO,iBAAA,EAAmB,iBAAA,EAAmB;AAAA,UAC1D,OAAO,EAAE,KAAA,EAAO,MAAM,KAAA,EAAO,MAAA,EAAQ,MAAM,MAAA;AAAO,SACnD,CAAA;AAAA,MACH,CAAA;AAAA,MACA,MAAM,OAAO,KAAA,EAA0B;AACrC,QAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,KAAA,CAAM,KAAK,CAAA;AACrD,QAAA,OAAO,QAAQ,MAAA,EAAQ,aAAA,EAAe,0BAA0B,EAAE,IAAA,EAAM,WAAW,CAAA;AAAA,MACrF;AAAA,KACF;AAAA,IAEA,KAAA,EAAO;AAAA,MACL,MAAM,QAAQ,KAAA,EAAqB;AACjC,QAAA,OAAO,OAAA,CAAQ,KAAA,EAAO,mBAAA,EAAqB,qBAAA,EAAuB;AAAA,UAChE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA;AAAK,SAC3B,CAAA;AAAA,MACH,CAAA;AAAA,MACA,MAAM,SAAA,GAAY;AAChB,QAAA,OAAO,OAAA,CAAQ,KAAA,EAAO,qBAAA,EAAuB,uBAAuB,CAAA;AAAA,MACtE,CAAA;AAAA,MACA,MAAM,MAAM,KAAA,EAAwB;AAClC,QAAA,OAAO,OAAA,CAAQ,KAAA,EAAO,iBAAA,EAAmB,wBAAA,EAA0B;AAAA,UACjE,OAAO,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA;AAAG,SACzC,CAAA;AAAA,MACH;AAAA;AACF,GACF;AACF","file":"index.js","sourcesContent":["import {\n CardSchema,\n type CreateCardInput,\n CreateCardInputSchema,\n type DailyCountQuery,\n DailyCountResponseSchema,\n type HeatmapQuery,\n HeatmapResponseSchema,\n type ListCardsQuery,\n PaginatedSchema,\n RetentionResponseSchema,\n type SubmitReviewInput,\n SubmitReviewInputSchema,\n SubmitReviewResultSchema,\n type UpdateCardInput,\n UpdateCardInputSchema,\n} from \"@hibi/types\";\nimport { z } from \"zod\";\n\nexport interface HibiClientConfig {\n apiKey: string;\n baseUrl: string;\n fetch?: typeof fetch;\n}\n\nexport interface HibiClientError extends Error {\n status: number;\n body: unknown;\n}\n\nconst PaginatedCardSchema = PaginatedSchema(CardSchema);\nconst DueResponseSchema = z.object({\n items: z.array(\n z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState }),\n ),\n});\n\nfunction asError(status: number, body: unknown): HibiClientError {\n const err = new Error(`Hibi API error: ${status}`) as HibiClientError;\n err.status = status;\n err.body = body;\n return err;\n}\n\nexport function createHibiClient(config: HibiClientConfig) {\n const fetchImpl = config.fetch ?? fetch;\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n\n async function request<T>(\n method: string,\n path: string,\n schema: z.ZodType<T>,\n init: { body?: unknown; query?: Record<string, string | number | undefined> } = {},\n ): Promise<T> {\n const url = new URL(`${base}${path}`);\n if (init.query) {\n for (const [k, v] of Object.entries(init.query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n const requestInit: RequestInit = { method, headers };\n if (init.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n requestInit.body = JSON.stringify(init.body);\n }\n\n const res = await fetchImpl(url.toString(), requestInit);\n\n if (res.status === 204) return undefined as T;\n\n const text = await res.text();\n const body = text ? JSON.parse(text) : null;\n\n if (!res.ok) throw asError(res.status, body);\n return schema.parse(body);\n }\n\n return {\n cards: {\n async create(input: CreateCardInput) {\n const validated = CreateCardInputSchema.parse(input);\n return request(\"POST\", \"/v1/cards\", CardSchema, { body: validated });\n },\n async list(query: ListCardsQuery = { limit: 50 }) {\n return request(\"GET\", \"/v1/cards\", PaginatedCardSchema, {\n query: { limit: query.limit, cursor: query.cursor, tag: query.tag, source: query.source },\n });\n },\n async get(id: string) {\n return request(\"GET\", `/v1/cards/${id}`, CardSchema);\n },\n async update(id: string, input: UpdateCardInput) {\n const validated = UpdateCardInputSchema.parse(input);\n return request(\"PATCH\", `/v1/cards/${id}`, CardSchema, { body: validated });\n },\n async remove(id: string): Promise<void> {\n await request(\"DELETE\", `/v1/cards/${id}`, z.unknown());\n },\n },\n\n reviews: {\n async due(query: { limit?: number; before?: string } = {}) {\n return request(\"GET\", \"/v1/reviews/due\", DueResponseSchema, {\n query: { limit: query.limit, before: query.before },\n });\n },\n async submit(input: SubmitReviewInput) {\n const validated = SubmitReviewInputSchema.parse(input);\n return request(\"POST\", \"/v1/reviews\", SubmitReviewResultSchema, { body: validated });\n },\n },\n\n stats: {\n async heatmap(query: HeatmapQuery) {\n return request(\"GET\", \"/v1/stats/heatmap\", HeatmapResponseSchema, {\n query: { year: query.year },\n });\n },\n async retention() {\n return request(\"GET\", \"/v1/stats/retention\", RetentionResponseSchema);\n },\n async daily(query: DailyCountQuery) {\n return request(\"GET\", \"/v1/stats/daily\", DailyCountResponseSchema, {\n query: { from: query.from, to: query.to },\n });\n },\n },\n };\n}\n\nexport type HibiClient = ReturnType<typeof createHibiClient>;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/_vendored/hibi-types/common.ts","../src/_vendored/hibi-types/account.ts","../src/_vendored/hibi-types/cards.ts","../src/_vendored/hibi-types/reviews.ts","../src/_vendored/hibi-types/stats.ts","../src/client.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\nexport const UUIDSchema = z.uuid();\n\nexport const TimestampSchema = z.iso.datetime({ offset: true });\n\nexport const PaginationQuerySchema = z.object({\n limit: z.coerce.number().int().min(1).max(200).default(50),\n cursor: z.string().optional(),\n});\n\nexport type PaginationQuery = z.infer<typeof PaginationQuerySchema>;\n\nexport const PaginatedSchema = <T extends z.ZodTypeAny>(item: T) =>\n z.object({\n items: z.array(item),\n nextCursor: z.string().nullable(),\n });\n\nexport const ErrorResponseSchema = z.object({\n error: z.object({\n code: z.string(),\n message: z.string(),\n details: z.unknown().optional(),\n }),\n});\n\nexport type ErrorResponse = z.infer<typeof ErrorResponseSchema>;\n","import { z } from \"zod\";\nimport { TimestampSchema, UUIDSchema } from \"./common.ts\";\n\nexport const AccountSchema = z.object({\n id: UUIDSchema,\n email: z.email(),\n createdAt: TimestampSchema,\n});\nexport type Account = z.infer<typeof AccountSchema>;\n\nexport const ApiKeySchema = z.object({\n id: UUIDSchema,\n name: z.string().min(1).max(80),\n lastUsedAt: TimestampSchema.nullable(),\n createdAt: TimestampSchema,\n revokedAt: TimestampSchema.nullable(),\n});\nexport type ApiKey = z.infer<typeof ApiKeySchema>;\n\nexport const CreateApiKeyInputSchema = z.object({\n name: z.string().min(1).max(80),\n});\nexport type CreateApiKeyInput = z.infer<typeof CreateApiKeyInputSchema>;\n\nexport const CreateApiKeyResponseSchema = z.object({\n apiKey: ApiKeySchema,\n rawKey: z.string(),\n});\nexport type CreateApiKeyResponse = z.infer<typeof CreateApiKeyResponseSchema>;\n","import { z } from \"zod\";\nimport { TimestampSchema, UUIDSchema } from \"./common.ts\";\n\nexport const FuriganaPairSchema = z.object({\n base: z.string(),\n reading: z.string(),\n});\nexport type FuriganaPair = z.infer<typeof FuriganaPairSchema>;\n\nexport const KanjiEntrySchema = z.object({\n kanji: z.string().length(1),\n meaning: z.string(),\n wanikaniLevel: z.number().int().min(1).max(60).nullable(),\n});\nexport type KanjiEntry = z.infer<typeof KanjiEntrySchema>;\n\nexport const CardSchema = z.object({\n id: UUIDSchema,\n userId: UUIDSchema,\n createdAt: TimestampSchema,\n updatedAt: TimestampSchema,\n\n sentence: z.string().min(1),\n focusWord: z.string().min(1),\n focusWordReading: z.string().min(1),\n furigana: z.array(FuriganaPairSchema),\n english: z.string(),\n glosses: z.array(z.string()),\n grammarNote: z.string().nullable(),\n kanjiList: z.array(KanjiEntrySchema),\n\n imageKey: z.string().nullable(),\n audioKey: z.string().nullable(),\n\n source: z.string(),\n tags: z.array(z.string()),\n});\nexport type Card = z.infer<typeof CardSchema>;\n\nexport const CreateCardInputSchema = CardSchema.omit({\n id: true,\n userId: true,\n createdAt: true,\n updatedAt: true,\n});\nexport type CreateCardInput = z.infer<typeof CreateCardInputSchema>;\n\nexport const UpdateCardInputSchema = CreateCardInputSchema.partial();\nexport type UpdateCardInput = z.infer<typeof UpdateCardInputSchema>;\n\nexport const ListCardsQuerySchema = z.object({\n limit: z.coerce.number().int().min(1).max(200).default(50),\n cursor: z.string().optional(),\n tag: z.string().optional(),\n source: z.string().optional(),\n});\nexport type ListCardsQuery = z.infer<typeof ListCardsQuerySchema>;\n","import { z } from \"zod\";\nimport { TimestampSchema, UUIDSchema } from \"./common.ts\";\n\nexport const CardStateSchema = z.enum([\"new\", \"learning\", \"review\", \"relearning\"]);\nexport type CardStateValue = z.infer<typeof CardStateSchema>;\n\nexport const ReviewRatingSchema = z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]);\nexport type ReviewRating = z.infer<typeof ReviewRatingSchema>;\n\nexport const ReviewSchema = z.object({\n id: UUIDSchema,\n userId: UUIDSchema,\n cardId: UUIDSchema,\n rating: ReviewRatingSchema,\n reviewedAt: TimestampSchema,\n elapsedDays: z.number(),\n scheduledDays: z.number(),\n stateBefore: CardStateSchema,\n stateAfter: CardStateSchema,\n});\nexport type Review = z.infer<typeof ReviewSchema>;\n\nexport const CardStateRowSchema = z.object({\n cardId: UUIDSchema,\n userId: UUIDSchema,\n due: TimestampSchema,\n stability: z.number(),\n difficulty: z.number(),\n elapsedDays: z.number(),\n scheduledDays: z.number(),\n reps: z.number().int().nonnegative(),\n lapses: z.number().int().nonnegative(),\n learningSteps: z.number().int().nonnegative(),\n state: CardStateSchema,\n lastReview: TimestampSchema.nullable(),\n});\nexport type CardStateRow = z.infer<typeof CardStateRowSchema>;\n\nexport const DueReviewsQuerySchema = z.object({\n limit: z.coerce.number().int().min(1).max(200).default(50),\n before: TimestampSchema.optional(),\n});\nexport type DueReviewsQuery = z.infer<typeof DueReviewsQuerySchema>;\n\nexport const SubmitReviewInputSchema = z.object({\n cardId: UUIDSchema,\n rating: ReviewRatingSchema,\n reviewedAt: TimestampSchema.optional(),\n});\nexport type SubmitReviewInput = z.infer<typeof SubmitReviewInputSchema>;\n\nexport const SubmitReviewResultSchema = z.object({\n review: ReviewSchema,\n cardState: CardStateRowSchema,\n});\nexport type SubmitReviewResult = z.infer<typeof SubmitReviewResultSchema>;\n","import { z } from \"zod\";\nimport { TimestampSchema } from \"./common.ts\";\n\nexport const HeatmapDaySchema = z.object({\n date: z.iso.date(),\n count: z.number().int().nonnegative(),\n});\nexport type HeatmapDay = z.infer<typeof HeatmapDaySchema>;\n\nexport const HeatmapQuerySchema = z.object({\n year: z.coerce.number().int().min(2000).max(2100),\n});\nexport type HeatmapQuery = z.infer<typeof HeatmapQuerySchema>;\n\nexport const HeatmapResponseSchema = z.object({\n year: z.number().int(),\n days: z.array(HeatmapDaySchema),\n});\nexport type HeatmapResponse = z.infer<typeof HeatmapResponseSchema>;\n\nexport const RetentionPointSchema = z.object({\n intervalDays: z.number().int().nonnegative(),\n retention: z.number().min(0).max(1),\n sampleSize: z.number().int().nonnegative(),\n});\nexport type RetentionPoint = z.infer<typeof RetentionPointSchema>;\n\nexport const RetentionResponseSchema = z.object({\n generatedAt: TimestampSchema,\n points: z.array(RetentionPointSchema),\n});\nexport type RetentionResponse = z.infer<typeof RetentionResponseSchema>;\n\nexport const DailyCountQuerySchema = z.object({\n from: z.iso.date(),\n to: z.iso.date(),\n});\nexport type DailyCountQuery = z.infer<typeof DailyCountQuerySchema>;\n\nexport const DailyCountSchema = z.object({\n date: z.iso.date(),\n reviews: z.number().int().nonnegative(),\n again: z.number().int().nonnegative(),\n hard: z.number().int().nonnegative(),\n good: z.number().int().nonnegative(),\n easy: z.number().int().nonnegative(),\n});\nexport type DailyCount = z.infer<typeof DailyCountSchema>;\n\nexport const DailyCountResponseSchema = z.object({\n days: z.array(DailyCountSchema),\n});\nexport type DailyCountResponse = z.infer<typeof DailyCountResponseSchema>;\n","import {\n CardSchema,\n type CreateCardInput,\n CreateCardInputSchema,\n type DailyCountQuery,\n DailyCountResponseSchema,\n type HeatmapQuery,\n HeatmapResponseSchema,\n type ListCardsQuery,\n PaginatedSchema,\n RetentionResponseSchema,\n type SubmitReviewInput,\n SubmitReviewInputSchema,\n SubmitReviewResultSchema,\n type UpdateCardInput,\n UpdateCardInputSchema,\n} from \"./_vendored/hibi-types/index.ts\";\nimport { z } from \"zod\";\n\nexport interface HibiClientConfig {\n apiKey: string;\n baseUrl: string;\n fetch?: typeof fetch;\n}\n\nexport interface HibiClientError extends Error {\n status: number;\n body: unknown;\n}\n\nconst PaginatedCardSchema = PaginatedSchema(CardSchema);\nconst DueResponseSchema = z.object({\n items: z.array(\n z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState }),\n ),\n});\nconst UploadAudioResponseSchema = z.object({ key: z.string() });\n\n// React-Native-style file reference. RN's FormData.append accepts this\n// shape directly; we type it explicitly so consumers can build it\n// without depending on RN-specific globals.\nexport type RNFileRef = { uri: string; name: string; type: string };\n\n// What client.uploads.audio() accepts. On web pass a Blob/File; on RN\n// pass an RNFileRef. In both cases the SDK builds the multipart body.\nexport type AudioUploadInput = Blob | RNFileRef;\n\nfunction asError(status: number, body: unknown): HibiClientError {\n const err = new Error(`Hibi API error: ${status}`) as HibiClientError;\n err.status = status;\n err.body = body;\n return err;\n}\n\nfunction isFormData(value: unknown): value is FormData {\n return typeof FormData !== \"undefined\" && value instanceof FormData;\n}\n\nexport function createHibiClient(config: HibiClientConfig) {\n const fetchImpl = config.fetch ?? fetch;\n const base = config.baseUrl.replace(/\\/+$/, \"\");\n\n async function request<T>(\n method: string,\n path: string,\n schema: z.ZodType<T>,\n init: {\n body?: unknown;\n query?: Record<string, string | number | undefined>;\n } = {},\n ): Promise<T> {\n const url = new URL(`${base}${path}`);\n if (init.query) {\n for (const [k, v] of Object.entries(init.query)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n };\n const requestInit: RequestInit = { method, headers };\n if (init.body !== undefined) {\n if (isFormData(init.body)) {\n // Don't set Content-Type for multipart — the runtime appends\n // the correct boundary. RN in particular breaks if we set it.\n requestInit.body = init.body;\n } else {\n headers[\"Content-Type\"] = \"application/json\";\n requestInit.body = JSON.stringify(init.body);\n }\n }\n\n const res = await fetchImpl(url.toString(), requestInit);\n\n if (res.status === 204) return undefined as T;\n\n const text = await res.text();\n const body = text ? JSON.parse(text) : null;\n\n if (!res.ok) throw asError(res.status, body);\n return schema.parse(body);\n }\n\n function buildAudioForm(input: AudioUploadInput): FormData {\n const fd = new FormData();\n if (typeof Blob !== \"undefined\" && input instanceof Blob) {\n // Blob/File on web/node20+. Pass a name so the server sees a filename.\n const name = \"name\" in input && typeof input.name === \"string\" ? input.name : \"clip.m4a\";\n fd.append(\"file\", input, name);\n } else {\n // RN file ref. The cast is unavoidable: RN's FormData accepts this\n // shape but the lib.dom.d.ts FormData type doesn't model it.\n fd.append(\"file\", input as unknown as Blob);\n }\n return fd;\n }\n\n return {\n cards: {\n async create(input: CreateCardInput) {\n const validated = CreateCardInputSchema.parse(input);\n return request(\"POST\", \"/v1/cards\", CardSchema, { body: validated });\n },\n async list(query: ListCardsQuery = { limit: 50 }) {\n return request(\"GET\", \"/v1/cards\", PaginatedCardSchema, {\n query: { limit: query.limit, cursor: query.cursor, tag: query.tag, source: query.source },\n });\n },\n async get(id: string) {\n return request(\"GET\", `/v1/cards/${id}`, CardSchema);\n },\n async update(id: string, input: UpdateCardInput) {\n const validated = UpdateCardInputSchema.parse(input);\n return request(\"PATCH\", `/v1/cards/${id}`, CardSchema, { body: validated });\n },\n async remove(id: string): Promise<void> {\n await request(\"DELETE\", `/v1/cards/${id}`, z.unknown());\n },\n },\n\n uploads: {\n async audio(input: AudioUploadInput) {\n return request(\"POST\", \"/v1/uploads/audio\", UploadAudioResponseSchema, {\n body: buildAudioForm(input),\n });\n },\n },\n\n reviews: {\n async due(query: { limit?: number; before?: string } = {}) {\n return request(\"GET\", \"/v1/reviews/due\", DueResponseSchema, {\n query: { limit: query.limit, before: query.before },\n });\n },\n async submit(input: SubmitReviewInput) {\n const validated = SubmitReviewInputSchema.parse(input);\n return request(\"POST\", \"/v1/reviews\", SubmitReviewResultSchema, { body: validated });\n },\n },\n\n stats: {\n async heatmap(query: HeatmapQuery) {\n return request(\"GET\", \"/v1/stats/heatmap\", HeatmapResponseSchema, {\n query: { year: query.year },\n });\n },\n async retention() {\n return request(\"GET\", \"/v1/stats/retention\", RetentionResponseSchema);\n },\n async daily(query: DailyCountQuery) {\n return request(\"GET\", \"/v1/stats/daily\", DailyCountResponseSchema, {\n query: { from: query.from, to: query.to },\n });\n },\n },\n };\n}\n\nexport type HibiClient = ReturnType<typeof createHibiClient>;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hibi-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Official TypeScript client for the Hibi flashcard API.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -46,7 +46,6 @@
|
|
|
46
46
|
"test": "vitest run --passWithNoTests"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@hibi/types": "workspace:*",
|
|
50
49
|
"zod": "4.4.3"
|
|
51
50
|
},
|
|
52
51
|
"devDependencies": {
|