@crvouga/mockingbird-service-fullscript 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -4
- package/dist/{chunk-UV2Y3LMD.js → chunk-SYF4U77V.js} +97 -25
- package/dist/chunk-SYF4U77V.js.map +7 -0
- package/dist/{chunk-Z5TDU5MX.js → chunk-UMIAX3DP.js} +5 -3
- package/dist/chunk-UMIAX3DP.js.map +7 -0
- package/dist/cli.js +2 -2
- package/dist/index.d.ts +117 -89
- package/dist/index.js +1 -1
- package/dist/server.d.ts +221 -165
- package/dist/server.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-UV2Y3LMD.js.map +0 -7
- package/dist/chunk-Z5TDU5MX.js.map +0 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
# Changelog — @crvouga/mockingbird-service-fullscript
|
|
2
2
|
|
|
3
|
+
## 1.0.1 (2026-09-26)
|
|
4
|
+
|
|
5
|
+
### Fixes and improvements
|
|
6
|
+
|
|
7
|
+
- take the rejected-request byte count from content-length, never by reading the body ([a0e5fb2](https://github.com/crvouga/mockingbird/commit/a0e5fb2fc80ab725c3552b612f3f091fd6c857fb))
|
|
8
|
+
- reject a present body by media type, and log what a rejected request sent ([12e351a](https://github.com/crvouga/mockingbird/commit/12e351aba53cfb7b41e31a7809419455fc2902eb))
|
|
9
|
+
|
|
3
10
|
## 1.0.0 (2026-09-24)
|
|
4
11
|
|
|
5
12
|
### ⚠️ Breaking changes
|
|
6
13
|
|
|
7
14
|
- vendor branding for every service; purge internal mocks and consumer names ([f689534](https://github.com/crvouga/mockingbird/commit/f6895343543550dafcb7d76b426cae7635e03226))
|
|
8
15
|
|
|
9
|
-
### Dependencies
|
|
10
|
-
|
|
11
|
-
- `@crvouga/mockingbird-service-sqlite`
|
|
12
|
-
|
|
13
16
|
## 0.2.0 (2026-09-23)
|
|
14
17
|
|
|
15
18
|
### Features
|
|
@@ -1388,6 +1388,90 @@ var operationMetadata = (operation) => {
|
|
|
1388
1388
|
|
|
1389
1389
|
// ../core/dist/service.js
|
|
1390
1390
|
import { Hono } from "hono";
|
|
1391
|
+
|
|
1392
|
+
// ../core/dist/validation.js
|
|
1393
|
+
var requestBodyOf = (context) => {
|
|
1394
|
+
const requestBody = context.operation.operation.requestBody;
|
|
1395
|
+
return requestBody ? deref(context.document, requestBody) : void 0;
|
|
1396
|
+
};
|
|
1397
|
+
var mediaTypeMatches = (accepted, actual) => {
|
|
1398
|
+
const pattern = mediaTypeOf(accepted) ?? accepted.toLowerCase();
|
|
1399
|
+
if (pattern === actual || pattern === "*/*")
|
|
1400
|
+
return true;
|
|
1401
|
+
const [type, subtype] = pattern.split("/");
|
|
1402
|
+
const [actualType, actualSubtype] = actual.split("/");
|
|
1403
|
+
if (type !== actualType && type !== "*")
|
|
1404
|
+
return false;
|
|
1405
|
+
if (subtype === void 0 || subtype === "*")
|
|
1406
|
+
return true;
|
|
1407
|
+
if (subtype.startsWith("*+"))
|
|
1408
|
+
return actualSubtype?.endsWith(subtype.slice(1)) === true;
|
|
1409
|
+
return false;
|
|
1410
|
+
};
|
|
1411
|
+
var acceptedKeyFor = (content, mediaType) => {
|
|
1412
|
+
if (!content || mediaType === void 0)
|
|
1413
|
+
return void 0;
|
|
1414
|
+
const keys = Object.keys(content);
|
|
1415
|
+
return keys.find((key) => mediaTypeOf(key) === mediaType) ?? keys.find((key) => mediaTypeMatches(key, mediaType));
|
|
1416
|
+
};
|
|
1417
|
+
var unsupportedMediaType = (context, options = {}) => {
|
|
1418
|
+
if (context.body.kind === "empty" && options.includeEmpty !== true)
|
|
1419
|
+
return void 0;
|
|
1420
|
+
const content = requestBodyOf(context)?.content;
|
|
1421
|
+
if (!content || Object.keys(content).length === 0)
|
|
1422
|
+
return void 0;
|
|
1423
|
+
const mediaType = mediaTypeOf(context.request.headers.get("content-type"));
|
|
1424
|
+
if (acceptedKeyFor(content, mediaType) !== void 0)
|
|
1425
|
+
return void 0;
|
|
1426
|
+
return { mediaType: mediaType ?? null, accepted: Object.keys(content) };
|
|
1427
|
+
};
|
|
1428
|
+
var recorded = /* @__PURE__ */ new WeakMap();
|
|
1429
|
+
var recordedIssues = (request) => recorded.get(request);
|
|
1430
|
+
var bodyIssues = (context, contentType = "application/json") => {
|
|
1431
|
+
const issues = findBodyIssues(context, contentType);
|
|
1432
|
+
if (issues.length > 0)
|
|
1433
|
+
recorded.set(context.request, issues);
|
|
1434
|
+
return issues;
|
|
1435
|
+
};
|
|
1436
|
+
var findBodyIssues = (context, contentType) => {
|
|
1437
|
+
const resolved = requestBodyOf(context);
|
|
1438
|
+
if (!resolved)
|
|
1439
|
+
return [];
|
|
1440
|
+
const unsupported = unsupportedMediaType(context);
|
|
1441
|
+
if (unsupported) {
|
|
1442
|
+
return [
|
|
1443
|
+
{
|
|
1444
|
+
path: "",
|
|
1445
|
+
kind: "media_type",
|
|
1446
|
+
message: unsupported.mediaType === null ? "request body has no content-type" : `request body media type ${unsupported.mediaType} is not supported`
|
|
1447
|
+
}
|
|
1448
|
+
];
|
|
1449
|
+
}
|
|
1450
|
+
const key = acceptedKeyFor(resolved.content, mediaTypeOf(context.request.headers.get("content-type"))) ?? contentType;
|
|
1451
|
+
const schema = resolved.content?.[key]?.schema;
|
|
1452
|
+
if (!schema)
|
|
1453
|
+
return [];
|
|
1454
|
+
if (context.body.kind === "invalid") {
|
|
1455
|
+
return [
|
|
1456
|
+
{
|
|
1457
|
+
path: "",
|
|
1458
|
+
kind: "syntax",
|
|
1459
|
+
message: `request body is not valid ${context.body.mediaType}`
|
|
1460
|
+
}
|
|
1461
|
+
];
|
|
1462
|
+
}
|
|
1463
|
+
const value = context.body.kind === "json" || context.body.kind === "form" || context.body.kind === "text" ? context.body.value : void 0;
|
|
1464
|
+
if (value === void 0) {
|
|
1465
|
+
return resolved.required && context.body.kind === "empty" ? [{ path: "", kind: "required", message: "request body is required" }] : [];
|
|
1466
|
+
}
|
|
1467
|
+
return validateValue(context.document, resolveSchema(context.document, schema), value).map((issue) => ({ path: issue.path.join("."), kind: "schema", message: issue.message }));
|
|
1468
|
+
};
|
|
1469
|
+
|
|
1470
|
+
// ../core/dist/service.js
|
|
1471
|
+
var withIssues = (request, response) => {
|
|
1472
|
+
const issues = response.status >= 400 ? recordedIssues(request) : void 0;
|
|
1473
|
+
return issues && issues.length > 0 ? annotateResponse(response, { issues }) : response;
|
|
1474
|
+
};
|
|
1391
1475
|
var defineOperations = (handlers) => handlers;
|
|
1392
1476
|
var OperationRegistryError = class extends Error {
|
|
1393
1477
|
problems;
|
|
@@ -1473,9 +1557,7 @@ var createService = (options) => {
|
|
|
1473
1557
|
now
|
|
1474
1558
|
};
|
|
1475
1559
|
const short = await options.before?.(context);
|
|
1476
|
-
|
|
1477
|
-
return short;
|
|
1478
|
-
return handler(context);
|
|
1560
|
+
return withIssues(request, short ?? await handler(context));
|
|
1479
1561
|
};
|
|
1480
1562
|
app.on(operation.method.toUpperCase(), honoPath(operation.path), route);
|
|
1481
1563
|
}
|
|
@@ -1512,7 +1594,7 @@ var restoreNamespace = (sqlite, namespace, snapshot) => {
|
|
|
1512
1594
|
};
|
|
1513
1595
|
|
|
1514
1596
|
// ../core/dist/version.js
|
|
1515
|
-
var PACKAGE_VERSION = true ? "1.0.
|
|
1597
|
+
var PACKAGE_VERSION = true ? "1.0.1" : UNRELEASED_VERSION;
|
|
1516
1598
|
|
|
1517
1599
|
// ../core/dist/signing.js
|
|
1518
1600
|
var encoder = new TextEncoder();
|
|
@@ -2272,8 +2354,15 @@ var createRuntime = (options) => {
|
|
|
2272
2354
|
const started = monotonicNow();
|
|
2273
2355
|
const url = new URL(request.url);
|
|
2274
2356
|
const operationId = operationIdFor(request, url.pathname);
|
|
2357
|
+
const contentLength = request.headers.get("content-length");
|
|
2358
|
+
const received = {
|
|
2359
|
+
contentType: request.headers.get("content-type"),
|
|
2360
|
+
bodyBytes: contentLength !== null && /^\d+$/.test(contentLength) ? Number(contentLength) : null,
|
|
2361
|
+
transferEncoding: request.headers.get("transfer-encoding")
|
|
2362
|
+
};
|
|
2275
2363
|
const log = (status, faultId, response2) => {
|
|
2276
2364
|
const noted = response2 ? responseNotes(response2) : void 0;
|
|
2365
|
+
const rejected = status >= 400 && faultId === void 0;
|
|
2277
2366
|
const entry = {
|
|
2278
2367
|
service: options.name,
|
|
2279
2368
|
namespace,
|
|
@@ -2285,7 +2374,9 @@ var createRuntime = (options) => {
|
|
|
2285
2374
|
unmatched: options.document !== void 0 && operationId === void 0,
|
|
2286
2375
|
...faultId !== void 0 ? { faultId } : {},
|
|
2287
2376
|
...noted?.ids && Object.keys(noted.ids).length > 0 ? { ids: noted.ids } : {},
|
|
2288
|
-
...noted?.adopted ? { adopted: true } : {}
|
|
2377
|
+
...noted?.adopted ? { adopted: true } : {},
|
|
2378
|
+
...rejected ? { request: { ...received } } : {},
|
|
2379
|
+
...rejected && noted?.issues && noted.issues.length > 0 ? { issues: noted.issues.map((issue) => ({ ...issue })) } : {}
|
|
2289
2380
|
};
|
|
2290
2381
|
metrics.record(entry);
|
|
2291
2382
|
journal.record({ ...entry, at: new Date(clock.now()).toISOString() });
|
|
@@ -2492,25 +2583,6 @@ var presetRoutes = (presets, runtime) => ({
|
|
|
2492
2583
|
}
|
|
2493
2584
|
});
|
|
2494
2585
|
|
|
2495
|
-
// ../core/dist/validation.js
|
|
2496
|
-
var bodyIssues = (context, contentType = "application/json") => {
|
|
2497
|
-
const requestBody = context.operation.operation.requestBody;
|
|
2498
|
-
if (!requestBody)
|
|
2499
|
-
return [];
|
|
2500
|
-
const resolved = deref(context.document, requestBody);
|
|
2501
|
-
const schema = resolved.content?.[contentType]?.schema;
|
|
2502
|
-
if (!schema)
|
|
2503
|
-
return [];
|
|
2504
|
-
const value = context.body.kind === "json" || context.body.kind === "form" ? context.body.value : void 0;
|
|
2505
|
-
if (context.body.kind === "invalid") {
|
|
2506
|
-
return [{ path: "", message: `request body is not valid ${context.body.mediaType}` }];
|
|
2507
|
-
}
|
|
2508
|
-
if (value === void 0) {
|
|
2509
|
-
return resolved.required ? [{ path: "", message: "request body is required" }] : [];
|
|
2510
|
-
}
|
|
2511
|
-
return validateValue(context.document, resolveSchema(context.document, schema), value).map((issue) => ({ path: issue.path.join("."), message: issue.message }));
|
|
2512
|
-
};
|
|
2513
|
-
|
|
2514
2586
|
// src/generated/openapi.ts
|
|
2515
2587
|
var document = JSON.parse(`{"openapi":"3.1.0","info":{"title":"Fullscript API (Mockingbird subset)","description":"Stateful mock subset of the Fullscript API for lab ordering: per-practitioner OAuth (authorize, token with authorization_code and refresh_token grants, revoke), clinic, embeddable session grants, lab orders, lab-order events, expiring result PDFs, and signed webhooks. Hand-authored from the EMR consumer (fullscript-api-client.ts, fullscript-event-model.ts, fullscript-webhook-signature.ts).\\n","version":"1","x-mockingbird-upstream":{"note":"Wire shapes from the consumer app's EMR backend (its Fullscript services and routers); the vendor's API reference is behind a partner login."}},"servers":[{"url":"https://api-us-snd.fullscript.io"}],"security":[{"bearerAuth":[]}],"paths":{"/api/oauth/token":{"post":{"operationId":"OAuthToken","description":"Exchange an authorization code, or rotate a refresh token (the old refresh token stops working).","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthTokenResponse"}}}},"400":{"description":"invalid_grant / unsupported_grant_type / invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"401":{"description":"invalid_client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}}},"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}}}}},"/api/oauth/revoke":{"post":{"operationId":"OAuthRevoke","description":"Revoke an access or refresh token (RFC 7009: always 200).","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"responses":{"200":{"description":"Revoked","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"invalid_request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"401":{"description":"invalid_client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}}},"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeRequest"}}}}}},"/api/clinic":{"get":{"operationId":"GetClinic","description":"The token's clinic.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Clinic","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClinicResponse"}}}},"401":{"description":"Missing, invalid, expired or revoked access token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}}}}},"/api/clinic/embeddable/session_grants":{"post":{"operationId":"CreateSessionGrant","description":"A short-lived secret for the embedded Fullscript widget.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"201":{"description":"Grant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionGrant"}}}},"401":{"description":"Missing, invalid, expired or revoked access token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}}}}},"/api/clinic/labs/orders":{"get":{"operationId":"ListLabOrders","description":"The clinic's lab orders (optionally one patient's), paged.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabOrdersPage"}}}},"401":{"description":"Missing, invalid, expired or revoked access token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}}},"parameters":[{"name":"patient_id","in":"query","required":false,"schema":{"type":"string","enum":["pat_seed_1","pat_seed_2","pat_missing"]}},{"name":"page[number]","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":3}},{"name":"page[size]","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}]}},"/api/clinic/labs/orders/{orderId}":{"get":{"operationId":"GetLabOrder","description":"One lab order with tests, per-test results and the aggregated result.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabOrderResponse"}}}},"401":{"description":"Missing, invalid, expired or revoked access token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}},"404":{"description":"Unknown order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}}},"parameters":[{"name":"orderId","in":"path","required":true,"schema":{"type":"string","enum":["lo_seed_1","lo_seed_2","lo_seed_3","lo_missing"]}}]}},"/api/events/lab_orders":{"get":{"operationId":"ListLabOrderEvents","description":"The clinic's lab_order.updated events, newest first by default.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Page","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventsPage"}}}},"401":{"description":"Missing, invalid, expired or revoked access token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}}},"parameters":[{"name":"order_by","in":"query","required":false,"schema":{"type":"string","enum":["DESC","ASC"]}},{"name":"page[number]","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":3}},{"name":"page[size]","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}]}},"/api/events/{eventId}":{"get":{"operationId":"GetEvent","description":"One event with its data.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventResponse"}}}},"401":{"description":"Missing, invalid, expired or revoked access token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}},"404":{"description":"Unknown event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrors"}}}}},"parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"string","enum":["evt_1","evt_2","evt_3","evt_missing"]}}]}},"/oauth/authorize":{"get":{"operationId":"Authorize","description":"The consent page: auto-approves as the requested (or default) practitioner and redirects to redirect_uri with code and state.","security":[],"x-mockingbird":{"supported":true,"parity":{"enabled":false,"reason":"Browser redirect flow; covered by acceptance tests."}},"parameters":[{"name":"client_id","in":"query","required":true,"schema":{"type":"string"}},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string"}},{"name":"response_type","in":"query","required":true,"schema":{"type":"string","enum":["code"]}},{"name":"state","in":"query","required":false,"schema":{"type":"string"}},{"name":"scope","in":"query","required":false,"schema":{"type":"string"}},{"name":"practitioner_id","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"302":{"description":"Redirect back with ?code=&state="},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}}}}},"/results/{artifactId}":{"get":{"operationId":"GetResultPdf","description":"An expiring result PDF URL (what pdf_url points at).","security":[],"x-mockingbird":{"supported":true,"parity":{"enabled":false,"reason":"Binary PDF behind an expiring signed URL; covered by acceptance tests."}},"parameters":[{"name":"artifactId","in":"path","required":true,"schema":{"type":"string"}},{"name":"expires","in":"query","required":true,"schema":{"type":"string"}},{"name":"signature","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The PDF","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"403":{"description":"Expired or bad signature"},"404":{"description":"Unknown artifact"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"TokenRequest":{"type":"object","required":["grant_type","client_id","client_secret"],"properties":{"grant_type":{"type":"string","enum":["authorization_code","refresh_token"]},"client_id":{"type":"string","minLength":1,"maxLength":64,"examples":["parity-client"]},"client_secret":{"type":"string","minLength":1,"maxLength":64,"examples":["parity-secret"]},"code":{"type":"string","maxLength":64},"refresh_token":{"type":"string","maxLength":200},"redirect_uri":{"type":"string","maxLength":200,"examples":["https://emr.example.com/v1/fullscript/oauth/callback"]}}},"RevokeRequest":{"type":"object","required":["client_id","client_secret","token"],"properties":{"client_id":{"type":"string","minLength":1,"maxLength":64},"client_secret":{"type":"string","minLength":1,"maxLength":64},"token":{"type":"string","minLength":1,"maxLength":200}}},"OAuthTokenResponse":{"type":"object","required":["oauth"],"properties":{"oauth":{"type":"object","required":["access_token","token_type","expires_in","refresh_token","scope","created_at","resource_owner"],"properties":{"access_token":{"type":"string","x-mockingbird-volatile":{"kind":"token"}},"token_type":{"type":"string","enum":["Bearer"]},"expires_in":{"type":"integer"},"refresh_token":{"type":"string","x-mockingbird-volatile":{"kind":"token"}},"scope":{"type":"string"},"created_at":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"resource_owner":{"type":"object","required":["id","type"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["Practitioner","Staff"]},"clinic_id":{"type":"string"}}}}}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"error_description":{"type":"string"}}},"ApiErrors":{"type":"object","required":["errors"],"properties":{"errors":{"type":"array","items":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}},"ClinicResponse":{"type":"object","required":["clinic"],"properties":{"clinic":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"created_at":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}}}}}},"SessionGrant":{"type":"object","required":["secret_token","expires_at"],"properties":{"secret_token":{"type":"string","x-mockingbird-volatile":{"kind":"token"}},"expires_at":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}}}},"LabOrderSummary":{"type":"object","required":["id","state","treatment_plan_id","patient_id","created_at","updated_at"],"properties":{"id":{"type":"string"},"state":{"type":"string","enum":["not_purchased","purchased","schedule_appointment","upcoming_appointment","processing","partial_results","results_ready","interpretation_shared","results_amended"]},"treatment_plan_id":{"type":["string","null"]},"patient_id":{"type":"string"},"name":{"type":"string"},"created_at":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"updated_at":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}}}},"LabOrdersPage":{"type":"object","required":["orders","meta"],"properties":{"orders":{"type":"array","items":{"$ref":"#/components/schemas/LabOrderSummary"}},"meta":{"type":"object","required":["current_page","next_page","prev_page","total_pages","total_count"],"properties":{"current_page":{"type":"integer"},"next_page":{"type":["integer","null"]},"prev_page":{"type":["integer","null"]},"total_pages":{"type":"integer"},"total_count":{"type":"integer"}}}}},"LabOrderResponse":{"type":"object","required":["order"],"properties":{"order":{"type":"object","required":["id","state","treatment_plan_id","tests","results","latest_aggregated_result"],"properties":{"id":{"type":"string"},"state":{"type":"string","enum":["not_purchased","purchased","schedule_appointment","upcoming_appointment","processing","partial_results","results_ready","interpretation_shared","results_amended"]},"treatment_plan_id":{"type":["string","null"]},"patient_id":{"type":"string"},"name":{"type":"string"},"collection_method":{"type":"string"},"created_at":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"updated_at":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"tests":{"type":"array","items":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"lab_type":{"type":"string"}}}},"results":{"type":"array","items":{"type":"object","required":["id","name","state","pdf_url"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"state":{"type":"string"},"pdf_url":{"type":"string","x-mockingbird-volatile":{"kind":"url"}}}}},"latest_aggregated_result":{"type":["object","null"],"properties":{"id":{"type":"string"},"artifact_id":{"type":"string"},"pdf_url":{"type":"string","x-mockingbird-volatile":{"kind":"url"}},"status":{"type":"string"}}}}}}},"EventSummary":{"type":"object","required":["id","type","clinic_id","created_at"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["lab_order.updated"]},"clinic_id":{"type":"string"},"created_at":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}}}},"EventsPage":{"type":"object","required":["events","meta"],"properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/EventSummary"}},"meta":{"type":"object","required":["current_page","next_page","prev_page","total_pages","total_count"],"properties":{"current_page":{"type":"integer"},"next_page":{"type":["integer","null"]},"prev_page":{"type":["integer","null"]},"total_pages":{"type":"integer"},"total_count":{"type":"integer"}}}}},"EventResponse":{"type":"object","required":["event"],"properties":{"event":{"type":"object","required":["id","type","clinic_id","created_at","data"],"properties":{"id":{"type":"string"},"type":{"type":"string"},"clinic_id":{"type":"string"},"created_at":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"data":{"type":"object"}}}}}}}}`);
|
|
2516
2588
|
var operationIds = ["OAuthToken", "OAuthRevoke", "GetClinic", "CreateSessionGrant", "ListLabOrders", "GetLabOrder", "ListLabOrderEvents", "GetEvent", "Authorize", "GetResultPdf"];
|
|
@@ -3409,4 +3481,4 @@ export {
|
|
|
3409
3481
|
envelope,
|
|
3410
3482
|
FullscriptAPI
|
|
3411
3483
|
};
|
|
3412
|
-
//# sourceMappingURL=chunk-
|
|
3484
|
+
//# sourceMappingURL=chunk-SYF4U77V.js.map
|