hibi-client 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +50 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +52 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -184,10 +184,36 @@ var DailyCountSchema = zod.z.object({
|
|
|
184
184
|
var DailyCountResponseSchema = zod.z.object({
|
|
185
185
|
days: zod.z.array(DailyCountSchema)
|
|
186
186
|
});
|
|
187
|
+
var WordStatusSchema = zod.z.enum(["learning", "known", "ignored"]);
|
|
188
|
+
var ManualWordStatusSchema = zod.z.object({
|
|
189
|
+
id: UUIDSchema,
|
|
190
|
+
lemma: zod.z.string().min(1),
|
|
191
|
+
reading: zod.z.string().min(1),
|
|
192
|
+
status: WordStatusSchema,
|
|
193
|
+
createdAt: TimestampSchema,
|
|
194
|
+
updatedAt: TimestampSchema
|
|
195
|
+
});
|
|
196
|
+
var SetWordStatusInputSchema = zod.z.object({
|
|
197
|
+
lemma: zod.z.string().min(1),
|
|
198
|
+
reading: zod.z.string().min(1),
|
|
199
|
+
status: WordStatusSchema.nullable()
|
|
200
|
+
});
|
|
201
|
+
var KnownWordSchema = zod.z.object({
|
|
202
|
+
lemma: zod.z.string(),
|
|
203
|
+
reading: zod.z.string(),
|
|
204
|
+
status: WordStatusSchema,
|
|
205
|
+
source: zod.z.enum(["manual", "srs"]),
|
|
206
|
+
cardId: UUIDSchema.nullable(),
|
|
207
|
+
intervalDays: zod.z.number().int().nullable(),
|
|
208
|
+
updatedAt: TimestampSchema
|
|
209
|
+
});
|
|
187
210
|
|
|
188
211
|
// src/client.ts
|
|
189
212
|
var PaginatedCardSchema = PaginatedSchema(CardSchema);
|
|
190
213
|
var PaginatedSessionSchema = PaginatedSchema(SessionSchema);
|
|
214
|
+
var PaginatedManualStatusSchema = PaginatedSchema(ManualWordStatusSchema);
|
|
215
|
+
var PaginatedKnownWordSchema = PaginatedSchema(KnownWordSchema);
|
|
216
|
+
var NullableManualStatusSchema = ManualWordStatusSchema.nullable();
|
|
191
217
|
var DueResponseSchema = zod.z.object({
|
|
192
218
|
items: zod.z.array(
|
|
193
219
|
zod.z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState })
|
|
@@ -326,6 +352,30 @@ function createHibiClient(config) {
|
|
|
326
352
|
return request("POST", "/v1/reviews", SubmitReviewResultSchema, { body: validated });
|
|
327
353
|
}
|
|
328
354
|
},
|
|
355
|
+
wordStatus: {
|
|
356
|
+
// Upsert (lemma, reading) for the caller; pass status: null to delete.
|
|
357
|
+
async set(input) {
|
|
358
|
+
const validated = SetWordStatusInputSchema.parse(input);
|
|
359
|
+
return request("PUT", "/v1/word-status", NullableManualStatusSchema, {
|
|
360
|
+
body: validated
|
|
361
|
+
});
|
|
362
|
+
},
|
|
363
|
+
// Paginated list of just the manual rows (no SRS rows).
|
|
364
|
+
async list(query = { limit: 50 }) {
|
|
365
|
+
return request("GET", "/v1/word-status", PaginatedManualStatusSchema, {
|
|
366
|
+
query: { limit: query.limit, cursor: query.cursor }
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
knownWords: {
|
|
371
|
+
// Merged manual + SRS classifications. Single source of truth for
|
|
372
|
+
// the underline-by-status view in reading clients.
|
|
373
|
+
async list(query = { limit: 50 }) {
|
|
374
|
+
return request("GET", "/v1/known-words", PaginatedKnownWordSchema, {
|
|
375
|
+
query: { limit: query.limit, cursor: query.cursor }
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
},
|
|
329
379
|
stats: {
|
|
330
380
|
async heatmap(query) {
|
|
331
381
|
return request("GET", "/v1/stats/heatmap", HeatmapResponseSchema, {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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/sessions.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, UUIDSchema } from \"./common.ts\";\n\n// Free-form per-app context (e.g. { trackId } for Hibi Koe). Keep as\n// a record so future apps can attach their own keys without a type bump.\nexport const SessionMetadataSchema = z.record(z.string(), z.unknown()).nullable();\n\nexport const SessionSchema = z.object({\n id: UUIDSchema,\n userId: UUIDSchema,\n kind: z.string().min(1),\n source: z.string().min(1),\n startedAt: TimestampSchema,\n endedAt: TimestampSchema,\n durationMs: z.number().int().nonnegative(),\n metadata: SessionMetadataSchema,\n createdAt: TimestampSchema,\n});\nexport type Session = z.infer<typeof SessionSchema>;\n\nexport const CreateSessionInputSchema = SessionSchema.omit({\n id: true,\n userId: true,\n createdAt: true,\n}).extend({\n metadata: SessionMetadataSchema.optional(),\n});\nexport type CreateSessionInput = z.infer<typeof CreateSessionInputSchema>;\n\nexport const ListSessionsQuerySchema = z.object({\n limit: z.coerce.number().int().min(1).max(200).default(50),\n cursor: z.string().optional(),\n kind: z.string().optional(),\n source: z.string().optional(),\n // Inclusive lower bound, exclusive upper. Both ISO-8601 timestamps.\n from: z.iso.datetime({ offset: true }).optional(),\n to: z.iso.datetime({ offset: true }).optional(),\n});\nexport type ListSessionsQuery = z.infer<typeof ListSessionsQuerySchema>;\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 { z } from \"zod\";\nimport {\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 CreateSessionInputSchema,\n type CreateSessionInput,\n ListSessionsQuerySchema,\n type ListSessionsQuery,\n SessionSchema,\n type SubmitReviewInput,\n SubmitReviewInputSchema,\n SubmitReviewResultSchema,\n type UpdateCardInput,\n UpdateCardInputSchema,\n} from \"./_vendored/hibi-types/index.ts\";\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 PaginatedSessionSchema = PaginatedSchema(SessionSchema);\nconst DueResponseSchema = z.object({\n items: z.array(\n z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState }),\n ),\n});\nconst UploadResponseSchema = 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.* accepts. On web pass a Blob/File; on RN pass an\n// RNFileRef. In both cases the SDK builds the multipart body.\nexport type UploadInput = Blob | RNFileRef;\nexport type AudioUploadInput = UploadInput;\n\nfunction asError(status: number, body: unknown, message?: string): HibiClientError {\n const err = new Error(message ?? `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 contentType = res.headers.get(\"content-type\") ?? \"\";\n let body: unknown = null;\n if (text) {\n if (contentType.includes(\"application/json\")) {\n try {\n body = JSON.parse(text);\n } catch (err) {\n throw asError(\n res.status,\n { rawText: text.slice(0, 500), parseError: String(err) },\n `Hibi API ${res.status}: malformed JSON from ${url.toString()} (first 200 chars: ${text.slice(0, 200)})`,\n );\n }\n } else {\n // Non-JSON response — almost always means we hit a misrouted host\n // (Vercel 404 wall, gateway HTML, captive portal). Surface the\n // first chunk of the body so the caller knows where to look.\n throw asError(\n res.status,\n { rawText: text.slice(0, 500), contentType },\n `Hibi API ${res.status}: expected JSON from ${url.toString()} but got ${contentType || \"unknown content-type\"} (first 200 chars: ${text.slice(0, 200)})`,\n );\n }\n }\n\n if (!res.ok) throw asError(res.status, body);\n return schema.parse(body);\n }\n\n function buildUploadForm(input: UploadInput, defaultName: string): 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 : defaultName;\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: UploadInput) {\n return request(\"POST\", \"/v1/uploads/audio\", UploadResponseSchema, {\n body: buildUploadForm(input, \"clip.m4a\"),\n });\n },\n async image(input: UploadInput) {\n return request(\"POST\", \"/v1/uploads/image\", UploadResponseSchema, {\n body: buildUploadForm(input, \"image.jpg\"),\n });\n },\n },\n\n sessions: {\n async create(input: CreateSessionInput) {\n const validated = CreateSessionInputSchema.parse(input);\n return request(\"POST\", \"/v1/sessions\", SessionSchema, { body: validated });\n },\n async list(query: ListSessionsQuery = { limit: 50 }) {\n const validated = ListSessionsQuerySchema.parse(query);\n return request(\"GET\", \"/v1/sessions\", PaginatedSessionSchema, {\n query: {\n limit: validated.limit,\n cursor: validated.cursor,\n kind: validated.kind,\n source: validated.source,\n from: validated.from,\n to: validated.to,\n },\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"]}
|
|
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/sessions.ts","../src/_vendored/hibi-types/stats.ts","../src/_vendored/hibi-types/word-status.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, UUIDSchema } from \"./common.ts\";\n\n// Free-form per-app context (e.g. { trackId } for Hibi Koe). Keep as\n// a record so future apps can attach their own keys without a type bump.\nexport const SessionMetadataSchema = z.record(z.string(), z.unknown()).nullable();\n\nexport const SessionSchema = z.object({\n id: UUIDSchema,\n userId: UUIDSchema,\n kind: z.string().min(1),\n source: z.string().min(1),\n startedAt: TimestampSchema,\n endedAt: TimestampSchema,\n durationMs: z.number().int().nonnegative(),\n metadata: SessionMetadataSchema,\n createdAt: TimestampSchema,\n});\nexport type Session = z.infer<typeof SessionSchema>;\n\nexport const CreateSessionInputSchema = SessionSchema.omit({\n id: true,\n userId: true,\n createdAt: true,\n}).extend({\n metadata: SessionMetadataSchema.optional(),\n});\nexport type CreateSessionInput = z.infer<typeof CreateSessionInputSchema>;\n\nexport const ListSessionsQuerySchema = z.object({\n limit: z.coerce.number().int().min(1).max(200).default(50),\n cursor: z.string().optional(),\n kind: z.string().optional(),\n source: z.string().optional(),\n // Inclusive lower bound, exclusive upper. Both ISO-8601 timestamps.\n from: z.iso.datetime({ offset: true }).optional(),\n to: z.iso.datetime({ offset: true }).optional(),\n});\nexport type ListSessionsQuery = z.infer<typeof ListSessionsQuerySchema>;\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 { z } from \"zod\";\nimport { TimestampSchema, UUIDSchema } from \"./common.ts\";\n\n// Three writeable values. 'unknown' is the implicit default and is\n// represented by the absence of a row, never stored explicitly.\nexport const WordStatusSchema = z.enum([\"learning\", \"known\", \"ignored\"]);\nexport type WordStatus = z.infer<typeof WordStatusSchema>;\n\n// Manual word-status row as the user set it. (lemma, reading) is unique\n// per-user; updating with the same key overwrites status + updatedAt.\nexport const ManualWordStatusSchema = z.object({\n id: UUIDSchema,\n lemma: z.string().min(1),\n reading: z.string().min(1),\n status: WordStatusSchema,\n createdAt: TimestampSchema,\n updatedAt: TimestampSchema,\n});\nexport type ManualWordStatus = z.infer<typeof ManualWordStatusSchema>;\n\n// PUT /v1/word-status body. status: null deletes the row.\nexport const SetWordStatusInputSchema = z.object({\n lemma: z.string().min(1),\n reading: z.string().min(1),\n status: WordStatusSchema.nullable(),\n});\nexport type SetWordStatusInput = z.infer<typeof SetWordStatusInputSchema>;\n\n// One row in the merged /v1/known-words response. source distinguishes\n// manual marks from SRS-derived classifications. When source is 'srs',\n// cardId + intervalDays are populated; clients should treat the status\n// as read-only and tell users to adjust by reviewing the card.\nexport const KnownWordSchema = z.object({\n lemma: z.string(),\n reading: z.string(),\n status: WordStatusSchema,\n source: z.enum([\"manual\", \"srs\"]),\n cardId: UUIDSchema.nullable(),\n intervalDays: z.number().int().nullable(),\n updatedAt: TimestampSchema,\n});\nexport type KnownWord = z.infer<typeof KnownWordSchema>;\n","import { z } from \"zod\";\nimport {\n CardSchema,\n type CreateCardInput,\n CreateCardInputSchema,\n type DailyCountQuery,\n DailyCountResponseSchema,\n type HeatmapQuery,\n HeatmapResponseSchema,\n KnownWordSchema,\n type ListCardsQuery,\n ManualWordStatusSchema,\n PaginatedSchema,\n type PaginationQuery,\n RetentionResponseSchema,\n CreateSessionInputSchema,\n type CreateSessionInput,\n type SetWordStatusInput,\n SetWordStatusInputSchema,\n ListSessionsQuerySchema,\n type ListSessionsQuery,\n SessionSchema,\n type SubmitReviewInput,\n SubmitReviewInputSchema,\n SubmitReviewResultSchema,\n type UpdateCardInput,\n UpdateCardInputSchema,\n} from \"./_vendored/hibi-types/index.ts\";\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 PaginatedSessionSchema = PaginatedSchema(SessionSchema);\nconst PaginatedManualStatusSchema = PaginatedSchema(ManualWordStatusSchema);\nconst PaginatedKnownWordSchema = PaginatedSchema(KnownWordSchema);\nconst NullableManualStatusSchema = ManualWordStatusSchema.nullable();\nconst DueResponseSchema = z.object({\n items: z.array(\n z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState }),\n ),\n});\nconst UploadResponseSchema = 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.* accepts. On web pass a Blob/File; on RN pass an\n// RNFileRef. In both cases the SDK builds the multipart body.\nexport type UploadInput = Blob | RNFileRef;\nexport type AudioUploadInput = UploadInput;\n\nfunction asError(status: number, body: unknown, message?: string): HibiClientError {\n const err = new Error(message ?? `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 contentType = res.headers.get(\"content-type\") ?? \"\";\n let body: unknown = null;\n if (text) {\n if (contentType.includes(\"application/json\")) {\n try {\n body = JSON.parse(text);\n } catch (err) {\n throw asError(\n res.status,\n { rawText: text.slice(0, 500), parseError: String(err) },\n `Hibi API ${res.status}: malformed JSON from ${url.toString()} (first 200 chars: ${text.slice(0, 200)})`,\n );\n }\n } else {\n // Non-JSON response — almost always means we hit a misrouted host\n // (Vercel 404 wall, gateway HTML, captive portal). Surface the\n // first chunk of the body so the caller knows where to look.\n throw asError(\n res.status,\n { rawText: text.slice(0, 500), contentType },\n `Hibi API ${res.status}: expected JSON from ${url.toString()} but got ${contentType || \"unknown content-type\"} (first 200 chars: ${text.slice(0, 200)})`,\n );\n }\n }\n\n if (!res.ok) throw asError(res.status, body);\n return schema.parse(body);\n }\n\n function buildUploadForm(input: UploadInput, defaultName: string): 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 : defaultName;\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: UploadInput) {\n return request(\"POST\", \"/v1/uploads/audio\", UploadResponseSchema, {\n body: buildUploadForm(input, \"clip.m4a\"),\n });\n },\n async image(input: UploadInput) {\n return request(\"POST\", \"/v1/uploads/image\", UploadResponseSchema, {\n body: buildUploadForm(input, \"image.jpg\"),\n });\n },\n },\n\n sessions: {\n async create(input: CreateSessionInput) {\n const validated = CreateSessionInputSchema.parse(input);\n return request(\"POST\", \"/v1/sessions\", SessionSchema, { body: validated });\n },\n async list(query: ListSessionsQuery = { limit: 50 }) {\n const validated = ListSessionsQuerySchema.parse(query);\n return request(\"GET\", \"/v1/sessions\", PaginatedSessionSchema, {\n query: {\n limit: validated.limit,\n cursor: validated.cursor,\n kind: validated.kind,\n source: validated.source,\n from: validated.from,\n to: validated.to,\n },\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 wordStatus: {\n // Upsert (lemma, reading) for the caller; pass status: null to delete.\n async set(input: SetWordStatusInput) {\n const validated = SetWordStatusInputSchema.parse(input);\n return request(\"PUT\", \"/v1/word-status\", NullableManualStatusSchema, {\n body: validated,\n });\n },\n // Paginated list of just the manual rows (no SRS rows).\n async list(query: PaginationQuery = { limit: 50 }) {\n return request(\"GET\", \"/v1/word-status\", PaginatedManualStatusSchema, {\n query: { limit: query.limit, cursor: query.cursor },\n });\n },\n },\n\n knownWords: {\n // Merged manual + SRS classifications. Single source of truth for\n // the underline-by-status view in reading clients.\n async list(query: PaginationQuery = { limit: 50 }) {\n return request(\"GET\", \"/v1/known-words\", PaginatedKnownWordSchema, {\n query: { limit: query.limit, cursor: query.cursor },\n });\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
|
@@ -89,6 +89,12 @@ declare const ListCardsQuerySchema: z.ZodObject<{
|
|
|
89
89
|
}, z.core.$strip>;
|
|
90
90
|
type ListCardsQuery = z.infer<typeof ListCardsQuerySchema>;
|
|
91
91
|
|
|
92
|
+
declare const PaginationQuerySchema: z.ZodObject<{
|
|
93
|
+
limit: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
94
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
95
|
+
}, z.core.$strip>;
|
|
96
|
+
type PaginationQuery = z.infer<typeof PaginationQuerySchema>;
|
|
97
|
+
|
|
92
98
|
declare const CardStateSchema: z.ZodEnum<{
|
|
93
99
|
new: "new";
|
|
94
100
|
learning: "learning";
|
|
@@ -267,6 +273,17 @@ declare const DailyCountResponseSchema: z.ZodObject<{
|
|
|
267
273
|
}, z.core.$strip>;
|
|
268
274
|
type DailyCountResponse = z.infer<typeof DailyCountResponseSchema>;
|
|
269
275
|
|
|
276
|
+
declare const SetWordStatusInputSchema: z.ZodObject<{
|
|
277
|
+
lemma: z.ZodString;
|
|
278
|
+
reading: z.ZodString;
|
|
279
|
+
status: z.ZodNullable<z.ZodEnum<{
|
|
280
|
+
learning: "learning";
|
|
281
|
+
known: "known";
|
|
282
|
+
ignored: "ignored";
|
|
283
|
+
}>>;
|
|
284
|
+
}, z.core.$strip>;
|
|
285
|
+
type SetWordStatusInput = z.infer<typeof SetWordStatusInputSchema>;
|
|
286
|
+
|
|
270
287
|
interface HibiClientConfig {
|
|
271
288
|
apiKey: string;
|
|
272
289
|
baseUrl: string;
|
|
@@ -500,6 +517,41 @@ declare function createHibiClient(config: HibiClientConfig): {
|
|
|
500
517
|
};
|
|
501
518
|
}>;
|
|
502
519
|
};
|
|
520
|
+
wordStatus: {
|
|
521
|
+
set(input: SetWordStatusInput): Promise<{
|
|
522
|
+
id: string;
|
|
523
|
+
lemma: string;
|
|
524
|
+
reading: string;
|
|
525
|
+
status: "learning" | "known" | "ignored";
|
|
526
|
+
createdAt: string;
|
|
527
|
+
updatedAt: string;
|
|
528
|
+
} | null>;
|
|
529
|
+
list(query?: PaginationQuery): Promise<{
|
|
530
|
+
items: {
|
|
531
|
+
id: string;
|
|
532
|
+
lemma: string;
|
|
533
|
+
reading: string;
|
|
534
|
+
status: "learning" | "known" | "ignored";
|
|
535
|
+
createdAt: string;
|
|
536
|
+
updatedAt: string;
|
|
537
|
+
}[];
|
|
538
|
+
nextCursor: string | null;
|
|
539
|
+
}>;
|
|
540
|
+
};
|
|
541
|
+
knownWords: {
|
|
542
|
+
list(query?: PaginationQuery): Promise<{
|
|
543
|
+
items: {
|
|
544
|
+
lemma: string;
|
|
545
|
+
reading: string;
|
|
546
|
+
status: "learning" | "known" | "ignored";
|
|
547
|
+
source: "manual" | "srs";
|
|
548
|
+
cardId: string | null;
|
|
549
|
+
intervalDays: number | null;
|
|
550
|
+
updatedAt: string;
|
|
551
|
+
}[];
|
|
552
|
+
nextCursor: string | null;
|
|
553
|
+
}>;
|
|
554
|
+
};
|
|
503
555
|
stats: {
|
|
504
556
|
heatmap(query: HeatmapQuery): Promise<{
|
|
505
557
|
year: number;
|
package/dist/index.d.ts
CHANGED
|
@@ -89,6 +89,12 @@ declare const ListCardsQuerySchema: z.ZodObject<{
|
|
|
89
89
|
}, z.core.$strip>;
|
|
90
90
|
type ListCardsQuery = z.infer<typeof ListCardsQuerySchema>;
|
|
91
91
|
|
|
92
|
+
declare const PaginationQuerySchema: z.ZodObject<{
|
|
93
|
+
limit: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
94
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
95
|
+
}, z.core.$strip>;
|
|
96
|
+
type PaginationQuery = z.infer<typeof PaginationQuerySchema>;
|
|
97
|
+
|
|
92
98
|
declare const CardStateSchema: z.ZodEnum<{
|
|
93
99
|
new: "new";
|
|
94
100
|
learning: "learning";
|
|
@@ -267,6 +273,17 @@ declare const DailyCountResponseSchema: z.ZodObject<{
|
|
|
267
273
|
}, z.core.$strip>;
|
|
268
274
|
type DailyCountResponse = z.infer<typeof DailyCountResponseSchema>;
|
|
269
275
|
|
|
276
|
+
declare const SetWordStatusInputSchema: z.ZodObject<{
|
|
277
|
+
lemma: z.ZodString;
|
|
278
|
+
reading: z.ZodString;
|
|
279
|
+
status: z.ZodNullable<z.ZodEnum<{
|
|
280
|
+
learning: "learning";
|
|
281
|
+
known: "known";
|
|
282
|
+
ignored: "ignored";
|
|
283
|
+
}>>;
|
|
284
|
+
}, z.core.$strip>;
|
|
285
|
+
type SetWordStatusInput = z.infer<typeof SetWordStatusInputSchema>;
|
|
286
|
+
|
|
270
287
|
interface HibiClientConfig {
|
|
271
288
|
apiKey: string;
|
|
272
289
|
baseUrl: string;
|
|
@@ -500,6 +517,41 @@ declare function createHibiClient(config: HibiClientConfig): {
|
|
|
500
517
|
};
|
|
501
518
|
}>;
|
|
502
519
|
};
|
|
520
|
+
wordStatus: {
|
|
521
|
+
set(input: SetWordStatusInput): Promise<{
|
|
522
|
+
id: string;
|
|
523
|
+
lemma: string;
|
|
524
|
+
reading: string;
|
|
525
|
+
status: "learning" | "known" | "ignored";
|
|
526
|
+
createdAt: string;
|
|
527
|
+
updatedAt: string;
|
|
528
|
+
} | null>;
|
|
529
|
+
list(query?: PaginationQuery): Promise<{
|
|
530
|
+
items: {
|
|
531
|
+
id: string;
|
|
532
|
+
lemma: string;
|
|
533
|
+
reading: string;
|
|
534
|
+
status: "learning" | "known" | "ignored";
|
|
535
|
+
createdAt: string;
|
|
536
|
+
updatedAt: string;
|
|
537
|
+
}[];
|
|
538
|
+
nextCursor: string | null;
|
|
539
|
+
}>;
|
|
540
|
+
};
|
|
541
|
+
knownWords: {
|
|
542
|
+
list(query?: PaginationQuery): Promise<{
|
|
543
|
+
items: {
|
|
544
|
+
lemma: string;
|
|
545
|
+
reading: string;
|
|
546
|
+
status: "learning" | "known" | "ignored";
|
|
547
|
+
source: "manual" | "srs";
|
|
548
|
+
cardId: string | null;
|
|
549
|
+
intervalDays: number | null;
|
|
550
|
+
updatedAt: string;
|
|
551
|
+
}[];
|
|
552
|
+
nextCursor: string | null;
|
|
553
|
+
}>;
|
|
554
|
+
};
|
|
503
555
|
stats: {
|
|
504
556
|
heatmap(query: HeatmapQuery): Promise<{
|
|
505
557
|
year: number;
|
package/dist/index.js
CHANGED
|
@@ -182,10 +182,36 @@ var DailyCountSchema = z.object({
|
|
|
182
182
|
var DailyCountResponseSchema = z.object({
|
|
183
183
|
days: z.array(DailyCountSchema)
|
|
184
184
|
});
|
|
185
|
+
var WordStatusSchema = z.enum(["learning", "known", "ignored"]);
|
|
186
|
+
var ManualWordStatusSchema = z.object({
|
|
187
|
+
id: UUIDSchema,
|
|
188
|
+
lemma: z.string().min(1),
|
|
189
|
+
reading: z.string().min(1),
|
|
190
|
+
status: WordStatusSchema,
|
|
191
|
+
createdAt: TimestampSchema,
|
|
192
|
+
updatedAt: TimestampSchema
|
|
193
|
+
});
|
|
194
|
+
var SetWordStatusInputSchema = z.object({
|
|
195
|
+
lemma: z.string().min(1),
|
|
196
|
+
reading: z.string().min(1),
|
|
197
|
+
status: WordStatusSchema.nullable()
|
|
198
|
+
});
|
|
199
|
+
var KnownWordSchema = z.object({
|
|
200
|
+
lemma: z.string(),
|
|
201
|
+
reading: z.string(),
|
|
202
|
+
status: WordStatusSchema,
|
|
203
|
+
source: z.enum(["manual", "srs"]),
|
|
204
|
+
cardId: UUIDSchema.nullable(),
|
|
205
|
+
intervalDays: z.number().int().nullable(),
|
|
206
|
+
updatedAt: TimestampSchema
|
|
207
|
+
});
|
|
185
208
|
|
|
186
209
|
// src/client.ts
|
|
187
210
|
var PaginatedCardSchema = PaginatedSchema(CardSchema);
|
|
188
211
|
var PaginatedSessionSchema = PaginatedSchema(SessionSchema);
|
|
212
|
+
var PaginatedManualStatusSchema = PaginatedSchema(ManualWordStatusSchema);
|
|
213
|
+
var PaginatedKnownWordSchema = PaginatedSchema(KnownWordSchema);
|
|
214
|
+
var NullableManualStatusSchema = ManualWordStatusSchema.nullable();
|
|
189
215
|
var DueResponseSchema = z.object({
|
|
190
216
|
items: z.array(
|
|
191
217
|
z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState })
|
|
@@ -324,6 +350,30 @@ function createHibiClient(config) {
|
|
|
324
350
|
return request("POST", "/v1/reviews", SubmitReviewResultSchema, { body: validated });
|
|
325
351
|
}
|
|
326
352
|
},
|
|
353
|
+
wordStatus: {
|
|
354
|
+
// Upsert (lemma, reading) for the caller; pass status: null to delete.
|
|
355
|
+
async set(input) {
|
|
356
|
+
const validated = SetWordStatusInputSchema.parse(input);
|
|
357
|
+
return request("PUT", "/v1/word-status", NullableManualStatusSchema, {
|
|
358
|
+
body: validated
|
|
359
|
+
});
|
|
360
|
+
},
|
|
361
|
+
// Paginated list of just the manual rows (no SRS rows).
|
|
362
|
+
async list(query = { limit: 50 }) {
|
|
363
|
+
return request("GET", "/v1/word-status", PaginatedManualStatusSchema, {
|
|
364
|
+
query: { limit: query.limit, cursor: query.cursor }
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
knownWords: {
|
|
369
|
+
// Merged manual + SRS classifications. Single source of truth for
|
|
370
|
+
// the underline-by-status view in reading clients.
|
|
371
|
+
async list(query = { limit: 50 }) {
|
|
372
|
+
return request("GET", "/v1/known-words", PaginatedKnownWordSchema, {
|
|
373
|
+
query: { limit: query.limit, cursor: query.cursor }
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
},
|
|
327
377
|
stats: {
|
|
328
378
|
async heatmap(query) {
|
|
329
379
|
return request("GET", "/v1/stats/heatmap", HeatmapResponseSchema, {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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/sessions.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, UUIDSchema } from \"./common.ts\";\n\n// Free-form per-app context (e.g. { trackId } for Hibi Koe). Keep as\n// a record so future apps can attach their own keys without a type bump.\nexport const SessionMetadataSchema = z.record(z.string(), z.unknown()).nullable();\n\nexport const SessionSchema = z.object({\n id: UUIDSchema,\n userId: UUIDSchema,\n kind: z.string().min(1),\n source: z.string().min(1),\n startedAt: TimestampSchema,\n endedAt: TimestampSchema,\n durationMs: z.number().int().nonnegative(),\n metadata: SessionMetadataSchema,\n createdAt: TimestampSchema,\n});\nexport type Session = z.infer<typeof SessionSchema>;\n\nexport const CreateSessionInputSchema = SessionSchema.omit({\n id: true,\n userId: true,\n createdAt: true,\n}).extend({\n metadata: SessionMetadataSchema.optional(),\n});\nexport type CreateSessionInput = z.infer<typeof CreateSessionInputSchema>;\n\nexport const ListSessionsQuerySchema = z.object({\n limit: z.coerce.number().int().min(1).max(200).default(50),\n cursor: z.string().optional(),\n kind: z.string().optional(),\n source: z.string().optional(),\n // Inclusive lower bound, exclusive upper. Both ISO-8601 timestamps.\n from: z.iso.datetime({ offset: true }).optional(),\n to: z.iso.datetime({ offset: true }).optional(),\n});\nexport type ListSessionsQuery = z.infer<typeof ListSessionsQuerySchema>;\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 { z } from \"zod\";\nimport {\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 CreateSessionInputSchema,\n type CreateSessionInput,\n ListSessionsQuerySchema,\n type ListSessionsQuery,\n SessionSchema,\n type SubmitReviewInput,\n SubmitReviewInputSchema,\n SubmitReviewResultSchema,\n type UpdateCardInput,\n UpdateCardInputSchema,\n} from \"./_vendored/hibi-types/index.ts\";\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 PaginatedSessionSchema = PaginatedSchema(SessionSchema);\nconst DueResponseSchema = z.object({\n items: z.array(\n z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState }),\n ),\n});\nconst UploadResponseSchema = 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.* accepts. On web pass a Blob/File; on RN pass an\n// RNFileRef. In both cases the SDK builds the multipart body.\nexport type UploadInput = Blob | RNFileRef;\nexport type AudioUploadInput = UploadInput;\n\nfunction asError(status: number, body: unknown, message?: string): HibiClientError {\n const err = new Error(message ?? `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 contentType = res.headers.get(\"content-type\") ?? \"\";\n let body: unknown = null;\n if (text) {\n if (contentType.includes(\"application/json\")) {\n try {\n body = JSON.parse(text);\n } catch (err) {\n throw asError(\n res.status,\n { rawText: text.slice(0, 500), parseError: String(err) },\n `Hibi API ${res.status}: malformed JSON from ${url.toString()} (first 200 chars: ${text.slice(0, 200)})`,\n );\n }\n } else {\n // Non-JSON response — almost always means we hit a misrouted host\n // (Vercel 404 wall, gateway HTML, captive portal). Surface the\n // first chunk of the body so the caller knows where to look.\n throw asError(\n res.status,\n { rawText: text.slice(0, 500), contentType },\n `Hibi API ${res.status}: expected JSON from ${url.toString()} but got ${contentType || \"unknown content-type\"} (first 200 chars: ${text.slice(0, 200)})`,\n );\n }\n }\n\n if (!res.ok) throw asError(res.status, body);\n return schema.parse(body);\n }\n\n function buildUploadForm(input: UploadInput, defaultName: string): 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 : defaultName;\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: UploadInput) {\n return request(\"POST\", \"/v1/uploads/audio\", UploadResponseSchema, {\n body: buildUploadForm(input, \"clip.m4a\"),\n });\n },\n async image(input: UploadInput) {\n return request(\"POST\", \"/v1/uploads/image\", UploadResponseSchema, {\n body: buildUploadForm(input, \"image.jpg\"),\n });\n },\n },\n\n sessions: {\n async create(input: CreateSessionInput) {\n const validated = CreateSessionInputSchema.parse(input);\n return request(\"POST\", \"/v1/sessions\", SessionSchema, { body: validated });\n },\n async list(query: ListSessionsQuery = { limit: 50 }) {\n const validated = ListSessionsQuerySchema.parse(query);\n return request(\"GET\", \"/v1/sessions\", PaginatedSessionSchema, {\n query: {\n limit: validated.limit,\n cursor: validated.cursor,\n kind: validated.kind,\n source: validated.source,\n from: validated.from,\n to: validated.to,\n },\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"]}
|
|
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/sessions.ts","../src/_vendored/hibi-types/stats.ts","../src/_vendored/hibi-types/word-status.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, UUIDSchema } from \"./common.ts\";\n\n// Free-form per-app context (e.g. { trackId } for Hibi Koe). Keep as\n// a record so future apps can attach their own keys without a type bump.\nexport const SessionMetadataSchema = z.record(z.string(), z.unknown()).nullable();\n\nexport const SessionSchema = z.object({\n id: UUIDSchema,\n userId: UUIDSchema,\n kind: z.string().min(1),\n source: z.string().min(1),\n startedAt: TimestampSchema,\n endedAt: TimestampSchema,\n durationMs: z.number().int().nonnegative(),\n metadata: SessionMetadataSchema,\n createdAt: TimestampSchema,\n});\nexport type Session = z.infer<typeof SessionSchema>;\n\nexport const CreateSessionInputSchema = SessionSchema.omit({\n id: true,\n userId: true,\n createdAt: true,\n}).extend({\n metadata: SessionMetadataSchema.optional(),\n});\nexport type CreateSessionInput = z.infer<typeof CreateSessionInputSchema>;\n\nexport const ListSessionsQuerySchema = z.object({\n limit: z.coerce.number().int().min(1).max(200).default(50),\n cursor: z.string().optional(),\n kind: z.string().optional(),\n source: z.string().optional(),\n // Inclusive lower bound, exclusive upper. Both ISO-8601 timestamps.\n from: z.iso.datetime({ offset: true }).optional(),\n to: z.iso.datetime({ offset: true }).optional(),\n});\nexport type ListSessionsQuery = z.infer<typeof ListSessionsQuerySchema>;\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 { z } from \"zod\";\nimport { TimestampSchema, UUIDSchema } from \"./common.ts\";\n\n// Three writeable values. 'unknown' is the implicit default and is\n// represented by the absence of a row, never stored explicitly.\nexport const WordStatusSchema = z.enum([\"learning\", \"known\", \"ignored\"]);\nexport type WordStatus = z.infer<typeof WordStatusSchema>;\n\n// Manual word-status row as the user set it. (lemma, reading) is unique\n// per-user; updating with the same key overwrites status + updatedAt.\nexport const ManualWordStatusSchema = z.object({\n id: UUIDSchema,\n lemma: z.string().min(1),\n reading: z.string().min(1),\n status: WordStatusSchema,\n createdAt: TimestampSchema,\n updatedAt: TimestampSchema,\n});\nexport type ManualWordStatus = z.infer<typeof ManualWordStatusSchema>;\n\n// PUT /v1/word-status body. status: null deletes the row.\nexport const SetWordStatusInputSchema = z.object({\n lemma: z.string().min(1),\n reading: z.string().min(1),\n status: WordStatusSchema.nullable(),\n});\nexport type SetWordStatusInput = z.infer<typeof SetWordStatusInputSchema>;\n\n// One row in the merged /v1/known-words response. source distinguishes\n// manual marks from SRS-derived classifications. When source is 'srs',\n// cardId + intervalDays are populated; clients should treat the status\n// as read-only and tell users to adjust by reviewing the card.\nexport const KnownWordSchema = z.object({\n lemma: z.string(),\n reading: z.string(),\n status: WordStatusSchema,\n source: z.enum([\"manual\", \"srs\"]),\n cardId: UUIDSchema.nullable(),\n intervalDays: z.number().int().nullable(),\n updatedAt: TimestampSchema,\n});\nexport type KnownWord = z.infer<typeof KnownWordSchema>;\n","import { z } from \"zod\";\nimport {\n CardSchema,\n type CreateCardInput,\n CreateCardInputSchema,\n type DailyCountQuery,\n DailyCountResponseSchema,\n type HeatmapQuery,\n HeatmapResponseSchema,\n KnownWordSchema,\n type ListCardsQuery,\n ManualWordStatusSchema,\n PaginatedSchema,\n type PaginationQuery,\n RetentionResponseSchema,\n CreateSessionInputSchema,\n type CreateSessionInput,\n type SetWordStatusInput,\n SetWordStatusInputSchema,\n ListSessionsQuerySchema,\n type ListSessionsQuery,\n SessionSchema,\n type SubmitReviewInput,\n SubmitReviewInputSchema,\n SubmitReviewResultSchema,\n type UpdateCardInput,\n UpdateCardInputSchema,\n} from \"./_vendored/hibi-types/index.ts\";\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 PaginatedSessionSchema = PaginatedSchema(SessionSchema);\nconst PaginatedManualStatusSchema = PaginatedSchema(ManualWordStatusSchema);\nconst PaginatedKnownWordSchema = PaginatedSchema(KnownWordSchema);\nconst NullableManualStatusSchema = ManualWordStatusSchema.nullable();\nconst DueResponseSchema = z.object({\n items: z.array(\n z.object({ card: CardSchema, cardState: SubmitReviewResultSchema.shape.cardState }),\n ),\n});\nconst UploadResponseSchema = 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.* accepts. On web pass a Blob/File; on RN pass an\n// RNFileRef. In both cases the SDK builds the multipart body.\nexport type UploadInput = Blob | RNFileRef;\nexport type AudioUploadInput = UploadInput;\n\nfunction asError(status: number, body: unknown, message?: string): HibiClientError {\n const err = new Error(message ?? `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 contentType = res.headers.get(\"content-type\") ?? \"\";\n let body: unknown = null;\n if (text) {\n if (contentType.includes(\"application/json\")) {\n try {\n body = JSON.parse(text);\n } catch (err) {\n throw asError(\n res.status,\n { rawText: text.slice(0, 500), parseError: String(err) },\n `Hibi API ${res.status}: malformed JSON from ${url.toString()} (first 200 chars: ${text.slice(0, 200)})`,\n );\n }\n } else {\n // Non-JSON response — almost always means we hit a misrouted host\n // (Vercel 404 wall, gateway HTML, captive portal). Surface the\n // first chunk of the body so the caller knows where to look.\n throw asError(\n res.status,\n { rawText: text.slice(0, 500), contentType },\n `Hibi API ${res.status}: expected JSON from ${url.toString()} but got ${contentType || \"unknown content-type\"} (first 200 chars: ${text.slice(0, 200)})`,\n );\n }\n }\n\n if (!res.ok) throw asError(res.status, body);\n return schema.parse(body);\n }\n\n function buildUploadForm(input: UploadInput, defaultName: string): 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 : defaultName;\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: UploadInput) {\n return request(\"POST\", \"/v1/uploads/audio\", UploadResponseSchema, {\n body: buildUploadForm(input, \"clip.m4a\"),\n });\n },\n async image(input: UploadInput) {\n return request(\"POST\", \"/v1/uploads/image\", UploadResponseSchema, {\n body: buildUploadForm(input, \"image.jpg\"),\n });\n },\n },\n\n sessions: {\n async create(input: CreateSessionInput) {\n const validated = CreateSessionInputSchema.parse(input);\n return request(\"POST\", \"/v1/sessions\", SessionSchema, { body: validated });\n },\n async list(query: ListSessionsQuery = { limit: 50 }) {\n const validated = ListSessionsQuerySchema.parse(query);\n return request(\"GET\", \"/v1/sessions\", PaginatedSessionSchema, {\n query: {\n limit: validated.limit,\n cursor: validated.cursor,\n kind: validated.kind,\n source: validated.source,\n from: validated.from,\n to: validated.to,\n },\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 wordStatus: {\n // Upsert (lemma, reading) for the caller; pass status: null to delete.\n async set(input: SetWordStatusInput) {\n const validated = SetWordStatusInputSchema.parse(input);\n return request(\"PUT\", \"/v1/word-status\", NullableManualStatusSchema, {\n body: validated,\n });\n },\n // Paginated list of just the manual rows (no SRS rows).\n async list(query: PaginationQuery = { limit: 50 }) {\n return request(\"GET\", \"/v1/word-status\", PaginatedManualStatusSchema, {\n query: { limit: query.limit, cursor: query.cursor },\n });\n },\n },\n\n knownWords: {\n // Merged manual + SRS classifications. Single source of truth for\n // the underline-by-status view in reading clients.\n async list(query: PaginationQuery = { limit: 50 }) {\n return request(\"GET\", \"/v1/known-words\", PaginatedKnownWordSchema, {\n query: { limit: query.limit, cursor: query.cursor },\n });\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"]}
|