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 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/client.ts
7
- var PaginatedCardSchema = types.PaginatedSchema(types.CardSchema);
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: types.CardSchema, cardState: types.SubmitReviewResultSchema.shape.cardState })
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
- headers["Content-Type"] = "application/json";
35
- requestInit.body = JSON.stringify(init.body);
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 = types.CreateCardInputSchema.parse(input);
48
- return request("POST", "/v1/cards", types.CardSchema, { body: validated });
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}`, types.CardSchema);
226
+ return request("GET", `/v1/cards/${id}`, CardSchema);
57
227
  },
58
228
  async update(id, input) {
59
- const validated = types.UpdateCardInputSchema.parse(input);
60
- return request("PATCH", `/v1/cards/${id}`, types.CardSchema, { body: validated });
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 = types.SubmitReviewInputSchema.parse(input);
74
- return request("POST", "/v1/reviews", types.SubmitReviewResultSchema, { body: validated });
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", types.HeatmapResponseSchema, {
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", types.RetentionResponseSchema);
261
+ return request("GET", "/v1/stats/retention", RetentionResponseSchema);
85
262
  },
86
263
  async daily(query) {
87
- return request("GET", "/v1/stats/daily", types.DailyCountResponseSchema, {
264
+ return request("GET", "/v1/stats/daily", DailyCountResponseSchema, {
88
265
  query: { from: query.from, to: query.to }
89
266
  });
90
267
  }
@@ -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 { CreateCardInput, ListCardsQuery, UpdateCardInput, SubmitReviewInput, HeatmapQuery, DailyCountQuery } from '@hibi/types';
2
- export { Card, CardStateRow, CardStateValue, CreateCardInput, DailyCount, DailyCountResponse, FuriganaPair, HeatmapDay, HeatmapResponse, KanjiEntry, ListCardsQuery, RetentionPoint, RetentionResponse, Review, ReviewRating, SubmitReviewInput, SubmitReviewResult, UpdateCardInput } from '@hibi/types';
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 { CreateCardInput, ListCardsQuery, UpdateCardInput, SubmitReviewInput, HeatmapQuery, DailyCountQuery } from '@hibi/types';
2
- export { Card, CardStateRow, CardStateValue, CreateCardInput, DailyCount, DailyCountResponse, FuriganaPair, HeatmapDay, HeatmapResponse, KanjiEntry, ListCardsQuery, RetentionPoint, RetentionResponse, Review, ReviewRating, SubmitReviewInput, SubmitReviewResult, UpdateCardInput } from '@hibi/types';
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/client.ts
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
- headers["Content-Type"] = "application/json";
33
- requestInit.body = JSON.stringify(init.body);
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":"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","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.0.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": {