@mindbill/browser 0.4.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -7
- package/dist/index.d.ts +47 -19
- package/dist/index.js +49 -70
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,19 +8,43 @@ the Partner API key never reaches the browser.
|
|
|
8
8
|
import { createBillLifecycleClient } from "@mindbill/browser";
|
|
9
9
|
|
|
10
10
|
const billing = createBillLifecycleClient({
|
|
11
|
+
billId: "bill_123",
|
|
11
12
|
sessionEndpoint: "/api/mindbill/session",
|
|
12
13
|
});
|
|
13
14
|
|
|
14
|
-
const
|
|
15
|
+
const data = await billing.getLifecycle();
|
|
16
|
+
const packet = await billing.getPacket();
|
|
15
17
|
```
|
|
16
18
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
The browser client operates only on an already-submitted bill. It loads the
|
|
20
|
+
immutable snapshot, server-owned activity history, current lifecycle actions,
|
|
21
|
+
EORs, and the complete submission packet. It can execute only actions authorized
|
|
22
|
+
by the server, including Second Bill Review, payment posting, close, and reopen.
|
|
23
|
+
Bill creation, document selection, review, and the atomic submission stay on the partner server.
|
|
24
|
+
The public lifecycle begins at `submitted`, then advances through `accepted`,
|
|
25
|
+
`processed`, and `closed`; it never exposes draft or queued states. The same
|
|
26
|
+
lifecycle client is safe to use from React, Angular, or plain JavaScript.
|
|
20
27
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
Pre-submission components can query canonical routing reference data without
|
|
29
|
+
inventing a draft bill:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { createBillReferenceClient } from "@mindbill/browser";
|
|
33
|
+
|
|
34
|
+
const references = createBillReferenceClient({
|
|
35
|
+
sessionEndpoint: "/api/mindbill/session",
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const payers = await references.searchClaimsAdministrators("Zurich", "claim-123");
|
|
39
|
+
const diagnoses = await references.searchDiagnosisCodes("left knee");
|
|
40
|
+
const place = await references.lookupPostalCode("94403");
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
This client exposes reference-data operations only. It never creates or mutates
|
|
44
|
+
a bill; the first persisted bill remains the submitted immutable snapshot.
|
|
45
|
+
|
|
46
|
+
Pass `billId` for the submitted bill. An optional `resource: { billId }`
|
|
47
|
+
restriction makes the session usable for only that bill.
|
|
24
48
|
|
|
25
49
|
The session endpoint is the only required partner-server integration. See the
|
|
26
50
|
[10-minute quickstart](https://docs.mindbill.org/quickstart).
|
package/dist/index.d.ts
CHANGED
|
@@ -73,6 +73,14 @@ type BillReviewPayer = {
|
|
|
73
73
|
label: string;
|
|
74
74
|
}>;
|
|
75
75
|
};
|
|
76
|
+
type BillPostalPlace = {
|
|
77
|
+
city: string;
|
|
78
|
+
state: string;
|
|
79
|
+
};
|
|
80
|
+
type BillDiagnosisCode = {
|
|
81
|
+
code: string;
|
|
82
|
+
description: string;
|
|
83
|
+
};
|
|
76
84
|
type BillReviewFeatures = {
|
|
77
85
|
authorizationNumber?: boolean;
|
|
78
86
|
serviceDateRange?: boolean;
|
|
@@ -112,6 +120,13 @@ type BillReviewData = {
|
|
|
112
120
|
middleName?: string;
|
|
113
121
|
lastName?: string;
|
|
114
122
|
dob?: string;
|
|
123
|
+
phone?: string;
|
|
124
|
+
address?: {
|
|
125
|
+
line1?: string;
|
|
126
|
+
city?: string;
|
|
127
|
+
state?: string;
|
|
128
|
+
postalCode?: string;
|
|
129
|
+
};
|
|
115
130
|
};
|
|
116
131
|
injury: {
|
|
117
132
|
claimNumber?: string;
|
|
@@ -122,6 +137,8 @@ type BillReviewData = {
|
|
|
122
137
|
adjNumber?: string;
|
|
123
138
|
claimsAdminId?: string;
|
|
124
139
|
claimsAdminName?: string;
|
|
140
|
+
injuryDescription?: string;
|
|
141
|
+
diagnosisCodes?: string[];
|
|
125
142
|
claimPatternStatus?: BillReviewClaimPatternStatus;
|
|
126
143
|
};
|
|
127
144
|
};
|
|
@@ -203,7 +220,7 @@ type SubmitBillInput = {
|
|
|
203
220
|
subject?: string;
|
|
204
221
|
note?: string;
|
|
205
222
|
};
|
|
206
|
-
type BillLifecycleActionId = "
|
|
223
|
+
type BillLifecycleActionId = "second_review" | "independent_bill_review" | "view_eor" | "post_payment" | "close" | "reopen";
|
|
207
224
|
type BillLifecycleAction = {
|
|
208
225
|
id: BillLifecycleActionId;
|
|
209
226
|
label: string;
|
|
@@ -222,6 +239,7 @@ type BillActivityRecord = {
|
|
|
222
239
|
id: string;
|
|
223
240
|
type: string;
|
|
224
241
|
createdAt: string;
|
|
242
|
+
title?: string;
|
|
225
243
|
description: string;
|
|
226
244
|
actor: string | null;
|
|
227
245
|
delivery: BillSubmissionRoute | null;
|
|
@@ -282,6 +300,9 @@ type BillLifecycleSessionProvider = (request: BillLifecycleSessionRequest) => Pr
|
|
|
282
300
|
type CloseBillInput = {
|
|
283
301
|
reason: string;
|
|
284
302
|
};
|
|
303
|
+
type ReopenBillInput = {
|
|
304
|
+
reason: string;
|
|
305
|
+
};
|
|
285
306
|
type PostBillPaymentInput = {
|
|
286
307
|
amount: number;
|
|
287
308
|
method: "check" | "eft";
|
|
@@ -312,7 +333,7 @@ type BrowserBillCreateInput = {
|
|
|
312
333
|
firstName: string;
|
|
313
334
|
middleName?: string;
|
|
314
335
|
lastName: string;
|
|
315
|
-
dateOfBirth
|
|
336
|
+
dateOfBirth: string;
|
|
316
337
|
ssn?: string;
|
|
317
338
|
gender?: "M" | "F" | "X";
|
|
318
339
|
phone?: string;
|
|
@@ -371,38 +392,45 @@ type BrowserBillCreateInput = {
|
|
|
371
392
|
}>;
|
|
372
393
|
};
|
|
373
394
|
type BillLifecycleClientOptions = {
|
|
374
|
-
/**
|
|
375
|
-
billId
|
|
395
|
+
/** ID of an already-submitted bill. Bills are created only by the atomic server API. */
|
|
396
|
+
billId: string;
|
|
376
397
|
sessionEndpoint?: string | undefined;
|
|
377
398
|
getSession?: BillLifecycleSessionProvider | undefined;
|
|
378
399
|
apiBaseUrl?: string | undefined;
|
|
379
400
|
fetch?: typeof globalThis.fetch | undefined;
|
|
380
401
|
};
|
|
402
|
+
/** Browser-session options for pre-submission reference-data lookups. */
|
|
403
|
+
type BillReferenceClientOptions = Omit<BillLifecycleClientOptions, "billId">;
|
|
404
|
+
type BillReferenceClient = {
|
|
405
|
+
searchClaimsAdministrators: (query: string, claimNumber?: string) => Promise<BillReviewPayer[]>;
|
|
406
|
+
searchDiagnosisCodes: (query: string, limit?: number) => Promise<BillDiagnosisCode[]>;
|
|
407
|
+
lookupPostalCode: (postalCode: string) => Promise<BillPostalPlace | null>;
|
|
408
|
+
clearSession: () => void;
|
|
409
|
+
};
|
|
381
410
|
type BillLifecycleClient = {
|
|
382
|
-
getBillId: () => string
|
|
383
|
-
createBill: (input: BrowserBillCreateInput) => Promise<{
|
|
384
|
-
billId: string;
|
|
385
|
-
data: BillLifecycleData;
|
|
386
|
-
}>;
|
|
411
|
+
getBillId: () => string;
|
|
387
412
|
getLifecycle: (signal?: AbortSignal) => Promise<BillLifecycleData>;
|
|
388
413
|
searchClaimsAdministrators: (query: string, claimNumber?: string) => Promise<BillReviewPayer[]>;
|
|
414
|
+
searchDiagnosisCodes: (query: string, limit?: number) => Promise<BillDiagnosisCode[]>;
|
|
415
|
+
lookupPostalCode: (postalCode: string) => Promise<BillPostalPlace | null>;
|
|
389
416
|
getDeliveryOptions: () => Promise<BillDeliveryOptions>;
|
|
390
|
-
saveReview: (input: BillReviewSaveInput) => Promise<BillLifecycleData>;
|
|
391
|
-
submitBill: (input: BillReviewSaveInput, submission: SubmitBillInput) => Promise<BillLifecycleData>;
|
|
392
|
-
addAttachment: (file: File, documentType: BillReviewDocumentType, description?: string) => Promise<BillLifecycleData>;
|
|
393
|
-
removeAttachment: (attachmentId: string) => Promise<BillLifecycleData>;
|
|
394
417
|
getAttachment: (attachmentId: string) => Promise<Blob>;
|
|
395
418
|
getEor: (documentId: string) => Promise<Blob>;
|
|
419
|
+
getPacket: () => Promise<Blob>;
|
|
396
420
|
closeBill: (input: CloseBillInput) => Promise<BillLifecycleData>;
|
|
421
|
+
reopenBill: (input: ReopenBillInput) => Promise<BillLifecycleData>;
|
|
397
422
|
postPayment: (input: PostBillPaymentInput) => Promise<BillLifecycleData>;
|
|
398
423
|
submitSecondReview: (input: SubmitSecondReviewInput) => Promise<BillLifecycleData>;
|
|
399
|
-
startCorrection: () => Promise<{
|
|
400
|
-
replacementBillId: string;
|
|
401
|
-
data: BillLifecycleData;
|
|
402
|
-
}>;
|
|
403
424
|
clearSession: () => void;
|
|
404
425
|
};
|
|
405
|
-
/** Browser-safe, framework-neutral client for
|
|
426
|
+
/** Browser-safe, framework-neutral client for an already-submitted bill. */
|
|
406
427
|
declare function createBillLifecycleClient({ billId, sessionEndpoint, getSession, apiBaseUrl, fetch: fetchOverride, }: BillLifecycleClientOptions): BillLifecycleClient;
|
|
428
|
+
/**
|
|
429
|
+
* Browser-safe client for reference data needed before a bill exists.
|
|
430
|
+
*
|
|
431
|
+
* Partners can pass the same short-lived session provider used by the submitted-bill
|
|
432
|
+
* lifecycle without inventing a draft bill or exposing payer directory credentials.
|
|
433
|
+
*/
|
|
434
|
+
declare function createBillReferenceClient(options?: BillReferenceClientOptions): BillReferenceClient;
|
|
407
435
|
|
|
408
|
-
export { type BillActivityRecord, type BillDeliveryOption, type BillDeliveryOptions, type BillEorDocument, type BillLifecycleAction, type BillLifecycleActionId, type BillLifecycleClient, type BillLifecycleClientOptions, type BillLifecycleData, type BillLifecycleDelivery, type BillLifecycleSession, type BillLifecycleSessionProvider, type BillLifecycleSessionRequest, type BillPaymentRecord, type BillRemittanceSummary, type BillReviewAttachment, type BillReviewBillingProvider, type BillReviewClaimPatternStatus, type BillReviewClinician, type BillReviewData, type BillReviewDocumentType, type BillReviewFeatures, type BillReviewLineItem, type BillReviewLocation, type BillReviewPayer, type BillReviewSaveInput, type BillSubmissionRoute, type BrowserBillAddress, type BrowserBillCreateInput, type CloseBillInput, DEFAULT_API_BASE_URL, DEFAULT_SESSION_ENDPOINT, type PostBillPaymentInput, type SubmitBillInput, type SubmitSecondReviewInput, createBillLifecycleClient, sanitizeBillReviewSaveInput };
|
|
436
|
+
export { type BillActivityRecord, type BillDeliveryOption, type BillDeliveryOptions, type BillDiagnosisCode, type BillEorDocument, type BillLifecycleAction, type BillLifecycleActionId, type BillLifecycleClient, type BillLifecycleClientOptions, type BillLifecycleData, type BillLifecycleDelivery, type BillLifecycleSession, type BillLifecycleSessionProvider, type BillLifecycleSessionRequest, type BillPaymentRecord, type BillPostalPlace, type BillReferenceClient, type BillReferenceClientOptions, type BillRemittanceSummary, type BillReviewAttachment, type BillReviewBillingProvider, type BillReviewClaimPatternStatus, type BillReviewClinician, type BillReviewData, type BillReviewDocumentType, type BillReviewFeatures, type BillReviewLineItem, type BillReviewLocation, type BillReviewPayer, type BillReviewSaveInput, type BillSubmissionRoute, type BrowserBillAddress, type BrowserBillCreateInput, type CloseBillInput, DEFAULT_API_BASE_URL, DEFAULT_SESSION_ENDPOINT, type PostBillPaymentInput, type ReopenBillInput, type SubmitBillInput, type SubmitSecondReviewInput, createBillLifecycleClient, createBillReferenceClient, sanitizeBillReviewSaveInput };
|
package/dist/index.js
CHANGED
|
@@ -149,8 +149,8 @@ function createBillLifecycleClient({
|
|
|
149
149
|
if (typeof fetcher !== "function") throw new Error("A Fetch API implementation is required.");
|
|
150
150
|
let session = null;
|
|
151
151
|
let sessionRequest = null;
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
const currentBillId = billId.trim();
|
|
153
|
+
if (!currentBillId) throw new Error("billId is required for the submitted-bill lifecycle client.");
|
|
154
154
|
const mintSession = async (signal, force = false) => {
|
|
155
155
|
if (!force && isSessionFresh(session)) return session;
|
|
156
156
|
if (!force && sessionRequest) return sessionRequest;
|
|
@@ -192,13 +192,7 @@ function createBillLifecycleClient({
|
|
|
192
192
|
}
|
|
193
193
|
return response;
|
|
194
194
|
};
|
|
195
|
-
const
|
|
196
|
-
if (!currentBillId) {
|
|
197
|
-
throw new Error("No bill is open. Pass billId or create a bill before using this operation.");
|
|
198
|
-
}
|
|
199
|
-
return currentBillId;
|
|
200
|
-
};
|
|
201
|
-
const billPath = (suffix = "") => `/partner/v2/browser/bills/${encodeURIComponent(requireBillId())}${suffix}`;
|
|
195
|
+
const billPath = (suffix = "") => `/partner/v2/browser/bills/${encodeURIComponent(currentBillId)}${suffix}`;
|
|
202
196
|
const loadLifecycle = async (signal) => {
|
|
203
197
|
const response = await request(billPath("/lifecycle"), {}, signal);
|
|
204
198
|
if (!response.ok) throw await responseError(response, "Bill lifecycle could not be loaded.");
|
|
@@ -239,6 +233,29 @@ function createBillLifecycleClient({
|
|
|
239
233
|
}];
|
|
240
234
|
});
|
|
241
235
|
};
|
|
236
|
+
const searchDiagnosisCodes = async (query, limit = 30) => {
|
|
237
|
+
const params = new URLSearchParams({ q: query.trim(), limit: String(Math.max(1, Math.min(100, limit))) });
|
|
238
|
+
const response = await request(`/partner/v2/browser/diagnosis-codes?${params.toString()}`);
|
|
239
|
+
if (!response.ok) throw await responseError(response, "Diagnosis-code search is unavailable.");
|
|
240
|
+
const body = await response.json();
|
|
241
|
+
if (!Array.isArray(body.results)) throw new Error("Diagnosis-code search returned an invalid response.");
|
|
242
|
+
return body.results.flatMap((value) => {
|
|
243
|
+
if (!value || typeof value !== "object") return [];
|
|
244
|
+
const candidate = value;
|
|
245
|
+
return typeof candidate.code === "string" && typeof candidate.description === "string" ? [{ code: candidate.code, description: candidate.description }] : [];
|
|
246
|
+
});
|
|
247
|
+
};
|
|
248
|
+
const lookupPostalCode = async (postalCode) => {
|
|
249
|
+
const params = new URLSearchParams({ postalCode: postalCode.trim() });
|
|
250
|
+
const response = await request(`/partner/v2/browser/postal-codes?${params.toString()}`);
|
|
251
|
+
if (response.status === 404) return null;
|
|
252
|
+
if (!response.ok) throw await responseError(response, "ZIP lookup is unavailable.");
|
|
253
|
+
const body = await response.json();
|
|
254
|
+
if (typeof body.city !== "string" || typeof body.state !== "string") {
|
|
255
|
+
throw new Error("ZIP lookup returned an invalid response.");
|
|
256
|
+
}
|
|
257
|
+
return { city: body.city, state: body.state };
|
|
258
|
+
};
|
|
242
259
|
const mutation = async (path, init, fallback) => {
|
|
243
260
|
const headers = new Headers(init.headers);
|
|
244
261
|
headers.set("idempotency-key", idempotencyKey());
|
|
@@ -255,72 +272,24 @@ function createBillLifecycleClient({
|
|
|
255
272
|
const body = await response.json();
|
|
256
273
|
return normalizeLifecycle(body.data);
|
|
257
274
|
};
|
|
258
|
-
const saveReview = async (input) => {
|
|
259
|
-
await mutation(billPath(), {
|
|
260
|
-
method: "PATCH",
|
|
261
|
-
headers: { "content-type": "application/json" },
|
|
262
|
-
body: JSON.stringify(sanitizeBillReviewSaveInput(input))
|
|
263
|
-
}, "Bill changes could not be saved.");
|
|
264
|
-
return loadLifecycle();
|
|
265
|
-
};
|
|
266
275
|
return {
|
|
267
276
|
getBillId() {
|
|
268
277
|
return currentBillId;
|
|
269
278
|
},
|
|
270
|
-
async createBill(input) {
|
|
271
|
-
if (currentBillId) throw new Error("A bill is already open in this lifecycle client.");
|
|
272
|
-
if (createRequest) return createRequest;
|
|
273
|
-
const pending = (async () => {
|
|
274
|
-
const response = await mutation("/partner/v2/browser/bills", {
|
|
275
|
-
method: "POST",
|
|
276
|
-
headers: { "content-type": "application/json" },
|
|
277
|
-
body: JSON.stringify(input)
|
|
278
|
-
}, "Bill could not be created.");
|
|
279
|
-
const body = await response.json();
|
|
280
|
-
const nextBillId = typeof body.id === "string" ? body.id : typeof body.data?.id === "string" ? body.data.id : null;
|
|
281
|
-
if (!nextBillId) throw new Error("The billing service did not return the new bill ID.");
|
|
282
|
-
currentBillId = nextBillId;
|
|
283
|
-
return { billId: nextBillId, data: await loadLifecycle() };
|
|
284
|
-
})().finally(() => {
|
|
285
|
-
if (createRequest === pending) createRequest = null;
|
|
286
|
-
});
|
|
287
|
-
createRequest = pending;
|
|
288
|
-
return pending;
|
|
289
|
-
},
|
|
290
279
|
clearSession() {
|
|
291
280
|
session = null;
|
|
292
281
|
sessionRequest = null;
|
|
293
282
|
},
|
|
294
283
|
getLifecycle: loadLifecycle,
|
|
295
284
|
searchClaimsAdministrators,
|
|
285
|
+
searchDiagnosisCodes,
|
|
286
|
+
lookupPostalCode,
|
|
296
287
|
async getDeliveryOptions() {
|
|
297
288
|
const response = await request(billPath("/delivery-options"));
|
|
298
289
|
if (!response.ok) throw await responseError(response, "Delivery options could not be loaded.");
|
|
299
290
|
const body = await response.json();
|
|
300
291
|
return normalizeDeliveryOptions(body.data ?? body);
|
|
301
292
|
},
|
|
302
|
-
saveReview,
|
|
303
|
-
async submitBill(input, submission) {
|
|
304
|
-
await saveReview(input);
|
|
305
|
-
await mutation(billPath("/submissions"), {
|
|
306
|
-
method: "POST",
|
|
307
|
-
headers: { "content-type": "application/json" },
|
|
308
|
-
body: JSON.stringify(submission)
|
|
309
|
-
}, "Bill could not be submitted.");
|
|
310
|
-
return loadLifecycle();
|
|
311
|
-
},
|
|
312
|
-
async addAttachment(file, documentType, description) {
|
|
313
|
-
const body = new FormData();
|
|
314
|
-
body.set("file", file);
|
|
315
|
-
body.set("documentType", documentType);
|
|
316
|
-
if (description) body.set("description", description);
|
|
317
|
-
await mutation(billPath("/documents"), { method: "POST", body }, "Document could not be attached.");
|
|
318
|
-
return loadLifecycle();
|
|
319
|
-
},
|
|
320
|
-
async removeAttachment(attachmentId) {
|
|
321
|
-
await mutation(billPath(`/documents/${encodeURIComponent(attachmentId)}`), { method: "DELETE" }, "Document could not be removed.");
|
|
322
|
-
return loadLifecycle();
|
|
323
|
-
},
|
|
324
293
|
async getAttachment(attachmentId) {
|
|
325
294
|
const response = await request(billPath(`/documents/${encodeURIComponent(attachmentId)}`));
|
|
326
295
|
if (!response.ok) throw await responseError(response, "Document could not be opened.");
|
|
@@ -331,32 +300,42 @@ function createBillLifecycleClient({
|
|
|
331
300
|
if (!response.ok) throw await responseError(response, "EOR could not be opened.");
|
|
332
301
|
return response.blob();
|
|
333
302
|
},
|
|
303
|
+
async getPacket() {
|
|
304
|
+
const response = await request(billPath("/packet"));
|
|
305
|
+
if (!response.ok) throw await responseError(response, "Submission packet could not be downloaded.");
|
|
306
|
+
return response.blob();
|
|
307
|
+
},
|
|
334
308
|
closeBill(input) {
|
|
335
309
|
return action({ action: "close", ...input }, "Bill could not be closed.");
|
|
336
310
|
},
|
|
311
|
+
reopenBill(input) {
|
|
312
|
+
return action({ action: "reopen", ...input }, "Bill could not be reopened.");
|
|
313
|
+
},
|
|
337
314
|
postPayment(input) {
|
|
338
315
|
return action({ action: "post_payment", ...input, checkNumber: input.checkNumber ?? "" }, "Payment could not be posted.");
|
|
339
316
|
},
|
|
340
317
|
submitSecondReview(input) {
|
|
341
318
|
return action({ action: "second_review", ...input }, "Second Review could not be submitted.");
|
|
342
|
-
},
|
|
343
|
-
async startCorrection() {
|
|
344
|
-
const response = await mutation(billPath("/actions"), {
|
|
345
|
-
method: "POST",
|
|
346
|
-
headers: { "content-type": "application/json" },
|
|
347
|
-
body: JSON.stringify({ action: "start_correction" })
|
|
348
|
-
}, "Correction draft could not be created.");
|
|
349
|
-
const body = await response.json();
|
|
350
|
-
if (typeof body.replacementBillId !== "string") throw new Error("The billing service did not return the correction bill ID.");
|
|
351
|
-
currentBillId = body.replacementBillId;
|
|
352
|
-
return { replacementBillId: body.replacementBillId, data: normalizeLifecycle(body.data) };
|
|
353
319
|
}
|
|
354
320
|
};
|
|
355
321
|
}
|
|
322
|
+
function createBillReferenceClient(options = {}) {
|
|
323
|
+
const lifecycle = createBillLifecycleClient({
|
|
324
|
+
...options,
|
|
325
|
+
billId: "pre-submission-reference-data"
|
|
326
|
+
});
|
|
327
|
+
return {
|
|
328
|
+
searchClaimsAdministrators: lifecycle.searchClaimsAdministrators,
|
|
329
|
+
searchDiagnosisCodes: lifecycle.searchDiagnosisCodes,
|
|
330
|
+
lookupPostalCode: lifecycle.lookupPostalCode,
|
|
331
|
+
clearSession: lifecycle.clearSession
|
|
332
|
+
};
|
|
333
|
+
}
|
|
356
334
|
export {
|
|
357
335
|
DEFAULT_API_BASE_URL,
|
|
358
336
|
DEFAULT_SESSION_ENDPOINT,
|
|
359
337
|
createBillLifecycleClient,
|
|
338
|
+
createBillReferenceClient,
|
|
360
339
|
sanitizeBillReviewSaveInput
|
|
361
340
|
};
|
|
362
341
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export const DEFAULT_API_BASE_URL = \"https://app.mindbill.org\";\nexport const DEFAULT_SESSION_ENDPOINT = \"/api/mindbill/session\";\n\nexport type BillReviewDocumentType =\n | \"final_report\"\n | \"letter_of_attestation\"\n | \"proof_of_service\"\n | \"form_122\"\n | \"return_to_work_voucher\"\n | \"w9\"\n | \"medical_records\"\n | \"appeal\"\n | \"other\";\n\nexport type BillReviewBillingProvider = {\n name: string;\n taxId: string;\n npi: string;\n billType: \"Professional\" | \"Institutional\";\n phone?: string;\n billingStreet?: string;\n billingCity?: string;\n billingState?: string;\n billingZip?: string;\n};\n\nexport type BillReviewClinician = {\n name: string;\n specialty: string;\n npi: string;\n taxonomy?: string;\n licenseNumber?: string;\n licenseState?: string;\n signaturePng?: string;\n signatureKey?: string;\n isQME?: boolean;\n isAME?: boolean;\n email?: string;\n active?: boolean;\n};\n\nexport type BillReviewLocation = {\n billingProviderId?: string;\n name: string;\n nickname?: string;\n street: string;\n city: string;\n state: string;\n zip: string;\n county?: string;\n posCode?: string;\n isPrimary?: boolean;\n active?: boolean;\n};\n\nexport type BillReviewLineItem = {\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge: number;\n feeSchedule?: number;\n serviceDate?: string | null;\n serviceDateEnd?: string | null;\n diagnosisPointers?: number[];\n};\n\nexport type BillReviewAttachment = {\n id: string;\n filename: string;\n description?: string | null;\n documentType: string;\n reportType?: string | null;\n source?: string;\n addedAt?: string;\n contentUrl?: string;\n};\n\nexport type BillReviewPayer = {\n id: string;\n name: string;\n hasElectronic?: boolean;\n states?: string[];\n confidence?: \"high\" | \"medium\" | \"directory\";\n recommended?: boolean;\n signals?: Array<{\n kind: \"name\" | \"claim_number\";\n state: \"match\" | \"warning\";\n label: string;\n }>;\n};\n\nexport type BillReviewFeatures = {\n authorizationNumber?: boolean;\n serviceDateRange?: boolean;\n wcabNumber?: boolean;\n codingPresets?: boolean;\n};\n\nexport type BillReviewClaimPatternStatus = {\n state: \"match\" | \"warning\" | \"unknown\";\n label: string;\n detail?: string;\n suggestion?: string;\n};\n\nexport type BillReviewData = {\n bill: {\n id: string;\n billNumber: string | number;\n status: string;\n transmissionState?: string;\n billingMode: \"med_legal\" | \"professional\";\n dos: string;\n dosEnd?: string | null;\n authorizationNumber?: string | null;\n billingSnapshot?: {\n billingProvider?: BillReviewBillingProvider;\n renderingProvider?: BillReviewClinician;\n placeOfService?: BillReviewLocation;\n } | null;\n lineItems: BillReviewLineItem[];\n attachments: BillReviewAttachment[];\n totalCharge: number;\n totalPaid: number;\n balanceDue: number;\n };\n patient: {\n name: string;\n firstName?: string;\n middleName?: string;\n lastName?: string;\n dob?: string;\n };\n injury: {\n claimNumber?: string;\n employer?: string;\n doi?: string;\n injuryEndDate?: string;\n cumulativeTrauma?: boolean;\n adjNumber?: string;\n claimsAdminId?: string;\n claimsAdminName?: string;\n claimPatternStatus?: BillReviewClaimPatternStatus;\n };\n};\n\nexport type BillReviewSaveInput = {\n claimsAdminId: string;\n patientOverrides?: {\n firstName: string;\n middleName?: string;\n lastName: string;\n dob?: string;\n };\n injuryOverrides?: {\n claimNumber?: string;\n employer?: string;\n doi?: string;\n injuryEndDate?: string;\n cumulativeTrauma?: boolean;\n adjNumber?: string;\n };\n dos: string;\n dosEnd?: string | null;\n authorizationNumber?: string | null;\n billingProvider?: BillReviewBillingProvider;\n renderingProvider?: BillReviewClinician;\n placeOfService?: BillReviewLocation;\n lineItems: Array<{\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge?: number;\n serviceDate?: string | null;\n serviceDateEnd?: string | null;\n diagnosisPointers?: number[];\n }>;\n};\n\nfunction pickDefined(\n source: object,\n keys: readonly string[],\n): Record<string, unknown> {\n const record = source as Record<string, unknown>;\n return Object.fromEntries(\n keys.flatMap((key) => record[key] === undefined ? [] : [[key, record[key]]]),\n );\n}\n\n/**\n * Removes read-only snapshot metadata before a review mutation is sent.\n * Lifecycle reads can include display-only fields such as entity IDs; the v2\n * write contract accepts only the values that should be frozen onto the bill.\n */\nexport function sanitizeBillReviewSaveInput(\n input: BillReviewSaveInput,\n): BillReviewSaveInput {\n return {\n claimsAdminId: input.claimsAdminId,\n ...(input.patientOverrides ? {\n patientOverrides: pickDefined(input.patientOverrides, [\n \"firstName\", \"middleName\", \"lastName\", \"dob\",\n ]) as NonNullable<BillReviewSaveInput[\"patientOverrides\"]>,\n } : {}),\n ...(input.injuryOverrides ? {\n injuryOverrides: pickDefined(input.injuryOverrides, [\n \"claimNumber\", \"employer\", \"doi\", \"injuryEndDate\",\n \"cumulativeTrauma\", \"adjNumber\",\n ]) as NonNullable<BillReviewSaveInput[\"injuryOverrides\"]>,\n } : {}),\n dos: input.dos,\n ...(input.dosEnd !== undefined ? { dosEnd: input.dosEnd } : {}),\n ...(input.authorizationNumber !== undefined\n ? { authorizationNumber: input.authorizationNumber }\n : {}),\n ...(input.billingProvider ? {\n billingProvider: pickDefined(input.billingProvider, [\n \"name\", \"taxId\", \"npi\", \"billType\", \"phone\", \"billingStreet\",\n \"billingCity\", \"billingState\", \"billingZip\",\n ]) as BillReviewBillingProvider,\n } : {}),\n ...(input.renderingProvider ? {\n renderingProvider: pickDefined(input.renderingProvider, [\n \"name\", \"specialty\", \"npi\", \"taxonomy\", \"licenseNumber\",\n \"licenseState\", \"signaturePng\", \"signatureKey\", \"isQME\", \"isAME\",\n \"email\", \"active\",\n ]) as BillReviewClinician,\n } : {}),\n ...(input.placeOfService ? {\n placeOfService: pickDefined(input.placeOfService, [\n \"billingProviderId\", \"name\", \"nickname\", \"street\", \"city\", \"state\",\n \"zip\", \"county\", \"posCode\", \"isPrimary\", \"active\",\n ]) as BillReviewLocation,\n } : {}),\n lineItems: input.lineItems.map((line) => pickDefined(line, [\n \"id\", \"code\", \"modifiers\", \"units\", \"charge\", \"serviceDate\",\n \"serviceDateEnd\", \"diagnosisPointers\",\n ]) as BillReviewSaveInput[\"lineItems\"][number]),\n };\n}\n\nexport type BillSubmissionRoute = \"ebill\" | \"fax\" | \"mail\" | \"email\";\nexport type BillDeliveryOption = {\n route: BillSubmissionRoute;\n label: string;\n detail: string;\n fallback: boolean;\n confidence: string;\n payerName: string;\n target?: string;\n chKey?: string;\n payerId?: string;\n printAndMail?: boolean;\n costUsd?: number;\n};\nexport type BillDeliveryOptions = {\n payerName: string;\n recommended: BillDeliveryOption;\n options: BillDeliveryOption[];\n contacts: {\n faxNumber?: string | null;\n claimsEmail?: string | null;\n portalUrl?: string | null;\n mailingAddress?: string | null;\n adjusterName?: string | null;\n adjusterPhone?: string | null;\n adjusterEmail?: string | null;\n };\n};\nexport type SubmitBillInput = {\n route: BillSubmissionRoute;\n destination?: {\n faxNumber?: string;\n email?: string;\n mailingAddress?: string;\n };\n attention?: string;\n subject?: string;\n note?: string;\n};\nexport type BillLifecycleActionId =\n | \"edit_and_submit\"\n | \"correct_and_resubmit\"\n | \"second_review\"\n | \"independent_bill_review\"\n | \"view_eor\"\n | \"post_payment\"\n | \"close\";\n\nexport type BillLifecycleAction = {\n id: BillLifecycleActionId;\n label: string;\n enabled: boolean;\n primary?: boolean;\n reason?: string;\n};\n\nexport type BillEorDocument = {\n id: string;\n filename: string;\n description: string | null;\n addedAt: string;\n contentUrl: string;\n};\n\nexport type BillActivityRecord = {\n id: string;\n type: string;\n createdAt: string;\n description: string;\n actor: string | null;\n delivery: BillSubmissionRoute | null;\n amount: number | null;\n accepted: boolean | null;\n stcCategory: string | null;\n};\n\nexport type BillPaymentRecord = {\n id: string;\n method: \"check\" | \"eft\";\n checkNumber: string;\n status: string | null;\n depositDate: string | null;\n checkReceived: boolean | null;\n receivedDate: string | null;\n amount: number;\n feeAmount: number | null;\n feeReason: string | null;\n source: \"paper\" | \"835\" | \"portal\";\n postedAt: string;\n updatedAt: string | null;\n note: string | null;\n};\n\nexport type BillRemittanceSummary = {\n payerReportedPaid: number | null;\n totalPaid: number;\n balanceDue: number;\n denialReason: string | null;\n};\n\nexport type BillLifecycleDelivery = {\n payerName: string;\n contacts: BillDeliveryOptions[\"contacts\"];\n};\n\nexport type BillLifecycleData = BillReviewData & {\n lifecycle: {\n state: string;\n nativeStatus: string;\n submittedAt?: string | null;\n agingDays?: number | null;\n updatedAt?: string | null;\n actions: BillLifecycleAction[];\n };\n eors: BillEorDocument[];\n activity: BillActivityRecord[];\n payments: BillPaymentRecord[];\n remittance: BillRemittanceSummary;\n delivery: BillLifecycleDelivery;\n};\n\nexport type BillLifecycleSession = {\n token: string;\n expiresAt?: string;\n apiBaseUrl?: string;\n};\n\nexport type BillLifecycleSessionRequest = {\n signal: AbortSignal;\n};\n\nexport type BillLifecycleSessionProvider = (\n request: BillLifecycleSessionRequest,\n) => Promise<BillLifecycleSession>;\n\nexport type CloseBillInput = { reason: string };\nexport type PostBillPaymentInput = {\n amount: number;\n method: \"check\" | \"eft\";\n checkNumber?: string;\n depositDate: string;\n note?: string;\n};\nexport type SubmitSecondReviewInput = {\n reason: string;\n payerClaimControlNumber: string;\n disputedAmount: number | undefined;\n attachmentIds: string[];\n route: BillSubmissionRoute;\n};\n\nexport type BrowserBillAddress = {\n line1: string;\n city: string;\n state: string;\n postalCode: string;\n};\n\n/** Complete bill snapshot accepted by the browser create endpoint. */\nexport type BrowserBillCreateInput = {\n externalId?: string;\n billingMode?: \"med_legal\" | \"professional\";\n patient: {\n id?: string;\n externalId?: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n dateOfBirth?: string;\n ssn?: string;\n gender?: \"M\" | \"F\" | \"X\";\n phone?: string;\n address: BrowserBillAddress;\n };\n claim: {\n id?: string;\n externalId?: string;\n claimNumber: string;\n adjNumber?: string;\n employer?: string;\n dateOfInjury?: string;\n injuryState?: string;\n description?: string;\n claimsAdministrator?: { id?: string; name: string };\n };\n service: { date?: string; endDate?: string | null; authorizationNumber?: string | null };\n billingProvider?: { name?: string; taxId?: string; npi?: string; phone?: string; address?: BrowserBillAddress };\n renderingProvider?: {\n name?: string;\n specialty?: string;\n npi?: string;\n taxonomy?: string;\n licenseNumber?: string;\n licenseState?: string;\n isQme?: boolean;\n isAme?: boolean;\n };\n serviceLocation?: { name?: string; address?: BrowserBillAddress; placeOfServiceCode?: string };\n diagnoses?: string[];\n serviceLines?: Array<{\n code: string;\n modifiers?: string[];\n units?: number;\n charge?: number;\n serviceDate?: string;\n serviceDateEnd?: string;\n diagnosisPointers?: number[];\n }>;\n};\n\nexport type BillLifecycleClientOptions = {\n /** Open an existing bill. Omit this to create one with `createBill`. */\n billId?: string;\n sessionEndpoint?: string | undefined;\n getSession?: BillLifecycleSessionProvider | undefined;\n apiBaseUrl?: string | undefined;\n fetch?: typeof globalThis.fetch | undefined;\n};\n\nexport type BillLifecycleClient = {\n getBillId: () => string | null;\n createBill: (input: BrowserBillCreateInput) => Promise<{ billId: string; data: BillLifecycleData }>;\n getLifecycle: (signal?: AbortSignal) => Promise<BillLifecycleData>;\n searchClaimsAdministrators: (query: string, claimNumber?: string) => Promise<BillReviewPayer[]>;\n getDeliveryOptions: () => Promise<BillDeliveryOptions>;\n saveReview: (input: BillReviewSaveInput) => Promise<BillLifecycleData>;\n submitBill: (input: BillReviewSaveInput, submission: SubmitBillInput) => Promise<BillLifecycleData>;\n addAttachment: (file: File, documentType: BillReviewDocumentType, description?: string) => Promise<BillLifecycleData>;\n removeAttachment: (attachmentId: string) => Promise<BillLifecycleData>;\n getAttachment: (attachmentId: string) => Promise<Blob>;\n getEor: (documentId: string) => Promise<Blob>;\n closeBill: (input: CloseBillInput) => Promise<BillLifecycleData>;\n postPayment: (input: PostBillPaymentInput) => Promise<BillLifecycleData>;\n submitSecondReview: (input: SubmitSecondReviewInput) => Promise<BillLifecycleData>;\n startCorrection: () => Promise<{ replacementBillId: string; data: BillLifecycleData }>;\n clearSession: () => void;\n};\n\nasync function responseError(response: Response, fallback: string): Promise<Error> {\n const body: unknown = await response.json().catch(() => null);\n const detail = body && typeof body === \"object\"\n ? (body as { detail?: unknown; message?: unknown; error?: unknown }).detail\n ?? (body as { message?: unknown }).message\n ?? (body as { error?: unknown }).error\n : null;\n return new Error(typeof detail === \"string\" ? detail : fallback);\n}\n\nfunction isSessionFresh(session: BillLifecycleSession | null): boolean {\n if (!session) return false;\n if (!session.expiresAt) return true;\n const expiresAt = new Date(session.expiresAt).getTime();\n return Number.isFinite(expiresAt) && expiresAt > Date.now() + 30_000;\n}\n\nfunction normalizeSession(value: unknown): BillLifecycleSession {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing session endpoint returned an invalid response.\");\n }\n const candidate = value as { token?: unknown; expiresAt?: unknown; apiBaseUrl?: unknown; session?: unknown; data?: unknown };\n const nested = candidate.session ?? candidate.data;\n const session = nested && typeof nested === \"object\" ? nested as typeof candidate : candidate;\n if (typeof session.token !== \"string\" || session.token.length < 8) {\n throw new Error(\"The billing session endpoint did not return a browser session token.\");\n }\n return {\n token: session.token,\n ...(typeof session.expiresAt === \"string\" ? { expiresAt: session.expiresAt } : {}),\n ...(typeof session.apiBaseUrl === \"string\" ? { apiBaseUrl: session.apiBaseUrl } : {}),\n };\n}\n\nfunction normalizeLifecycle(value: unknown): BillLifecycleData {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing service returned an invalid bill lifecycle.\");\n }\n const data = value as Partial<BillLifecycleData>;\n if (\n !data.bill\n || !data.patient\n || !data.injury\n || !data.lifecycle\n || !Array.isArray(data.lifecycle.actions)\n || !Array.isArray(data.eors)\n || !Array.isArray(data.activity)\n || !Array.isArray(data.payments)\n || !data.remittance\n || typeof data.remittance !== \"object\"\n || !data.delivery\n || typeof data.delivery !== \"object\"\n || !data.delivery.contacts\n || typeof data.delivery.contacts !== \"object\"\n ) {\n throw new Error(\"The billing service returned an invalid bill lifecycle.\");\n }\n return data as BillLifecycleData;\n}\n\nfunction normalizeDeliveryOptions(value: unknown): BillDeliveryOptions {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing service returned invalid delivery options.\");\n }\n const data = value as Partial<BillDeliveryOptions>;\n if (\n typeof data.payerName !== \"string\"\n || !data.recommended\n || typeof data.recommended !== \"object\"\n || ![\"ebill\", \"fax\", \"mail\", \"email\"].includes(data.recommended.route ?? \"\")\n || !Array.isArray(data.options)\n || !data.contacts\n ) {\n throw new Error(\"The billing service returned invalid delivery options.\");\n }\n return data as BillDeliveryOptions;\n}\n\nfunction idempotencyKey(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") return globalThis.crypto.randomUUID();\n return `mb-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** Browser-safe, framework-neutral client for the complete bill lifecycle. */\nexport function createBillLifecycleClient({\n billId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n fetch: fetchOverride,\n}: BillLifecycleClientOptions): BillLifecycleClient {\n const fetcher = fetchOverride ?? globalThis.fetch;\n if (typeof fetcher !== \"function\") throw new Error(\"A Fetch API implementation is required.\");\n let session: BillLifecycleSession | null = null;\n let sessionRequest: Promise<BillLifecycleSession> | null = null;\n let currentBillId = billId?.trim() || null;\n let createRequest: Promise<{ billId: string; data: BillLifecycleData }> | null = null;\n\n const mintSession = async (signal: AbortSignal, force = false): Promise<BillLifecycleSession> => {\n if (!force && isSessionFresh(session)) return session as BillLifecycleSession;\n if (!force && sessionRequest) return sessionRequest;\n const pending = getSession\n ? getSession({ signal })\n : fetcher(sessionEndpoint, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({}),\n signal,\n }).then(async (response) => {\n if (!response.ok) throw await responseError(response, \"The billing session could not be created.\");\n return response.json();\n });\n const request = Promise.resolve(pending).then(normalizeSession).then((nextSession) => {\n session = nextSession;\n return nextSession;\n }).finally(() => {\n if (sessionRequest === request) sessionRequest = null;\n });\n sessionRequest = request;\n return request;\n };\n\n const request = async (path: string, init: RequestInit = {}, providedSignal?: AbortSignal): Promise<Response> => {\n const controller = providedSignal ? null : new AbortController();\n const signal = providedSignal ?? controller?.signal;\n if (!signal) throw new Error(\"An AbortSignal could not be created.\");\n let browserSession = await mintSession(signal);\n const perform = (current: BillLifecycleSession) => {\n const base = (current.apiBaseUrl ?? apiBaseUrl).replace(/\\/$/, \"\");\n const headers = new Headers(init.headers);\n headers.set(\"authorization\", `Bearer ${current.token}`);\n return fetcher(`${base}${path}`, { ...init, headers, signal });\n };\n let response = await perform(browserSession);\n if (response.status === 401) {\n session = null;\n browserSession = await mintSession(signal, true);\n response = await perform(browserSession);\n }\n return response;\n };\n\n const requireBillId = (): string => {\n if (!currentBillId) {\n throw new Error(\"No bill is open. Pass billId or create a bill before using this operation.\");\n }\n return currentBillId;\n };\n const billPath = (suffix = \"\"): string =>\n `/partner/v2/browser/bills/${encodeURIComponent(requireBillId())}${suffix}`;\n\n const loadLifecycle = async (signal?: AbortSignal) => {\n const response = await request(billPath(\"/lifecycle\"), {}, signal);\n if (!response.ok) throw await responseError(response, \"Bill lifecycle could not be loaded.\");\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n\n const searchClaimsAdministrators = async (query: string, claimNumber?: string): Promise<BillReviewPayer[]> => {\n const params = new URLSearchParams();\n if (query.trim()) params.set(\"q\", query.trim());\n if (claimNumber?.trim()) params.set(\"claimNumber\", claimNumber.trim());\n const response = await request(`/partner/v2/browser/claims-administrators?${params.toString()}`);\n if (!response.ok) throw await responseError(response, \"Claims administrator search is unavailable.\");\n const body = await response.json() as { results?: unknown };\n if (!Array.isArray(body.results)) throw new Error(\"Claims administrator search returned an invalid response.\");\n return body.results.flatMap((value): BillReviewPayer[] => {\n if (!value || typeof value !== \"object\") return [];\n const payer = value as Partial<BillReviewPayer>;\n if (typeof payer.id !== \"string\" || typeof payer.name !== \"string\") return [];\n return [{\n id: payer.id,\n name: payer.name,\n ...(typeof payer.hasElectronic === \"boolean\" ? { hasElectronic: payer.hasElectronic } : {}),\n ...(Array.isArray(payer.states)\n ? { states: payer.states.filter((state): state is string => typeof state === \"string\") }\n : {}),\n ...([\"high\", \"medium\", \"directory\"].includes(payer.confidence ?? \"\")\n ? { confidence: payer.confidence as NonNullable<BillReviewPayer[\"confidence\"]> }\n : {}),\n ...(typeof payer.recommended === \"boolean\" ? { recommended: payer.recommended } : {}),\n ...(Array.isArray(payer.signals)\n ? {\n signals: payer.signals.flatMap((signal) => {\n if (!signal || typeof signal !== \"object\") return [];\n const candidate = signal as { kind?: unknown; state?: unknown; label?: unknown };\n if (\n ![\"name\", \"claim_number\"].includes(String(candidate.kind))\n || ![\"match\", \"warning\"].includes(String(candidate.state))\n || typeof candidate.label !== \"string\"\n ) return [];\n return [{\n kind: candidate.kind as \"name\" | \"claim_number\",\n state: candidate.state as \"match\" | \"warning\",\n label: candidate.label,\n }];\n }),\n }\n : {}),\n }];\n });\n };\n\n const mutation = async (path: string, init: RequestInit, fallback: string) => {\n const headers = new Headers(init.headers);\n headers.set(\"idempotency-key\", idempotencyKey());\n const response = await request(path, { ...init, headers });\n if (!response.ok) throw await responseError(response, fallback);\n return response;\n };\n const action = async (input: Record<string, unknown>, fallback: string): Promise<BillLifecycleData> => {\n const response = await mutation(billPath(\"/actions\"), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n }, fallback);\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n const saveReview = async (input: BillReviewSaveInput): Promise<BillLifecycleData> => {\n await mutation(billPath(), {\n method: \"PATCH\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(sanitizeBillReviewSaveInput(input)),\n }, \"Bill changes could not be saved.\");\n return loadLifecycle();\n };\n\n return {\n getBillId() { return currentBillId; },\n async createBill(input) {\n if (currentBillId) throw new Error(\"A bill is already open in this lifecycle client.\");\n if (createRequest) return createRequest;\n const pending = (async () => {\n const response = await mutation(\"/partner/v2/browser/bills\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n }, \"Bill could not be created.\");\n const body = await response.json() as { id?: unknown; data?: { id?: unknown } };\n const nextBillId = typeof body.id === \"string\"\n ? body.id\n : typeof body.data?.id === \"string\" ? body.data.id : null;\n if (!nextBillId) throw new Error(\"The billing service did not return the new bill ID.\");\n currentBillId = nextBillId;\n return { billId: nextBillId, data: await loadLifecycle() };\n })().finally(() => {\n if (createRequest === pending) createRequest = null;\n });\n createRequest = pending;\n return pending;\n },\n clearSession() { session = null; sessionRequest = null; },\n getLifecycle: loadLifecycle,\n searchClaimsAdministrators,\n async getDeliveryOptions() {\n const response = await request(billPath(\"/delivery-options\"));\n if (!response.ok) throw await responseError(response, \"Delivery options could not be loaded.\");\n const body = await response.json() as { data?: unknown };\n return normalizeDeliveryOptions(body.data ?? body);\n },\n saveReview,\n async submitBill(input, submission) {\n await saveReview(input);\n await mutation(billPath(\"/submissions\"), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(submission),\n }, \"Bill could not be submitted.\");\n return loadLifecycle();\n },\n async addAttachment(file, documentType, description) {\n const body = new FormData();\n body.set(\"file\", file);\n body.set(\"documentType\", documentType);\n if (description) body.set(\"description\", description);\n await mutation(billPath(\"/documents\"), { method: \"POST\", body }, \"Document could not be attached.\");\n return loadLifecycle();\n },\n async removeAttachment(attachmentId) {\n await mutation(billPath(`/documents/${encodeURIComponent(attachmentId)}`), { method: \"DELETE\" }, \"Document could not be removed.\");\n return loadLifecycle();\n },\n async getAttachment(attachmentId) {\n const response = await request(billPath(`/documents/${encodeURIComponent(attachmentId)}`));\n if (!response.ok) throw await responseError(response, \"Document could not be opened.\");\n return response.blob();\n },\n async getEor(documentId) {\n const response = await request(billPath(`/eors/${encodeURIComponent(documentId)}`));\n if (!response.ok) throw await responseError(response, \"EOR could not be opened.\");\n return response.blob();\n },\n closeBill(input) { return action({ action: \"close\", ...input }, \"Bill could not be closed.\"); },\n postPayment(input) { return action({ action: \"post_payment\", ...input, checkNumber: input.checkNumber ?? \"\" }, \"Payment could not be posted.\"); },\n submitSecondReview(input) { return action({ action: \"second_review\", ...input }, \"Second Review could not be submitted.\"); },\n async startCorrection() {\n const response = await mutation(billPath(\"/actions\"), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ action: \"start_correction\" }),\n }, \"Correction draft could not be created.\");\n const body = await response.json() as { replacementBillId?: unknown; data?: unknown };\n if (typeof body.replacementBillId !== \"string\") throw new Error(\"The billing service did not return the correction bill ID.\");\n currentBillId = body.replacementBillId;\n return { replacementBillId: body.replacementBillId, data: normalizeLifecycle(body.data) };\n },\n };\n}\n"],"mappings":"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","names":["request"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export const DEFAULT_API_BASE_URL = \"https://app.mindbill.org\";\nexport const DEFAULT_SESSION_ENDPOINT = \"/api/mindbill/session\";\n\nexport type BillReviewDocumentType =\n | \"final_report\"\n | \"letter_of_attestation\"\n | \"proof_of_service\"\n | \"form_122\"\n | \"return_to_work_voucher\"\n | \"w9\"\n | \"medical_records\"\n | \"appeal\"\n | \"other\";\n\nexport type BillReviewBillingProvider = {\n name: string;\n taxId: string;\n npi: string;\n billType: \"Professional\" | \"Institutional\";\n phone?: string;\n billingStreet?: string;\n billingCity?: string;\n billingState?: string;\n billingZip?: string;\n};\n\nexport type BillReviewClinician = {\n name: string;\n specialty: string;\n npi: string;\n taxonomy?: string;\n licenseNumber?: string;\n licenseState?: string;\n signaturePng?: string;\n signatureKey?: string;\n isQME?: boolean;\n isAME?: boolean;\n email?: string;\n active?: boolean;\n};\n\nexport type BillReviewLocation = {\n billingProviderId?: string;\n name: string;\n nickname?: string;\n street: string;\n city: string;\n state: string;\n zip: string;\n county?: string;\n posCode?: string;\n isPrimary?: boolean;\n active?: boolean;\n};\n\nexport type BillReviewLineItem = {\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge: number;\n feeSchedule?: number;\n serviceDate?: string | null;\n serviceDateEnd?: string | null;\n diagnosisPointers?: number[];\n};\n\nexport type BillReviewAttachment = {\n id: string;\n filename: string;\n description?: string | null;\n documentType: string;\n reportType?: string | null;\n source?: string;\n addedAt?: string;\n contentUrl?: string;\n};\n\nexport type BillReviewPayer = {\n id: string;\n name: string;\n hasElectronic?: boolean;\n states?: string[];\n confidence?: \"high\" | \"medium\" | \"directory\";\n recommended?: boolean;\n signals?: Array<{\n kind: \"name\" | \"claim_number\";\n state: \"match\" | \"warning\";\n label: string;\n }>;\n};\n\nexport type BillPostalPlace = { city: string; state: string };\nexport type BillDiagnosisCode = { code: string; description: string };\n\nexport type BillReviewFeatures = {\n authorizationNumber?: boolean;\n serviceDateRange?: boolean;\n wcabNumber?: boolean;\n codingPresets?: boolean;\n};\n\nexport type BillReviewClaimPatternStatus = {\n state: \"match\" | \"warning\" | \"unknown\";\n label: string;\n detail?: string;\n suggestion?: string;\n};\n\nexport type BillReviewData = {\n bill: {\n id: string;\n billNumber: string | number;\n status: string;\n transmissionState?: string;\n billingMode: \"med_legal\" | \"professional\";\n dos: string;\n dosEnd?: string | null;\n authorizationNumber?: string | null;\n billingSnapshot?: {\n billingProvider?: BillReviewBillingProvider;\n renderingProvider?: BillReviewClinician;\n placeOfService?: BillReviewLocation;\n } | null;\n lineItems: BillReviewLineItem[];\n attachments: BillReviewAttachment[];\n totalCharge: number;\n totalPaid: number;\n balanceDue: number;\n };\n patient: {\n name: string;\n firstName?: string;\n middleName?: string;\n lastName?: string;\n dob?: string;\n phone?: string;\n address?: {\n line1?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n };\n };\n injury: {\n claimNumber?: string;\n employer?: string;\n doi?: string;\n injuryEndDate?: string;\n cumulativeTrauma?: boolean;\n adjNumber?: string;\n claimsAdminId?: string;\n claimsAdminName?: string;\n injuryDescription?: string;\n diagnosisCodes?: string[];\n claimPatternStatus?: BillReviewClaimPatternStatus;\n };\n};\n\nexport type BillReviewSaveInput = {\n claimsAdminId: string;\n patientOverrides?: {\n firstName: string;\n middleName?: string;\n lastName: string;\n dob?: string;\n };\n injuryOverrides?: {\n claimNumber?: string;\n employer?: string;\n doi?: string;\n injuryEndDate?: string;\n cumulativeTrauma?: boolean;\n adjNumber?: string;\n };\n dos: string;\n dosEnd?: string | null;\n authorizationNumber?: string | null;\n billingProvider?: BillReviewBillingProvider;\n renderingProvider?: BillReviewClinician;\n placeOfService?: BillReviewLocation;\n lineItems: Array<{\n id?: string;\n code: string;\n modifiers: string[];\n units: number;\n charge?: number;\n serviceDate?: string | null;\n serviceDateEnd?: string | null;\n diagnosisPointers?: number[];\n }>;\n};\n\nfunction pickDefined(\n source: object,\n keys: readonly string[],\n): Record<string, unknown> {\n const record = source as Record<string, unknown>;\n return Object.fromEntries(\n keys.flatMap((key) => record[key] === undefined ? [] : [[key, record[key]]]),\n );\n}\n\n/**\n * Removes read-only snapshot metadata before a review mutation is sent.\n * Lifecycle reads can include display-only fields such as entity IDs; the v2\n * write contract accepts only the values that should be frozen onto the bill.\n */\nexport function sanitizeBillReviewSaveInput(\n input: BillReviewSaveInput,\n): BillReviewSaveInput {\n return {\n claimsAdminId: input.claimsAdminId,\n ...(input.patientOverrides ? {\n patientOverrides: pickDefined(input.patientOverrides, [\n \"firstName\", \"middleName\", \"lastName\", \"dob\",\n ]) as NonNullable<BillReviewSaveInput[\"patientOverrides\"]>,\n } : {}),\n ...(input.injuryOverrides ? {\n injuryOverrides: pickDefined(input.injuryOverrides, [\n \"claimNumber\", \"employer\", \"doi\", \"injuryEndDate\",\n \"cumulativeTrauma\", \"adjNumber\",\n ]) as NonNullable<BillReviewSaveInput[\"injuryOverrides\"]>,\n } : {}),\n dos: input.dos,\n ...(input.dosEnd !== undefined ? { dosEnd: input.dosEnd } : {}),\n ...(input.authorizationNumber !== undefined\n ? { authorizationNumber: input.authorizationNumber }\n : {}),\n ...(input.billingProvider ? {\n billingProvider: pickDefined(input.billingProvider, [\n \"name\", \"taxId\", \"npi\", \"billType\", \"phone\", \"billingStreet\",\n \"billingCity\", \"billingState\", \"billingZip\",\n ]) as BillReviewBillingProvider,\n } : {}),\n ...(input.renderingProvider ? {\n renderingProvider: pickDefined(input.renderingProvider, [\n \"name\", \"specialty\", \"npi\", \"taxonomy\", \"licenseNumber\",\n \"licenseState\", \"signaturePng\", \"signatureKey\", \"isQME\", \"isAME\",\n \"email\", \"active\",\n ]) as BillReviewClinician,\n } : {}),\n ...(input.placeOfService ? {\n placeOfService: pickDefined(input.placeOfService, [\n \"billingProviderId\", \"name\", \"nickname\", \"street\", \"city\", \"state\",\n \"zip\", \"county\", \"posCode\", \"isPrimary\", \"active\",\n ]) as BillReviewLocation,\n } : {}),\n lineItems: input.lineItems.map((line) => pickDefined(line, [\n \"id\", \"code\", \"modifiers\", \"units\", \"charge\", \"serviceDate\",\n \"serviceDateEnd\", \"diagnosisPointers\",\n ]) as BillReviewSaveInput[\"lineItems\"][number]),\n };\n}\n\nexport type BillSubmissionRoute = \"ebill\" | \"fax\" | \"mail\" | \"email\";\nexport type BillDeliveryOption = {\n route: BillSubmissionRoute;\n label: string;\n detail: string;\n fallback: boolean;\n confidence: string;\n payerName: string;\n target?: string;\n chKey?: string;\n payerId?: string;\n printAndMail?: boolean;\n costUsd?: number;\n};\nexport type BillDeliveryOptions = {\n payerName: string;\n recommended: BillDeliveryOption;\n options: BillDeliveryOption[];\n contacts: {\n faxNumber?: string | null;\n claimsEmail?: string | null;\n portalUrl?: string | null;\n mailingAddress?: string | null;\n adjusterName?: string | null;\n adjusterPhone?: string | null;\n adjusterEmail?: string | null;\n };\n};\nexport type SubmitBillInput = {\n route: BillSubmissionRoute;\n destination?: {\n faxNumber?: string;\n email?: string;\n mailingAddress?: string;\n };\n attention?: string;\n subject?: string;\n note?: string;\n};\nexport type BillLifecycleActionId =\n | \"second_review\"\n | \"independent_bill_review\"\n | \"view_eor\"\n | \"post_payment\"\n | \"close\"\n | \"reopen\";\n\nexport type BillLifecycleAction = {\n id: BillLifecycleActionId;\n label: string;\n enabled: boolean;\n primary?: boolean;\n reason?: string;\n};\n\nexport type BillEorDocument = {\n id: string;\n filename: string;\n description: string | null;\n addedAt: string;\n contentUrl: string;\n};\n\nexport type BillActivityRecord = {\n id: string;\n type: string;\n createdAt: string;\n title?: string;\n description: string;\n actor: string | null;\n delivery: BillSubmissionRoute | null;\n amount: number | null;\n accepted: boolean | null;\n stcCategory: string | null;\n};\n\nexport type BillPaymentRecord = {\n id: string;\n method: \"check\" | \"eft\";\n checkNumber: string;\n status: string | null;\n depositDate: string | null;\n checkReceived: boolean | null;\n receivedDate: string | null;\n amount: number;\n feeAmount: number | null;\n feeReason: string | null;\n source: \"paper\" | \"835\" | \"portal\";\n postedAt: string;\n updatedAt: string | null;\n note: string | null;\n};\n\nexport type BillRemittanceSummary = {\n payerReportedPaid: number | null;\n totalPaid: number;\n balanceDue: number;\n denialReason: string | null;\n};\n\nexport type BillLifecycleDelivery = {\n payerName: string;\n contacts: BillDeliveryOptions[\"contacts\"];\n};\n\nexport type BillLifecycleData = BillReviewData & {\n lifecycle: {\n state: string;\n nativeStatus: string;\n submittedAt?: string | null;\n agingDays?: number | null;\n updatedAt?: string | null;\n actions: BillLifecycleAction[];\n };\n eors: BillEorDocument[];\n activity: BillActivityRecord[];\n payments: BillPaymentRecord[];\n remittance: BillRemittanceSummary;\n delivery: BillLifecycleDelivery;\n};\n\nexport type BillLifecycleSession = {\n token: string;\n expiresAt?: string;\n apiBaseUrl?: string;\n};\n\nexport type BillLifecycleSessionRequest = {\n signal: AbortSignal;\n};\n\nexport type BillLifecycleSessionProvider = (\n request: BillLifecycleSessionRequest,\n) => Promise<BillLifecycleSession>;\n\nexport type CloseBillInput = { reason: string };\nexport type ReopenBillInput = { reason: string };\nexport type PostBillPaymentInput = {\n amount: number;\n method: \"check\" | \"eft\";\n checkNumber?: string;\n depositDate: string;\n note?: string;\n};\nexport type SubmitSecondReviewInput = {\n reason: string;\n payerClaimControlNumber: string;\n disputedAmount: number | undefined;\n attachmentIds: string[];\n route: BillSubmissionRoute;\n};\n\nexport type BrowserBillAddress = {\n line1: string;\n city: string;\n state: string;\n postalCode: string;\n};\n\n/** Complete bill snapshot accepted by the browser create endpoint. */\nexport type BrowserBillCreateInput = {\n externalId?: string;\n billingMode?: \"med_legal\" | \"professional\";\n patient: {\n id?: string;\n externalId?: string;\n firstName: string;\n middleName?: string;\n lastName: string;\n dateOfBirth: string;\n ssn?: string;\n gender?: \"M\" | \"F\" | \"X\";\n phone?: string;\n address: BrowserBillAddress;\n };\n claim: {\n id?: string;\n externalId?: string;\n claimNumber: string;\n adjNumber?: string;\n employer?: string;\n dateOfInjury?: string;\n injuryState?: string;\n description?: string;\n claimsAdministrator?: { id?: string; name: string };\n };\n service: { date?: string; endDate?: string | null; authorizationNumber?: string | null };\n billingProvider?: { name?: string; taxId?: string; npi?: string; phone?: string; address?: BrowserBillAddress };\n renderingProvider?: {\n name?: string;\n specialty?: string;\n npi?: string;\n taxonomy?: string;\n licenseNumber?: string;\n licenseState?: string;\n isQme?: boolean;\n isAme?: boolean;\n };\n serviceLocation?: { name?: string; address?: BrowserBillAddress; placeOfServiceCode?: string };\n diagnoses?: string[];\n serviceLines?: Array<{\n code: string;\n modifiers?: string[];\n units?: number;\n charge?: number;\n serviceDate?: string;\n serviceDateEnd?: string;\n diagnosisPointers?: number[];\n }>;\n};\n\nexport type BillLifecycleClientOptions = {\n /** ID of an already-submitted bill. Bills are created only by the atomic server API. */\n billId: string;\n sessionEndpoint?: string | undefined;\n getSession?: BillLifecycleSessionProvider | undefined;\n apiBaseUrl?: string | undefined;\n fetch?: typeof globalThis.fetch | undefined;\n};\n\n/** Browser-session options for pre-submission reference-data lookups. */\nexport type BillReferenceClientOptions = Omit<BillLifecycleClientOptions, \"billId\">;\n\nexport type BillReferenceClient = {\n searchClaimsAdministrators: (query: string, claimNumber?: string) => Promise<BillReviewPayer[]>;\n searchDiagnosisCodes: (query: string, limit?: number) => Promise<BillDiagnosisCode[]>;\n lookupPostalCode: (postalCode: string) => Promise<BillPostalPlace | null>;\n clearSession: () => void;\n};\n\nexport type BillLifecycleClient = {\n getBillId: () => string;\n getLifecycle: (signal?: AbortSignal) => Promise<BillLifecycleData>;\n searchClaimsAdministrators: (query: string, claimNumber?: string) => Promise<BillReviewPayer[]>;\n searchDiagnosisCodes: (query: string, limit?: number) => Promise<BillDiagnosisCode[]>;\n lookupPostalCode: (postalCode: string) => Promise<BillPostalPlace | null>;\n getDeliveryOptions: () => Promise<BillDeliveryOptions>;\n getAttachment: (attachmentId: string) => Promise<Blob>;\n getEor: (documentId: string) => Promise<Blob>;\n getPacket: () => Promise<Blob>;\n closeBill: (input: CloseBillInput) => Promise<BillLifecycleData>;\n reopenBill: (input: ReopenBillInput) => Promise<BillLifecycleData>;\n postPayment: (input: PostBillPaymentInput) => Promise<BillLifecycleData>;\n submitSecondReview: (input: SubmitSecondReviewInput) => Promise<BillLifecycleData>;\n clearSession: () => void;\n};\n\nasync function responseError(response: Response, fallback: string): Promise<Error> {\n const body: unknown = await response.json().catch(() => null);\n const detail = body && typeof body === \"object\"\n ? (body as { detail?: unknown; message?: unknown; error?: unknown }).detail\n ?? (body as { message?: unknown }).message\n ?? (body as { error?: unknown }).error\n : null;\n return new Error(typeof detail === \"string\" ? detail : fallback);\n}\n\nfunction isSessionFresh(session: BillLifecycleSession | null): boolean {\n if (!session) return false;\n if (!session.expiresAt) return true;\n const expiresAt = new Date(session.expiresAt).getTime();\n return Number.isFinite(expiresAt) && expiresAt > Date.now() + 30_000;\n}\n\nfunction normalizeSession(value: unknown): BillLifecycleSession {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing session endpoint returned an invalid response.\");\n }\n const candidate = value as { token?: unknown; expiresAt?: unknown; apiBaseUrl?: unknown; session?: unknown; data?: unknown };\n const nested = candidate.session ?? candidate.data;\n const session = nested && typeof nested === \"object\" ? nested as typeof candidate : candidate;\n if (typeof session.token !== \"string\" || session.token.length < 8) {\n throw new Error(\"The billing session endpoint did not return a browser session token.\");\n }\n return {\n token: session.token,\n ...(typeof session.expiresAt === \"string\" ? { expiresAt: session.expiresAt } : {}),\n ...(typeof session.apiBaseUrl === \"string\" ? { apiBaseUrl: session.apiBaseUrl } : {}),\n };\n}\n\nfunction normalizeLifecycle(value: unknown): BillLifecycleData {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing service returned an invalid bill lifecycle.\");\n }\n const data = value as Partial<BillLifecycleData>;\n if (\n !data.bill\n || !data.patient\n || !data.injury\n || !data.lifecycle\n || !Array.isArray(data.lifecycle.actions)\n || !Array.isArray(data.eors)\n || !Array.isArray(data.activity)\n || !Array.isArray(data.payments)\n || !data.remittance\n || typeof data.remittance !== \"object\"\n || !data.delivery\n || typeof data.delivery !== \"object\"\n || !data.delivery.contacts\n || typeof data.delivery.contacts !== \"object\"\n ) {\n throw new Error(\"The billing service returned an invalid bill lifecycle.\");\n }\n return data as BillLifecycleData;\n}\n\nfunction normalizeDeliveryOptions(value: unknown): BillDeliveryOptions {\n if (!value || typeof value !== \"object\") {\n throw new Error(\"The billing service returned invalid delivery options.\");\n }\n const data = value as Partial<BillDeliveryOptions>;\n if (\n typeof data.payerName !== \"string\"\n || !data.recommended\n || typeof data.recommended !== \"object\"\n || ![\"ebill\", \"fax\", \"mail\", \"email\"].includes(data.recommended.route ?? \"\")\n || !Array.isArray(data.options)\n || !data.contacts\n ) {\n throw new Error(\"The billing service returned invalid delivery options.\");\n }\n return data as BillDeliveryOptions;\n}\n\nfunction idempotencyKey(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\") return globalThis.crypto.randomUUID();\n return `mb-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\n/** Browser-safe, framework-neutral client for an already-submitted bill. */\nexport function createBillLifecycleClient({\n billId,\n sessionEndpoint = DEFAULT_SESSION_ENDPOINT,\n getSession,\n apiBaseUrl = DEFAULT_API_BASE_URL,\n fetch: fetchOverride,\n}: BillLifecycleClientOptions): BillLifecycleClient {\n const fetcher = fetchOverride ?? globalThis.fetch;\n if (typeof fetcher !== \"function\") throw new Error(\"A Fetch API implementation is required.\");\n let session: BillLifecycleSession | null = null;\n let sessionRequest: Promise<BillLifecycleSession> | null = null;\n const currentBillId = billId.trim();\n if (!currentBillId) throw new Error(\"billId is required for the submitted-bill lifecycle client.\");\n\n const mintSession = async (signal: AbortSignal, force = false): Promise<BillLifecycleSession> => {\n if (!force && isSessionFresh(session)) return session as BillLifecycleSession;\n if (!force && sessionRequest) return sessionRequest;\n const pending = getSession\n ? getSession({ signal })\n : fetcher(sessionEndpoint, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({}),\n signal,\n }).then(async (response) => {\n if (!response.ok) throw await responseError(response, \"The billing session could not be created.\");\n return response.json();\n });\n const request = Promise.resolve(pending).then(normalizeSession).then((nextSession) => {\n session = nextSession;\n return nextSession;\n }).finally(() => {\n if (sessionRequest === request) sessionRequest = null;\n });\n sessionRequest = request;\n return request;\n };\n\n const request = async (path: string, init: RequestInit = {}, providedSignal?: AbortSignal): Promise<Response> => {\n const controller = providedSignal ? null : new AbortController();\n const signal = providedSignal ?? controller?.signal;\n if (!signal) throw new Error(\"An AbortSignal could not be created.\");\n let browserSession = await mintSession(signal);\n const perform = (current: BillLifecycleSession) => {\n const base = (current.apiBaseUrl ?? apiBaseUrl).replace(/\\/$/, \"\");\n const headers = new Headers(init.headers);\n headers.set(\"authorization\", `Bearer ${current.token}`);\n return fetcher(`${base}${path}`, { ...init, headers, signal });\n };\n let response = await perform(browserSession);\n if (response.status === 401) {\n session = null;\n browserSession = await mintSession(signal, true);\n response = await perform(browserSession);\n }\n return response;\n };\n\n const billPath = (suffix = \"\"): string =>\n `/partner/v2/browser/bills/${encodeURIComponent(currentBillId)}${suffix}`;\n\n const loadLifecycle = async (signal?: AbortSignal) => {\n const response = await request(billPath(\"/lifecycle\"), {}, signal);\n if (!response.ok) throw await responseError(response, \"Bill lifecycle could not be loaded.\");\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n\n const searchClaimsAdministrators = async (query: string, claimNumber?: string): Promise<BillReviewPayer[]> => {\n const params = new URLSearchParams();\n if (query.trim()) params.set(\"q\", query.trim());\n if (claimNumber?.trim()) params.set(\"claimNumber\", claimNumber.trim());\n const response = await request(`/partner/v2/browser/claims-administrators?${params.toString()}`);\n if (!response.ok) throw await responseError(response, \"Claims administrator search is unavailable.\");\n const body = await response.json() as { results?: unknown };\n if (!Array.isArray(body.results)) throw new Error(\"Claims administrator search returned an invalid response.\");\n return body.results.flatMap((value): BillReviewPayer[] => {\n if (!value || typeof value !== \"object\") return [];\n const payer = value as Partial<BillReviewPayer>;\n if (typeof payer.id !== \"string\" || typeof payer.name !== \"string\") return [];\n return [{\n id: payer.id,\n name: payer.name,\n ...(typeof payer.hasElectronic === \"boolean\" ? { hasElectronic: payer.hasElectronic } : {}),\n ...(Array.isArray(payer.states)\n ? { states: payer.states.filter((state): state is string => typeof state === \"string\") }\n : {}),\n ...([\"high\", \"medium\", \"directory\"].includes(payer.confidence ?? \"\")\n ? { confidence: payer.confidence as NonNullable<BillReviewPayer[\"confidence\"]> }\n : {}),\n ...(typeof payer.recommended === \"boolean\" ? { recommended: payer.recommended } : {}),\n ...(Array.isArray(payer.signals)\n ? {\n signals: payer.signals.flatMap((signal) => {\n if (!signal || typeof signal !== \"object\") return [];\n const candidate = signal as { kind?: unknown; state?: unknown; label?: unknown };\n if (\n ![\"name\", \"claim_number\"].includes(String(candidate.kind))\n || ![\"match\", \"warning\"].includes(String(candidate.state))\n || typeof candidate.label !== \"string\"\n ) return [];\n return [{\n kind: candidate.kind as \"name\" | \"claim_number\",\n state: candidate.state as \"match\" | \"warning\",\n label: candidate.label,\n }];\n }),\n }\n : {}),\n }];\n });\n };\n\n const searchDiagnosisCodes = async (query: string, limit = 30): Promise<BillDiagnosisCode[]> => {\n const params = new URLSearchParams({ q: query.trim(), limit: String(Math.max(1, Math.min(100, limit))) });\n const response = await request(`/partner/v2/browser/diagnosis-codes?${params.toString()}`);\n if (!response.ok) throw await responseError(response, \"Diagnosis-code search is unavailable.\");\n const body = await response.json() as { results?: unknown };\n if (!Array.isArray(body.results)) throw new Error(\"Diagnosis-code search returned an invalid response.\");\n return body.results.flatMap((value): BillDiagnosisCode[] => {\n if (!value || typeof value !== \"object\") return [];\n const candidate = value as { code?: unknown; description?: unknown };\n return typeof candidate.code === \"string\" && typeof candidate.description === \"string\"\n ? [{ code: candidate.code, description: candidate.description }]\n : [];\n });\n };\n\n const lookupPostalCode = async (postalCode: string): Promise<BillPostalPlace | null> => {\n const params = new URLSearchParams({ postalCode: postalCode.trim() });\n const response = await request(`/partner/v2/browser/postal-codes?${params.toString()}`);\n if (response.status === 404) return null;\n if (!response.ok) throw await responseError(response, \"ZIP lookup is unavailable.\");\n const body = await response.json() as { city?: unknown; state?: unknown };\n if (typeof body.city !== \"string\" || typeof body.state !== \"string\") {\n throw new Error(\"ZIP lookup returned an invalid response.\");\n }\n return { city: body.city, state: body.state };\n };\n\n const mutation = async (path: string, init: RequestInit, fallback: string) => {\n const headers = new Headers(init.headers);\n headers.set(\"idempotency-key\", idempotencyKey());\n const response = await request(path, { ...init, headers });\n if (!response.ok) throw await responseError(response, fallback);\n return response;\n };\n const action = async (input: Record<string, unknown>, fallback: string): Promise<BillLifecycleData> => {\n const response = await mutation(billPath(\"/actions\"), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(input),\n }, fallback);\n const body = await response.json() as { data?: unknown };\n return normalizeLifecycle(body.data);\n };\n return {\n getBillId() { return currentBillId; },\n clearSession() { session = null; sessionRequest = null; },\n getLifecycle: loadLifecycle,\n searchClaimsAdministrators,\n searchDiagnosisCodes,\n lookupPostalCode,\n async getDeliveryOptions() {\n const response = await request(billPath(\"/delivery-options\"));\n if (!response.ok) throw await responseError(response, \"Delivery options could not be loaded.\");\n const body = await response.json() as { data?: unknown };\n return normalizeDeliveryOptions(body.data ?? body);\n },\n async getAttachment(attachmentId) {\n const response = await request(billPath(`/documents/${encodeURIComponent(attachmentId)}`));\n if (!response.ok) throw await responseError(response, \"Document could not be opened.\");\n return response.blob();\n },\n async getEor(documentId) {\n const response = await request(billPath(`/eors/${encodeURIComponent(documentId)}`));\n if (!response.ok) throw await responseError(response, \"EOR could not be opened.\");\n return response.blob();\n },\n async getPacket() {\n const response = await request(billPath(\"/packet\"));\n if (!response.ok) throw await responseError(response, \"Submission packet could not be downloaded.\");\n return response.blob();\n },\n closeBill(input) { return action({ action: \"close\", ...input }, \"Bill could not be closed.\"); },\n reopenBill(input) { return action({ action: \"reopen\", ...input }, \"Bill could not be reopened.\"); },\n postPayment(input) { return action({ action: \"post_payment\", ...input, checkNumber: input.checkNumber ?? \"\" }, \"Payment could not be posted.\"); },\n submitSecondReview(input) { return action({ action: \"second_review\", ...input }, \"Second Review could not be submitted.\"); },\n };\n}\n\n/**\n * Browser-safe client for reference data needed before a bill exists.\n *\n * Partners can pass the same short-lived session provider used by the submitted-bill\n * lifecycle without inventing a draft bill or exposing payer directory credentials.\n */\nexport function createBillReferenceClient(\n options: BillReferenceClientOptions = {},\n): BillReferenceClient {\n const lifecycle = createBillLifecycleClient({\n ...options,\n billId: \"pre-submission-reference-data\",\n });\n return {\n searchClaimsAdministrators: lifecycle.searchClaimsAdministrators,\n searchDiagnosisCodes: lifecycle.searchDiagnosisCodes,\n lookupPostalCode: lifecycle.lookupPostalCode,\n clearSession: lifecycle.clearSession,\n };\n}\n"],"mappings":"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","names":["request"]}
|