@choiceapps/communityservices-sdk 0.1.0 → 0.2.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/CHANGELOG.md +16 -0
- package/README.md +0 -17
- package/browser/coordinated-entry-event.d.mts +78 -0
- package/browser/coordinated-entry-event.mjs +175 -0
- package/browser/current-living-situation.mjs +11 -120
- package/browser/enrollment-workflow.d.mts +17 -3
- package/browser/enrollment-workflow.mjs +78 -17
- package/browser/index.d.mts +1 -0
- package/browser/index.mjs +1 -0
- package/browser/subassessment-row-recorder.mjs +154 -0
- package/dist/cjs/encoding.d.ts.map +1 -1
- package/dist/cjs/encoding.js +2 -1
- package/dist/cjs/encoding.js.map +1 -1
- package/dist/cjs/errors.d.ts +4 -1
- package/dist/cjs/errors.d.ts.map +1 -1
- package/dist/cjs/errors.js +9 -1
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/runtime.d.ts +5 -1
- package/dist/cjs/runtime.d.ts.map +1 -1
- package/dist/cjs/runtime.js +1 -1
- package/dist/cjs/runtime.js.map +1 -1
- package/dist/cjs/subassessments.d.ts.map +1 -1
- package/dist/cjs/subassessments.js +8 -15
- package/dist/cjs/subassessments.js.map +1 -1
- package/dist/cjs/transport.d.ts.map +1 -1
- package/dist/cjs/transport.js +15 -3
- package/dist/cjs/transport.js.map +1 -1
- package/dist/esm/encoding.d.ts.map +1 -1
- package/dist/esm/encoding.js +2 -1
- package/dist/esm/encoding.js.map +1 -1
- package/dist/esm/errors.d.ts +4 -1
- package/dist/esm/errors.d.ts.map +1 -1
- package/dist/esm/errors.js +9 -1
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/runtime.d.ts +5 -1
- package/dist/esm/runtime.d.ts.map +1 -1
- package/dist/esm/runtime.js +1 -1
- package/dist/esm/runtime.js.map +1 -1
- package/dist/esm/subassessments.d.ts.map +1 -1
- package/dist/esm/subassessments.js +8 -15
- package/dist/esm/subassessments.js.map +1 -1
- package/dist/esm/transport.d.ts.map +1 -1
- package/dist/esm/transport.js +15 -3
- package/dist/esm/transport.js.map +1 -1
- package/docs/README.md +1 -0
- package/docs/assessments.md +21 -3
- package/docs/capabilities.md +2 -0
- package/docs/configuration.md +1 -0
- package/docs/coordinated-entry-events.md +88 -0
- package/docs/current-living-situation.md +1 -1
- package/docs/dates-and-answers.md +3 -1
- package/docs/enrollments.md +41 -1
- package/docs/reference.md +6 -2
- package/docs/troubleshooting.md +25 -0
- package/docs/using-the-sdk.md +2 -3
- package/docs/vendor-issues/README.md +2 -0
- package/docs/vendor-issues/date-semantics.md +2 -0
- package/docs/vendor-issues/yes-no-answers.md +35 -0
- package/examples/README.md +2 -0
- package/examples/coordinated-entry-events.mts +37 -0
- package/examples/enrollment-workflow.mts +5 -2
- package/package.json +1 -1
package/dist/cjs/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.ts"],"names":[],"mappings":";;;AAyFA,0BAWC;AAXD,SAAgB,OAAO,CAAI,QAAwB;IACjD,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,IAAI,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzF,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAClH,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,8DAA8D;IAC9D,OAAO,CAAC,QAAa,CAAC,CAAC;AACzB,CAAC;AAID,0JAA0J;AAC1J,MAAa,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAY;IAChB,MAAM,CAAqB;IAC3B,SAAS,CAAS;IAClB,SAAS,CAAqB;IAC9B,YAAY,CAAqB;IAC1C,aAAa,CAAqB;IAElC,YAAY,IAAe,EAAE,SAAiB,EAAE,UAA0E,EAAE;QAC1H,KAAK,CAAC,WAAW,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QACzG,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;CACF;AAjBD,oCAiBC","sourcesContent":["/** Matching credentials/providers share cached authentication in-process. No environment or disk reads. */\nexport type Authentication =\n | { kind: \"credentials\"; username: string; password: string }\n | { kind: \"token\"; token: string }\n | { kind: \"provider\"; getToken: (context: { forceRefresh: boolean; signal: AbortSignal }) => string | Promise<string> }\n | { kind: \"none\" };\n\nexport interface ClientOptions {\n tenant: string;\n auth: Authentication;\n\n maxConcurrency?: number;\n cooldown?: { threshold: number; windowMs: number; durationMs: number };\n hooks?: ClientHooks;\n /** Receives the same allowlisted events as hooks. No raw request/response data. */\n logger?: (event: ClientEvent) => void;\n metadataCacheTtlMs?: number;\n metadataCacheMaxEntries?: number;\n /** Opt-in correction for a measured upstream mobile assessment dateEffective shift.\n * Added to the requested instant on POST AddAssessmentAnswer only. No default timezone is assumed.\n * Revalidate against saved effective dates when the server's offset changes. */\n mobileAssessmentDateCorrectionMinutes?: number;\n /** Opt in to retaining up to 16384 characters of an UpstreamError response body.\n * May contain private data. Excluded from JSON serialization and ordinary telemetry.\n * Authentication and throttle error bodies are never retained. */\n captureErrorBody?: boolean;\n /** Defaults to the public production API URL. Supply the target environment explicitly when needed. */\n baseUrl?: string;\n /** Inject a fetch-compatible transport for tests or network routing. */\n fetch?: typeof globalThis.fetch;\n /** Total request deadline including auth, read retries, and backoff. Default 30 seconds. */\n timeoutMs?: number;\n /** Additional attempts for GET only. Default 2; writes are never replayed. */\n maxReadRetries?: number;\n retryBaseDelayMs?: number;\n maxRetryDelayMs?: number;\n}\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n correlationId?: string;\n}\n\nexport interface ClientEvent {\n type: \"request\" | \"response\" | \"tokenMint\" | \"throttle\" | \"cooldown\";\n operation: string;\n correlationId: string;\n retryCount: number;\n durationMs?: number;\n status?: number;\n retryAfterMs?: number;\n until?: string;\n}\nexport interface ClientHooks {\n onRequest?: (event: ClientEvent) => void;\n onResponse?: (event: ClientEvent) => void;\n onTokenMint?: (event: ClientEvent) => void;\n onThrottle?: (event: ClientEvent) => void;\n onCooldown?: (event: ClientEvent) => void;\n}\nexport interface ClientHealth {\n state: \"closed\" | \"open\";\n until: string | null;\n activeRequests: number;\n queuedRequests: number;\n tokenMintCount: number;\n}\n\nexport interface PaginationOptions {\n /** Safety limit. Reaching it throws rather than silently returning partial data. Default 10,000. */\n maxPages?: number;\n}\n\nexport interface ODataCollection<T> {\n value: T[];\n \"@odata.count\"?: number;\n \"@odata.nextLink\"?: string;\n}\n\n/** WellSky's total_count response. Count covers the result set, not just this page. */\nexport interface CountedCollection<T> {\n count: number;\n values: T[];\n}\n\n/** WellSky may return an object, an array, or either collection envelope for the same model. */\nexport type ApiResponse<T> = T | T[] | ODataCollection<T> | CountedCollection<T> | null;\n\nexport function toItems<T>(response: ApiResponse<T>): T[] {\n if (response === null) return [];\n if (Array.isArray(response)) return response;\n if (typeof response === \"object\" && \"value\" in response && Array.isArray(response.value)) {\n return response.value;\n }\n if (typeof response === \"object\" && \"count\" in response && \"values\" in response && Array.isArray(response.values)) {\n return response.values;\n }\n // The envelope branch above has been checked at the boundary.\n return [response as T];\n}\n\nexport type ErrorKind = \"http\" | \"network\" | \"timeout\" | \"aborted\" | \"validation\" | \"protocol\" | \"pagination\" | \"tenant_mismatch\" | \"auth\" | \"throttled\" | \"cooldown\" | \"ambiguous_commit\" | \"definition_drift\" | \"unknown_picklist_value\";\n\n/** Deliberately contains no credentials, query values, or client IDs, and no response body unless `captureErrorBody` is enabled (then non-enumerable). */\nexport class WellSkyError extends Error {\n readonly kind: ErrorKind;\n readonly status: number | undefined;\n readonly operation: string;\n readonly requestId: string | undefined;\n readonly retryAfterMs: number | undefined;\n correlationId: string | undefined;\n\n constructor(kind: ErrorKind, operation: string, details: { status?: number; requestId?: string; retryAfterMs?: number } = {}) {\n super(`WellSky ${operation}: ${kind}${details.status === undefined ? \"\" : ` (HTTP ${details.status})`}`);\n this.name = \"WellSkyError\";\n this.kind = kind;\n this.operation = operation;\n this.status = details.status;\n this.requestId = details.requestId;\n this.retryAfterMs = details.retryAfterMs;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subassessments.d.ts","sourceRoot":"","sources":["../../src/subassessments.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,2CAA2C,EAAE,MAAM,0BAA0B,CAAC;AAE5F,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,cAAe,SAAQ,oBAAoB;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AACD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,KAAK,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,2CAA2C,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACjH;AA8BD,4FAA4F;AAC5F,qBAAa,mBAAmB;;gBAGlB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB;IAEjD,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"subassessments.d.ts","sourceRoot":"","sources":["../../src/subassessments.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,2CAA2C,EAAE,MAAM,0BAA0B,CAAC;AAE5F,MAAM,WAAW,oBAAqB,SAAQ,cAAc;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AACD,MAAM,WAAW,cAAe,SAAQ,oBAAoB;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AACD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,KAAK,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,2CAA2C,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACjH;AA8BD,4FAA4F;AAC5F,qBAAa,mBAAmB;;gBAGlB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB;IAEjD,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CA2CvF"}
|
|
@@ -72,22 +72,15 @@ class SubassessmentEditor {
|
|
|
72
72
|
const selected = records.filter(r => r.recordset_id === input.recordsetId);
|
|
73
73
|
if (selected.length !== 1 || !selected[0])
|
|
74
74
|
throw new errors_js_1.ValidationError(operation, ["recordsetId"]);
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
75
|
+
// A row read omits cells never answered, so fall back to the parent's question list.
|
|
76
|
+
const isEnd = (q) => q.virt_field_name === input.endDateField && q.question_type === "date" && typeof q.question_id === "number";
|
|
77
|
+
const inRow = objectRows(selected[0].sub_assessment_list ?? []).filter(isEnd);
|
|
78
|
+
const end = inRow.length ? inRow : objectRows(parent.sub_assessment_question_list ?? []).filter(isEnd);
|
|
79
|
+
if (end.length !== 1 || !end[0] || typeof parent.question_id !== "number")
|
|
78
80
|
throw new errors_js_1.ValidationError(operation, [input.endDateField]);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (typeof q.question_id !== "number" || typeof q.question_type !== "string" || typeof q.virt_field_name !== "string")
|
|
83
|
-
throw new runtime_js_1.WellSkyError("protocol", readEndpoint);
|
|
84
|
-
const value = q.virt_field_name === input.endDateField ? input.endDate : q.answer_value ?? "";
|
|
85
|
-
if (typeof value !== "string")
|
|
86
|
-
throw new runtime_js_1.WellSkyError("protocol", readEndpoint);
|
|
87
|
-
if (q.question_type === "yes_no" && value === "")
|
|
88
|
-
return [];
|
|
89
|
-
return [{ question_id: q.question_id, question_type: q.question_type, virt_field_name: q.virt_field_name, answer_value: value }];
|
|
90
|
-
});
|
|
81
|
+
// Send only the end-date cell. Mobile updates the sent cells of the recordset and keeps the
|
|
82
|
+
// rest, including provider and yes/no answers it cannot write itself (live, November 2, 2026).
|
|
83
|
+
const encoded = [{ question_id: end[0].question_id, question_type: "date", virt_field_name: input.endDateField, answer_value: input.endDate }];
|
|
91
84
|
Object.assign(expected, snapshot(parent, input.endDateField, calendarOnly));
|
|
92
85
|
expected[`${input.recordsetId}/${input.endDateField}`] = dateValue(input.endDate, calendarOnly);
|
|
93
86
|
body = [{ question_id: parent.question_id, question_type: "sub_assessment", virt_field_name: input.parentField, answer_value: "", subAssessmentQuestionAnswers: [{ recordset_id: input.recordsetId, isDeleted: false, subAssessments: encoded }] }];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subassessments.js","sourceRoot":"","sources":["../../src/subassessments.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord } from \"./validation.js\";\nimport { WellSkyError } from \"./runtime.js\";\nimport type { RequestOptions } from \"./runtime.js\";\nimport { ValidationError } from \"./errors.js\";\nimport { verifyWrite } from \"./verification.js\";\nimport type { WriteResult } from \"./verification.js\";\nimport type { AddSubAssessmentQuestionWithAnswerViewModel } from \"./generated/v3-models.js\";\n\nexport interface SubassessmentContext extends RequestOptions {\n clientId: number;\n assessmentCode: string;\n effectiveDate?: string;\n}\nexport interface EndDateRequest extends SubassessmentContext {\n parentField: string;\n recordsetId: number;\n endDateField: string;\n endDate: string;\n /** Optional caller preflight for program-specific review-date or other policies. */\n preflight?: (options: RequestOptions) => Promise<void>;\n}\nexport interface SubassessmentSource {\n read: (context: SubassessmentContext) => Promise<unknown>;\n write: (context: SubassessmentContext, body: AddSubAssessmentQuestionWithAnswerViewModel[]) => Promise<unknown>;\n}\nfunction objectRows(value: unknown): Record<string, unknown>[] {\n const rows = isRecord(value) && Array.isArray(value.value) ? value.value : Array.isArray(value) ? value : value === null ? [] : [value];\n if (!rows.every(isRecord)) throw new WellSkyError(\"protocol\", \"subassessment read\");\n return rows;\n}\nfunction parentFrom(value: unknown, field: string): Record<string, unknown> {\n const matches = objectRows(value).filter(q => q.virt_field_name === field);\n if (matches.length !== 1 || !matches[0] || matches[0].question_type !== \"sub_assessment\") throw new ValidationError(\"subassessment resolution\", [field]);\n return matches[0];\n}\nfunction dateValue(value: unknown, calendarOnly = false): unknown {\n if (value === null || value === \"\" || value === undefined) return null;\n if (typeof value !== \"string\") return value;\n if (calendarOnly || /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return value.slice(0, 10);\n const iso = value.replace(\" \", \"T\").replace(/([+-]\\d{2})$/, \"$1:00\");\n if (!/(?:Z|[+-]\\d{2}:\\d{2})$/.test(iso)) return value;\n const millis = Date.parse(iso);\n return Number.isFinite(millis) ? new Date(millis).toISOString() : value;\n}\nfunction snapshot(parent: Record<string, unknown>, endDateField: string, calendarOnly: boolean): Record<string, unknown> {\n const records = objectRows(parent.sub_assessment_answer_list ?? []);\n const fields: Record<string, unknown> = { \"$recordsets\": records.map(r => r.recordset_id).sort((a, b) => Number(a) - Number(b)) };\n for (const record of records) for (const q of objectRows(record.sub_assessment_list ?? [])) {\n if (typeof q.virt_field_name !== \"string\" || typeof record.recordset_id !== \"number\") throw new WellSkyError(\"protocol\", \"subassessment read\");\n fields[`${record.recordset_id}/${q.virt_field_name}`] = q.question_type === \"date\" ? dateValue(q.answer_value, calendarOnly && q.virt_field_name === endDateField) : q.answer_value ?? null;\n }\n return fields;\n}\n\n/** Generic recordset editing; no program names, assessment codes, or replacement policy. */\nexport class SubassessmentEditor {\n readonly #tenant: string;\n readonly #source: SubassessmentSource;\n constructor(tenant: string, source: SubassessmentSource) { this.#tenant = tenant; this.#source = source; }\n\n async setEndDate(input: EndDateRequest): Promise<WriteResult<{ recordsetId: number }>> {\n const operation = \"POST /assessmentsmobile/AddAssessmentAnswer/{clientId}/{assessmentCode}\";\n const readEndpoint = \"GET /assessmentsmobile/GetAssessmentAnswers/{clientId}/{assessmentCode}\";\n const expected: Record<string, unknown> = {};\n let body: AddSubAssessmentQuestionWithAnswerViewModel[] = [];\n const calendarOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(input.endDate);\n const semanticPayload = { tenant: this.#tenant, operation, clientId: input.clientId, assessmentCode: input.assessmentCode, parentField: input.parentField, recordsetId: input.recordsetId, endDateField: input.endDateField, endDate: input.endDate, effectiveDate: input.effectiveDate ?? null };\n return verifyWrite({\n operation, readEndpoint, semanticPayload, expectedFields: expected,\n ...(input.signal ? { signal: input.signal } : {}), ...(input.correlationId === undefined ? {} : { correlationId: input.correlationId }),\n ...(input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs }),\n preflight: async options => {\n if (!Number.isSafeInteger(input.recordsetId) || input.recordsetId < 1 || !/^\\d{4}-\\d{2}-\\d{2}(?:$|[T ])/.test(input.endDate)) throw new ValidationError(operation, [\"recordsetId\", \"endDate\"]);\n const calendar = input.endDate.slice(0, 10);\n const day = new Date(`${calendar}T00:00:00Z`);\n if (!Number.isFinite(day.getTime()) || day.toISOString().slice(0, 10) !== calendar) throw new ValidationError(operation, [\"endDate\"]);\n if (!calendarOnly && !Number.isFinite(Date.parse(input.endDate.replace(\" \", \"T\").replace(/([+-]\\d{2})$/, \"$1:00\")))) throw new ValidationError(operation, [\"endDate\"]);\n await input.preflight?.(options);\n const parent = parentFrom(await this.#source.read({ ...input, ...options }), input.parentField);\n const records = objectRows(parent.sub_assessment_answer_list ?? []);\n const selected = records.filter(r => r.recordset_id === input.recordsetId);\n if (selected.length !== 1 || !selected[0]) throw new ValidationError(operation, [\"recordsetId\"]);\n const questions = objectRows(selected[0].sub_assessment_list ?? []);\n const end = questions.filter(q => q.virt_field_name === input.endDateField && q.question_type === \"date\");\n if (end.length !== 1 || typeof parent.question_id !== \"number\") throw new ValidationError(operation, [input.endDateField]);\n const encoded = questions.filter(q => ![\"label\", \"blank\"].includes(String(q.question_type))).flatMap(q => {\n if (q.question_type === \"provider\") throw new ValidationError(\"mobile provider answers are unsupported\", [String(q.virt_field_name)]);\n if (typeof q.question_id !== \"number\" || typeof q.question_type !== \"string\" || typeof q.virt_field_name !== \"string\") throw new WellSkyError(\"protocol\", readEndpoint);\n const value = q.virt_field_name === input.endDateField ? input.endDate : q.answer_value ?? \"\";\n if (typeof value !== \"string\") throw new WellSkyError(\"protocol\", readEndpoint);\n if (q.question_type === \"yes_no\" && value === \"\") return [];\n return [{ question_id: q.question_id, question_type: q.question_type, virt_field_name: q.virt_field_name, answer_value: value }];\n });\n Object.assign(expected, snapshot(parent, input.endDateField, calendarOnly));\n expected[`${input.recordsetId}/${input.endDateField}`] = dateValue(input.endDate, calendarOnly);\n body = [{ question_id: parent.question_id, question_type: \"sub_assessment\", virt_field_name: input.parentField, answer_value: \"\", subAssessmentQuestionAnswers: [{ recordset_id: input.recordsetId, isDeleted: false, subAssessments: encoded }] }];\n },\n submit: options => this.#source.write({ ...input, ...options }, body),\n readBack: async options => {\n const parent = parentFrom(await this.#source.read({ ...input, ...options }), input.parentField);\n const records = objectRows(parent.sub_assessment_answer_list ?? []);\n if (!records.some(r => r.recordset_id === input.recordsetId)) return { kind: \"absent\" };\n return { kind: \"found\", value: { data: { recordsetId: input.recordsetId }, ids: { clientId: input.clientId, recordsetId: input.recordsetId }, fields: snapshot(parent, input.endDateField, calendarOnly) } };\n },\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subassessments.js","sourceRoot":"","sources":["../../src/subassessments.ts"],"names":[],"mappings":"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","sourcesContent":["import { isRecord } from \"./validation.js\";\nimport { WellSkyError } from \"./runtime.js\";\nimport type { RequestOptions } from \"./runtime.js\";\nimport { ValidationError } from \"./errors.js\";\nimport { verifyWrite } from \"./verification.js\";\nimport type { WriteResult } from \"./verification.js\";\nimport type { AddSubAssessmentQuestionWithAnswerViewModel } from \"./generated/v3-models.js\";\n\nexport interface SubassessmentContext extends RequestOptions {\n clientId: number;\n assessmentCode: string;\n effectiveDate?: string;\n}\nexport interface EndDateRequest extends SubassessmentContext {\n parentField: string;\n recordsetId: number;\n endDateField: string;\n endDate: string;\n /** Optional caller preflight for program-specific review-date or other policies. */\n preflight?: (options: RequestOptions) => Promise<void>;\n}\nexport interface SubassessmentSource {\n read: (context: SubassessmentContext) => Promise<unknown>;\n write: (context: SubassessmentContext, body: AddSubAssessmentQuestionWithAnswerViewModel[]) => Promise<unknown>;\n}\nfunction objectRows(value: unknown): Record<string, unknown>[] {\n const rows = isRecord(value) && Array.isArray(value.value) ? value.value : Array.isArray(value) ? value : value === null ? [] : [value];\n if (!rows.every(isRecord)) throw new WellSkyError(\"protocol\", \"subassessment read\");\n return rows;\n}\nfunction parentFrom(value: unknown, field: string): Record<string, unknown> {\n const matches = objectRows(value).filter(q => q.virt_field_name === field);\n if (matches.length !== 1 || !matches[0] || matches[0].question_type !== \"sub_assessment\") throw new ValidationError(\"subassessment resolution\", [field]);\n return matches[0];\n}\nfunction dateValue(value: unknown, calendarOnly = false): unknown {\n if (value === null || value === \"\" || value === undefined) return null;\n if (typeof value !== \"string\") return value;\n if (calendarOnly || /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return value.slice(0, 10);\n const iso = value.replace(\" \", \"T\").replace(/([+-]\\d{2})$/, \"$1:00\");\n if (!/(?:Z|[+-]\\d{2}:\\d{2})$/.test(iso)) return value;\n const millis = Date.parse(iso);\n return Number.isFinite(millis) ? new Date(millis).toISOString() : value;\n}\nfunction snapshot(parent: Record<string, unknown>, endDateField: string, calendarOnly: boolean): Record<string, unknown> {\n const records = objectRows(parent.sub_assessment_answer_list ?? []);\n const fields: Record<string, unknown> = { \"$recordsets\": records.map(r => r.recordset_id).sort((a, b) => Number(a) - Number(b)) };\n for (const record of records) for (const q of objectRows(record.sub_assessment_list ?? [])) {\n if (typeof q.virt_field_name !== \"string\" || typeof record.recordset_id !== \"number\") throw new WellSkyError(\"protocol\", \"subassessment read\");\n fields[`${record.recordset_id}/${q.virt_field_name}`] = q.question_type === \"date\" ? dateValue(q.answer_value, calendarOnly && q.virt_field_name === endDateField) : q.answer_value ?? null;\n }\n return fields;\n}\n\n/** Generic recordset editing; no program names, assessment codes, or replacement policy. */\nexport class SubassessmentEditor {\n readonly #tenant: string;\n readonly #source: SubassessmentSource;\n constructor(tenant: string, source: SubassessmentSource) { this.#tenant = tenant; this.#source = source; }\n\n async setEndDate(input: EndDateRequest): Promise<WriteResult<{ recordsetId: number }>> {\n const operation = \"POST /assessmentsmobile/AddAssessmentAnswer/{clientId}/{assessmentCode}\";\n const readEndpoint = \"GET /assessmentsmobile/GetAssessmentAnswers/{clientId}/{assessmentCode}\";\n const expected: Record<string, unknown> = {};\n let body: AddSubAssessmentQuestionWithAnswerViewModel[] = [];\n const calendarOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(input.endDate);\n const semanticPayload = { tenant: this.#tenant, operation, clientId: input.clientId, assessmentCode: input.assessmentCode, parentField: input.parentField, recordsetId: input.recordsetId, endDateField: input.endDateField, endDate: input.endDate, effectiveDate: input.effectiveDate ?? null };\n return verifyWrite({\n operation, readEndpoint, semanticPayload, expectedFields: expected,\n ...(input.signal ? { signal: input.signal } : {}), ...(input.correlationId === undefined ? {} : { correlationId: input.correlationId }),\n ...(input.timeoutMs === undefined ? {} : { timeoutMs: input.timeoutMs }),\n preflight: async options => {\n if (!Number.isSafeInteger(input.recordsetId) || input.recordsetId < 1 || !/^\\d{4}-\\d{2}-\\d{2}(?:$|[T ])/.test(input.endDate)) throw new ValidationError(operation, [\"recordsetId\", \"endDate\"]);\n const calendar = input.endDate.slice(0, 10);\n const day = new Date(`${calendar}T00:00:00Z`);\n if (!Number.isFinite(day.getTime()) || day.toISOString().slice(0, 10) !== calendar) throw new ValidationError(operation, [\"endDate\"]);\n if (!calendarOnly && !Number.isFinite(Date.parse(input.endDate.replace(\" \", \"T\").replace(/([+-]\\d{2})$/, \"$1:00\")))) throw new ValidationError(operation, [\"endDate\"]);\n await input.preflight?.(options);\n const parent = parentFrom(await this.#source.read({ ...input, ...options }), input.parentField);\n const records = objectRows(parent.sub_assessment_answer_list ?? []);\n const selected = records.filter(r => r.recordset_id === input.recordsetId);\n if (selected.length !== 1 || !selected[0]) throw new ValidationError(operation, [\"recordsetId\"]);\n // A row read omits cells never answered, so fall back to the parent's question list.\n const isEnd = (q: Record<string, unknown>) => q.virt_field_name === input.endDateField && q.question_type === \"date\" && typeof q.question_id === \"number\";\n const inRow = objectRows(selected[0].sub_assessment_list ?? []).filter(isEnd);\n const end = inRow.length ? inRow : objectRows(parent.sub_assessment_question_list ?? []).filter(isEnd);\n if (end.length !== 1 || !end[0] || typeof parent.question_id !== \"number\") throw new ValidationError(operation, [input.endDateField]);\n // Send only the end-date cell. Mobile updates the sent cells of the recordset and keeps the\n // rest, including provider and yes/no answers it cannot write itself (live, November 2, 2026).\n const encoded = [{ question_id: end[0].question_id as number, question_type: \"date\", virt_field_name: input.endDateField, answer_value: input.endDate }];\n Object.assign(expected, snapshot(parent, input.endDateField, calendarOnly));\n expected[`${input.recordsetId}/${input.endDateField}`] = dateValue(input.endDate, calendarOnly);\n body = [{ question_id: parent.question_id, question_type: \"sub_assessment\", virt_field_name: input.parentField, answer_value: \"\", subAssessmentQuestionAnswers: [{ recordset_id: input.recordsetId, isDeleted: false, subAssessments: encoded }] }];\n },\n submit: options => this.#source.write({ ...input, ...options }, body),\n readBack: async options => {\n const parent = parentFrom(await this.#source.read({ ...input, ...options }), input.parentField);\n const records = objectRows(parent.sub_assessment_answer_list ?? []);\n if (!records.some(r => r.recordset_id === input.recordsetId)) return { kind: \"absent\" };\n return { kind: \"found\", value: { data: { recordsetId: input.recordsetId }, ids: { clientId: input.clientId, recordsetId: input.recordsetId }, fields: snapshot(parent, input.endDateField, calendarOnly) } };\n },\n });\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA+B,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAElH,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAI3E,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,cAAc,CAAC;AAG9D,UAAU,SAAU,SAAQ,cAAc;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAiDD,qBAAa,SAAS;;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA+B,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAElH,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAI3E,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,cAAc,CAAC;AAG9D,UAAU,SAAU,SAAQ,cAAc;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAiDD,qBAAa,SAAS;;gBAiBR,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc;IA8B5E,IAAI,MAAM,IAAI,MAAM,CAAyB;IAC7C,IAAI,OAAO,IAAI,MAAM,CAA0B;IAC/C,MAAM,IAAI,YAAY;IA4HhB,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;IAwEvE,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,GAAG,iBAAiB,GAAG,cAAc,CAAC,CAAC,CAAC;CAe5G"}
|
package/dist/cjs/transport.js
CHANGED
|
@@ -73,6 +73,7 @@ class Transport {
|
|
|
73
73
|
#control;
|
|
74
74
|
#observers;
|
|
75
75
|
#mobileDateCorrection;
|
|
76
|
+
#captureErrorBody;
|
|
76
77
|
constructor(options, version, schemas) {
|
|
77
78
|
if (typeof window !== "undefined" || !("process" in globalThis))
|
|
78
79
|
throw new TypeError("WellSky SDK requires a server-side Node.js runtime");
|
|
@@ -97,6 +98,9 @@ class Transport {
|
|
|
97
98
|
if (correction !== undefined && (!Number.isSafeInteger(correction) || Math.abs(correction) > 840))
|
|
98
99
|
throw new errors_js_1.ValidationError("client configuration", ["mobileAssessmentDateCorrectionMinutes"]);
|
|
99
100
|
this.#mobileDateCorrection = correction;
|
|
101
|
+
if (options.captureErrorBody !== undefined && typeof options.captureErrorBody !== "boolean")
|
|
102
|
+
throw new errors_js_1.ValidationError("client configuration", ["captureErrorBody"]);
|
|
103
|
+
this.#captureErrorBody = options.captureErrorBody === true;
|
|
100
104
|
this.#timeout = positiveInteger(options.timeoutMs ?? 30_000, "timeoutMs");
|
|
101
105
|
this.#retries = positiveInteger(options.maxReadRetries ?? 2, "maxReadRetries", 0);
|
|
102
106
|
this.#retryBase = positiveInteger(options.retryBaseDelayMs ?? 250, "retryBaseDelayMs", 0);
|
|
@@ -171,15 +175,23 @@ class Transport {
|
|
|
171
175
|
}
|
|
172
176
|
async #read(response, operation, allowText = false) {
|
|
173
177
|
if (!response.ok) {
|
|
174
|
-
// Discard upstream error content; it may contain client data or credentials.
|
|
175
|
-
await response.body?.cancel();
|
|
176
178
|
const requestId = response.headers.get("x-request-id") ?? response.headers.get("request-id") ?? undefined;
|
|
177
179
|
const wait = retryAfter(response.headers);
|
|
180
|
+
let responseBody;
|
|
181
|
+
// Retain raw content only by explicit opt-in, never for authentication or throttling.
|
|
182
|
+
if (this.#captureErrorBody && operation !== "POST /authentication/SetAuthKey" && ![401, 403, 429].includes(response.status)) {
|
|
183
|
+
try {
|
|
184
|
+
responseBody = await response.text();
|
|
185
|
+
}
|
|
186
|
+
catch { /* Keep the HTTP failure if diagnostic reading fails. */ }
|
|
187
|
+
}
|
|
188
|
+
else
|
|
189
|
+
await response.body?.cancel();
|
|
178
190
|
if (response.status === 429)
|
|
179
191
|
throw new errors_js_1.ThrottledError(operation, wait ?? this.#retryBase, response.status, requestId);
|
|
180
192
|
if (response.status === 401 || response.status === 403)
|
|
181
193
|
throw new errors_js_1.AuthError(operation, response.status);
|
|
182
|
-
throw new errors_js_1.UpstreamError(operation, response.status, requestId, wait);
|
|
194
|
+
throw new errors_js_1.UpstreamError(operation, response.status, requestId, wait, responseBody);
|
|
183
195
|
}
|
|
184
196
|
const text = await response.text();
|
|
185
197
|
if (!text.trim())
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { WellSkyError, toItems } from \"./runtime.js\";\nimport type { ApiResponse, Authentication, ClientOptions, PaginationOptions, RequestOptions } from \"./runtime.js\";\nimport { decodeResponse, isRecord, matches } from \"./validation.js\";\nimport type { OperationDefinition, SchemaRegistry } from \"./validation.js\";\nimport { AuthError, TenantMismatchError, ThrottledError, UpstreamError, ValidationError } from \"./errors.js\";\nimport { emit, identity, requestControl, sharedAuthentication, tokenMintQueue } from \"./control.js\";\nimport type { RequestControl, SharedAuthentication } from \"./control.js\";\nimport type { ClientEvent, ClientHealth } from \"./runtime.js\";\nimport { correctMobileEffectiveDate } from \"./effective-date.js\";\n\ninterface Arguments extends RequestOptions {\n path?: object;\n query?: object;\n body?: unknown;\n}\nconst retryStatuses = new Set([408, 429, 500, 502, 503, 504]);\n\nfunction positiveInteger(value: number, name: string, minimum = 1): number {\n if (!Number.isSafeInteger(value) || value < minimum) throw new TypeError(`${name} must be an integer >= ${minimum}`);\n return value;\n}\n\nfunction expiry(token: string): number {\n try {\n const part = token.split(\".\")[1];\n if (!part) return 0;\n const base64 = part.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const parsed: unknown = JSON.parse(atob(base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\")));\n return isRecord(parsed) && typeof parsed.exp === \"number\" && Number.isFinite(parsed.exp) ? parsed.exp * 1000 : 0;\n } catch { return 0; }\n}\n\nfunction retryAfter(headers: Headers): number | undefined {\n const raw = headers.get(\"retry-after\");\n if (!raw) return undefined;\n const seconds = Number(raw);\n const delay = Number.isFinite(seconds) ? seconds * 1000 : Date.parse(raw) - Date.now();\n return Number.isFinite(delay) ? Math.max(0, delay) : undefined;\n}\n\nfunction abortError(signal: AbortSignal, operation: string): WellSkyError {\n return new WellSkyError(signal.reason instanceof DOMException && signal.reason.name === \"TimeoutError\" ? \"timeout\" : \"aborted\", operation);\n}\n\n/** A caller can cancel its wait without cancelling authentication shared by other callers. */\nfunction withSignal<T>(promise: Promise<T>, signal: AbortSignal, operation: string): Promise<T> {\n return new Promise((resolve, reject) => {\n const abort = () => reject(abortError(signal, operation));\n if (signal.aborted) abort();\n else signal.addEventListener(\"abort\", abort, { once: true });\n promise.then(resolve, reject).finally(() => signal.removeEventListener(\"abort\", abort));\n });\n}\n\nfunction delay(ms: number, signal: AbortSignal, operation: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) { reject(abortError(signal, operation)); return; }\n const abort = () => { clearTimeout(timer); reject(abortError(signal, operation)); };\n const timer = setTimeout(() => { signal.removeEventListener(\"abort\", abort); resolve(); }, ms);\n signal.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\nexport class Transport {\n readonly #baseUrl: string;\n readonly #tenant: string;\n readonly #version: string;\n readonly #auth: Authentication;\n readonly #fetch: typeof globalThis.fetch;\n readonly #schemas: SchemaRegistry;\n readonly #timeout: number;\n readonly #retries: number;\n readonly #retryBase: number;\n readonly #retryMax: number;\n readonly #shared: Promise<SharedAuthentication>;\n readonly #control: RequestControl;\n readonly #observers: Pick<ClientOptions, \"hooks\" | \"logger\">;\n readonly #mobileDateCorrection: number | undefined;\n\n constructor(options: ClientOptions, version: string, schemas: SchemaRegistry) {\n if (typeof window !== \"undefined\" || !(\"process\" in globalThis)) throw new TypeError(\"WellSky SDK requires a server-side Node.js runtime\");\n if (!options.tenant.trim() || /[\\r\\n]/.test(options.tenant)) throw new TypeError(\"tenant is required and must be a valid header value\");\n const url = new URL(options.baseUrl ?? \"https://csclientapi.wellsky.com/client-api-prod\");\n if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new TypeError(\"baseUrl must be an HTTP(S) URL without credentials, query, or fragment\");\n if (url.protocol === 'http:' && !['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)) throw new TypeError(\"Use HTTPS except for loopback testing\");\n if (options.auth.kind === \"credentials\" && (!options.auth.username.trim() || !options.auth.password)) throw new TypeError(\"username and password are required\");\n if (options.auth.kind === \"token\" && (!options.auth.token.trim() || /\\s/.test(options.auth.token))) throw new TypeError(\"token must be a non-empty bearer token\");\n this.#baseUrl = url.toString().replace(/\\/$/, \"\");\n this.#tenant = options.tenant;\n this.#version = version;\n this.#auth = { ...options.auth };\n this.#fetch = options.fetch ?? globalThis.fetch;\n this.#schemas = schemas;\n const correction = options.mobileAssessmentDateCorrectionMinutes;\n if (correction !== undefined && (!Number.isSafeInteger(correction) || Math.abs(correction) > 840)) throw new ValidationError(\"client configuration\", [\"mobileAssessmentDateCorrectionMinutes\"]);\n this.#mobileDateCorrection = correction;\n this.#timeout = positiveInteger(options.timeoutMs ?? 30_000, \"timeoutMs\");\n this.#retries = positiveInteger(options.maxReadRetries ?? 2, \"maxReadRetries\", 0);\n this.#retryBase = positiveInteger(options.retryBaseDelayMs ?? 250, \"retryBaseDelayMs\", 0);\n this.#retryMax = positiveInteger(options.maxRetryDelayMs ?? 30_000, \"maxRetryDelayMs\", 0);\n const scope = JSON.stringify([this.#baseUrl, this.#tenant, identity(this.#fetch)]);\n this.#control = requestControl(scope, options);\n this.#shared = sharedAuthentication(scope, this.#auth);\n this.#observers = { ...(options.hooks ? { hooks: { ...options.hooks } } : {}), ...(options.logger ? { logger: options.logger } : {}) };\n if (this.#auth.kind === \"token\") this.#checkTokenTenant(this.#auth.token);\n }\n\n get tenant(): string { return this.#tenant; }\n get baseUrl(): string { return this.#baseUrl; }\n health(): ClientHealth { return this.#control.health(); }\n\n #checkTenant(value: unknown, operation: string): void {\n if (!isRecord(value)) return;\n for (const key of [\"tenant\", \"tenantCode\", \"tenant_code\", \"x-tenant\"]) {\n if (value[key] !== undefined && value[key] !== null && value[key] !== this.#tenant) throw new TenantMismatchError(operation);\n }\n }\n #checkTokenTenant(token: string): void {\n let payload: unknown;\n try {\n const segment = token.split(\".\")[1];\n if (!segment) return;\n const base64 = segment.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n payload = JSON.parse(atob(base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\")));\n } catch { return; }\n this.#checkTenant(payload, \"authentication token\");\n }\n\n async #send(url: string | URL, init: RequestInit & { signal: AbortSignal }, operation: string, correlationId: string, retryCount: number): Promise<Response> {\n this.#control.check(operation);\n const release = await this.#control.semaphore.acquire(init.signal, operation);\n const started = Date.now();\n const base = { operation, correlationId, retryCount };\n try {\n this.#control.check(operation);\n const headers = new Headers(init.headers);\n headers.set(\"x-correlation-id\", correlationId);\n emit(this.#observers, { ...base, type: \"request\" });\n const response = await this.#fetch(url, { ...init, headers });\n const event: ClientEvent = { ...base, type: \"response\", status: response.status, durationMs: Date.now() - started };\n emit(this.#observers, event);\n if (response.status === 429) emit(this.#observers, { ...event, type: \"throttle\", retryAfterMs: retryAfter(response.headers) ?? this.#retryBase });\n const until = this.#control.failed(response.status);\n if (until !== undefined) emit(this.#observers, { ...base, type: \"cooldown\", until: new Date(until).toISOString() });\n if (response.headers.has(\"x-tenant\") && response.headers.get(\"x-tenant\") !== this.#tenant) {\n await response.body?.cancel(); throw new TenantMismatchError(operation);\n }\n // Hold the concurrency slot through body consumption, not merely until headers arrive.\n const body = await response.arrayBuffer();\n return new Response(response.status === 204 || response.status === 205 || response.status === 304 ? null : body, { status: response.status, statusText: response.statusText, headers: response.headers });\n } finally { release(); }\n }\n\n #headers(token?: string): Headers {\n const headers = new Headers({ Accept: \"application/json\", \"x-tenant\": this.#tenant, \"x-version\": this.#version });\n if (token) headers.set(\"Authorization\", `Bearer ${token}`);\n return headers;\n }\n\n async #read(response: Response, operation: string, allowText = false): Promise<unknown> {\n if (!response.ok) {\n // Discard upstream error content; it may contain client data or credentials.\n await response.body?.cancel();\n const requestId = response.headers.get(\"x-request-id\") ?? response.headers.get(\"request-id\") ?? undefined;\n const wait = retryAfter(response.headers);\n if (response.status === 429) throw new ThrottledError(operation, wait ?? this.#retryBase, response.status, requestId);\n if (response.status === 401 || response.status === 403) throw new AuthError(operation, response.status);\n throw new UpstreamError(operation, response.status, requestId, wait);\n }\n const text = await response.text();\n if (!text.trim()) return null;\n let value: unknown;\n try { value = JSON.parse(text); }\n catch {\n if (allowText) return text;\n throw new WellSkyError(\"protocol\", operation);\n }\n this.#checkTenant(value, operation);\n return value;\n }\n\n async #mint(forceRefresh: boolean, shared: SharedAuthentication): Promise<string> {\n const operation = \"POST /authentication/SetAuthKey\";\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new DOMException(\"Deadline exceeded\", \"TimeoutError\")), this.#timeout);\n const signal = controller.signal;\n let release: (() => void) | undefined;\n try {\n release = await tokenMintQueue.acquire(signal, operation);\n this.#control.check(operation);\n const correlationId = crypto.randomUUID();\n this.#control.tokenMintCount++;\n emit(this.#observers, { type: \"tokenMint\", operation, correlationId, retryCount: 0 });\n let token: unknown;\n if (this.#auth.kind === \"provider\") token = await withSignal(Promise.resolve().then(() => this.#auth.kind === \"provider\" ? this.#auth.getToken({ forceRefresh, signal }) : \"\"), signal, operation);\n else if (this.#auth.kind === \"credentials\") {\n const headers = this.#headers();\n headers.set(\"Content-Type\", \"application/json\");\n const response = await this.#send(`${this.#baseUrl}/authentication/SetAuthKey`, {\n method: \"POST\", headers, body: JSON.stringify({ username: this.#auth.username, password: this.#auth.password }), signal, redirect: \"error\", cache: \"no-store\",\n }, operation, correlationId, 0);\n const result = await this.#read(response, operation);\n token = isRecord(result) ? result.token : undefined;\n }\n if (typeof token !== \"string\" || !token || /\\s/.test(token)) throw new WellSkyError(\"protocol\", operation);\n this.#checkTokenTenant(token);\n const expiresAt = expiry(token);\n if (expiresAt !== 0 && expiresAt <= Date.now()) throw new WellSkyError(\"protocol\", operation);\n shared.cached = { token, expiresAt };\n return token;\n } catch (error) {\n if (signal.aborted) throw abortError(signal, operation);\n if (error instanceof WellSkyError) throw error;\n throw new WellSkyError(\"network\", operation);\n } finally { release?.(); clearTimeout(timer); }\n }\n\n async #token(rejectedToken?: string): Promise<string | undefined> {\n if (this.#auth.kind === \"none\") return Promise.resolve(undefined);\n if (this.#auth.kind === \"token\") return Promise.resolve(this.#auth.token);\n const shared = await this.#shared;\n // An older request's late 401 must not evict a newer token.\n if (rejectedToken && shared.cached?.token !== rejectedToken && shared.cached) return shared.cached.token;\n if (shared.inFlight) return shared.inFlight;\n if (!rejectedToken && shared.cached && shared.cached.expiresAt > Date.now() + 120_000) return shared.cached.token;\n shared.cached = undefined;\n shared.inFlight = this.#mint(Boolean(rejectedToken), shared).finally(() => { shared.inFlight = undefined; });\n return shared.inFlight;\n }\n\n async execute<T>(definition: OperationDefinition, args: Arguments): Promise<T> {\n const operation = `${definition.method} ${definition.path}`;\n const correlationId = args.correlationId ?? crypto.randomUUID();\n if (!/^[A-Za-z0-9_.:-]{1,128}$/.test(correlationId)) throw new ValidationError(operation, [\"correlationId\"]);\n const timeout = positiveInteger(args.timeoutMs ?? this.#timeout, \"timeoutMs\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new DOMException(\"Deadline exceeded\", \"TimeoutError\")), timeout);\n const signal = args.signal ? AbortSignal.any([args.signal, controller.signal]) : controller.signal;\n try {\n if (signal.aborted) throw abortError(signal, operation);\n this.#control.check(operation);\n if (!matches(args.path ?? {}, definition.pathSchema, this.#schemas, \"request\") || !matches(args.query ?? {}, definition.querySchema, this.#schemas, \"request\") || (definition.bodySchema && !matches(args.body, definition.bodySchema, this.#schemas, \"request\"))) throw new ValidationError(operation);\n // Check file bytes before multipart construction or credential authentication.\n if (definition.multipart && isRecord(args.body) && args.body.fileData instanceof Blob && args.body.fileData.size > 10_000_000) throw new ValidationError(operation, [\"fileData\"]);\n const pathValues = new Map(Object.entries(args.path ?? {}));\n const path = definition.path.replace(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = String(pathValues.get(name));\n if (value === \".\" || value === \"..\") throw new WellSkyError(\"validation\", operation);\n return encodeURIComponent(value);\n });\n const url = new URL(this.#baseUrl + path);\n for (const [name, value] of Object.entries(args.query ?? {})) {\n if (value !== undefined && value !== null) {\n const encoded = this.#mobileDateCorrection !== undefined && name === \"dateEffective\" && operation === \"POST /assessmentsmobile/AddAssessmentAnswer/{clientId}/{assessmentCode}\"\n ? correctMobileEffectiveDate(value, this.#mobileDateCorrection, operation) : String(value);\n url.searchParams.set(name, encoded);\n }\n }\n let body: string | FormData | undefined;\n if (definition.multipart && isRecord(args.body)) {\n body = new FormData();\n for (const [name, value] of Object.entries(args.body)) {\n if (value !== undefined && value !== null) body.append(name, value instanceof Blob ? value : String(value));\n }\n } else if (args.body !== undefined) body = JSON.stringify(args.body);\n let token = definition.authenticated ? await withSignal(this.#token(), signal, operation) : undefined;\n let refreshed = false;\n let attempts = 0;\n while (true) {\n try {\n const headers = this.#headers(token);\n if (typeof body === \"string\") headers.set(\"Content-Type\", \"application/json\");\n const response = await this.#send(url, { method: definition.method, headers, ...(body === undefined ? {} : { body }), signal, redirect: \"error\", cache: \"no-store\" }, operation, correlationId, attempts);\n // Reads can refresh once. Writes are never automatically sent twice, even after a 401.\n if (response.status === 401 && definition.method === \"GET\" && definition.authenticated && !refreshed && (this.#auth.kind === \"credentials\" || this.#auth.kind === \"provider\")) {\n await response.body?.cancel();\n refreshed = true;\n token = await withSignal(this.#token(token), signal, operation);\n continue;\n }\n const result = await this.#read(response, operation, definition.responseSchema === undefined);\n return decodeResponse<T>(result, definition.responseSchema, this.#schemas, operation);\n } catch (error) {\n if (signal.aborted) throw abortError(signal, operation);\n const failure = error instanceof WellSkyError ? error : new WellSkyError(\"network\", operation);\n const retryable = failure.kind === \"network\" || ((failure.kind === \"http\" || failure.kind === \"throttled\") && retryStatuses.has(failure.status ?? 0));\n if (definition.method !== \"GET\" || failure.operation !== operation || !retryable || attempts >= this.#retries) throw failure;\n const wait = failure.retryAfterMs ?? Math.min(this.#retryMax, this.#retryBase * 2 ** attempts * (1 + Math.random() * 0.2));\n // Never retry earlier than Retry-After. Return the error if the delay exceeds our bound.\n if (wait > this.#retryMax) throw failure;\n attempts++;\n await delay(wait, signal, operation);\n }\n }\n } catch (error) {\n if (signal.aborted) { const error = abortError(signal, operation); error.correlationId = correlationId; throw error; }\n if (error instanceof WellSkyError) error.correlationId = correlationId;\n if (error instanceof WellSkyError || error instanceof TypeError) throw error;\n throw new WellSkyError(\"network\", operation);\n } finally { clearTimeout(timer); }\n }\n\n async *paginate<T>(definition: OperationDefinition, args: Arguments & PaginationOptions): AsyncGenerator<T> {\n const operation = `${definition.method} ${definition.path}`;\n const query = Object.fromEntries(Object.entries(args.query ?? {}));\n const start = positiveInteger(typeof query.startPage === \"number\" ? query.startPage : 1, \"startPage\");\n positiveInteger(typeof query.perPage === \"number\" ? query.perPage : 30, \"perPage\");\n const maxPages = positiveInteger(args.maxPages ?? 10_000, \"maxPages\");\n for (let page = 0; page < maxPages; page++) {\n const response = await this.execute<ApiResponse<T>>(definition, { ...args, query: { perPage: 30, ...query, startPage: start + page } });\n const items = toItems(response);\n if (!items.length) return;\n yield* items;\n // Continue through short pages: some tenants cap perPage below the requested size.\n }\n throw new WellSkyError(\"pagination\", operation);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { WellSkyError, toItems } from \"./runtime.js\";\nimport type { ApiResponse, Authentication, ClientOptions, PaginationOptions, RequestOptions } from \"./runtime.js\";\nimport { decodeResponse, isRecord, matches } from \"./validation.js\";\nimport type { OperationDefinition, SchemaRegistry } from \"./validation.js\";\nimport { AuthError, TenantMismatchError, ThrottledError, UpstreamError, ValidationError } from \"./errors.js\";\nimport { emit, identity, requestControl, sharedAuthentication, tokenMintQueue } from \"./control.js\";\nimport type { RequestControl, SharedAuthentication } from \"./control.js\";\nimport type { ClientEvent, ClientHealth } from \"./runtime.js\";\nimport { correctMobileEffectiveDate } from \"./effective-date.js\";\n\ninterface Arguments extends RequestOptions {\n path?: object;\n query?: object;\n body?: unknown;\n}\nconst retryStatuses = new Set([408, 429, 500, 502, 503, 504]);\n\nfunction positiveInteger(value: number, name: string, minimum = 1): number {\n if (!Number.isSafeInteger(value) || value < minimum) throw new TypeError(`${name} must be an integer >= ${minimum}`);\n return value;\n}\n\nfunction expiry(token: string): number {\n try {\n const part = token.split(\".\")[1];\n if (!part) return 0;\n const base64 = part.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const parsed: unknown = JSON.parse(atob(base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\")));\n return isRecord(parsed) && typeof parsed.exp === \"number\" && Number.isFinite(parsed.exp) ? parsed.exp * 1000 : 0;\n } catch { return 0; }\n}\n\nfunction retryAfter(headers: Headers): number | undefined {\n const raw = headers.get(\"retry-after\");\n if (!raw) return undefined;\n const seconds = Number(raw);\n const delay = Number.isFinite(seconds) ? seconds * 1000 : Date.parse(raw) - Date.now();\n return Number.isFinite(delay) ? Math.max(0, delay) : undefined;\n}\n\nfunction abortError(signal: AbortSignal, operation: string): WellSkyError {\n return new WellSkyError(signal.reason instanceof DOMException && signal.reason.name === \"TimeoutError\" ? \"timeout\" : \"aborted\", operation);\n}\n\n/** A caller can cancel its wait without cancelling authentication shared by other callers. */\nfunction withSignal<T>(promise: Promise<T>, signal: AbortSignal, operation: string): Promise<T> {\n return new Promise((resolve, reject) => {\n const abort = () => reject(abortError(signal, operation));\n if (signal.aborted) abort();\n else signal.addEventListener(\"abort\", abort, { once: true });\n promise.then(resolve, reject).finally(() => signal.removeEventListener(\"abort\", abort));\n });\n}\n\nfunction delay(ms: number, signal: AbortSignal, operation: string): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) { reject(abortError(signal, operation)); return; }\n const abort = () => { clearTimeout(timer); reject(abortError(signal, operation)); };\n const timer = setTimeout(() => { signal.removeEventListener(\"abort\", abort); resolve(); }, ms);\n signal.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\nexport class Transport {\n readonly #baseUrl: string;\n readonly #tenant: string;\n readonly #version: string;\n readonly #auth: Authentication;\n readonly #fetch: typeof globalThis.fetch;\n readonly #schemas: SchemaRegistry;\n readonly #timeout: number;\n readonly #retries: number;\n readonly #retryBase: number;\n readonly #retryMax: number;\n readonly #shared: Promise<SharedAuthentication>;\n readonly #control: RequestControl;\n readonly #observers: Pick<ClientOptions, \"hooks\" | \"logger\">;\n readonly #mobileDateCorrection: number | undefined;\n readonly #captureErrorBody: boolean;\n\n constructor(options: ClientOptions, version: string, schemas: SchemaRegistry) {\n if (typeof window !== \"undefined\" || !(\"process\" in globalThis)) throw new TypeError(\"WellSky SDK requires a server-side Node.js runtime\");\n if (!options.tenant.trim() || /[\\r\\n]/.test(options.tenant)) throw new TypeError(\"tenant is required and must be a valid header value\");\n const url = new URL(options.baseUrl ?? \"https://csclientapi.wellsky.com/client-api-prod\");\n if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new TypeError(\"baseUrl must be an HTTP(S) URL without credentials, query, or fragment\");\n if (url.protocol === 'http:' && !['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)) throw new TypeError(\"Use HTTPS except for loopback testing\");\n if (options.auth.kind === \"credentials\" && (!options.auth.username.trim() || !options.auth.password)) throw new TypeError(\"username and password are required\");\n if (options.auth.kind === \"token\" && (!options.auth.token.trim() || /\\s/.test(options.auth.token))) throw new TypeError(\"token must be a non-empty bearer token\");\n this.#baseUrl = url.toString().replace(/\\/$/, \"\");\n this.#tenant = options.tenant;\n this.#version = version;\n this.#auth = { ...options.auth };\n this.#fetch = options.fetch ?? globalThis.fetch;\n this.#schemas = schemas;\n const correction = options.mobileAssessmentDateCorrectionMinutes;\n if (correction !== undefined && (!Number.isSafeInteger(correction) || Math.abs(correction) > 840)) throw new ValidationError(\"client configuration\", [\"mobileAssessmentDateCorrectionMinutes\"]);\n this.#mobileDateCorrection = correction;\n if (options.captureErrorBody !== undefined && typeof options.captureErrorBody !== \"boolean\") throw new ValidationError(\"client configuration\", [\"captureErrorBody\"]);\n this.#captureErrorBody = options.captureErrorBody === true;\n this.#timeout = positiveInteger(options.timeoutMs ?? 30_000, \"timeoutMs\");\n this.#retries = positiveInteger(options.maxReadRetries ?? 2, \"maxReadRetries\", 0);\n this.#retryBase = positiveInteger(options.retryBaseDelayMs ?? 250, \"retryBaseDelayMs\", 0);\n this.#retryMax = positiveInteger(options.maxRetryDelayMs ?? 30_000, \"maxRetryDelayMs\", 0);\n const scope = JSON.stringify([this.#baseUrl, this.#tenant, identity(this.#fetch)]);\n this.#control = requestControl(scope, options);\n this.#shared = sharedAuthentication(scope, this.#auth);\n this.#observers = { ...(options.hooks ? { hooks: { ...options.hooks } } : {}), ...(options.logger ? { logger: options.logger } : {}) };\n if (this.#auth.kind === \"token\") this.#checkTokenTenant(this.#auth.token);\n }\n\n get tenant(): string { return this.#tenant; }\n get baseUrl(): string { return this.#baseUrl; }\n health(): ClientHealth { return this.#control.health(); }\n\n #checkTenant(value: unknown, operation: string): void {\n if (!isRecord(value)) return;\n for (const key of [\"tenant\", \"tenantCode\", \"tenant_code\", \"x-tenant\"]) {\n if (value[key] !== undefined && value[key] !== null && value[key] !== this.#tenant) throw new TenantMismatchError(operation);\n }\n }\n #checkTokenTenant(token: string): void {\n let payload: unknown;\n try {\n const segment = token.split(\".\")[1];\n if (!segment) return;\n const base64 = segment.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n payload = JSON.parse(atob(base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\")));\n } catch { return; }\n this.#checkTenant(payload, \"authentication token\");\n }\n\n async #send(url: string | URL, init: RequestInit & { signal: AbortSignal }, operation: string, correlationId: string, retryCount: number): Promise<Response> {\n this.#control.check(operation);\n const release = await this.#control.semaphore.acquire(init.signal, operation);\n const started = Date.now();\n const base = { operation, correlationId, retryCount };\n try {\n this.#control.check(operation);\n const headers = new Headers(init.headers);\n headers.set(\"x-correlation-id\", correlationId);\n emit(this.#observers, { ...base, type: \"request\" });\n const response = await this.#fetch(url, { ...init, headers });\n const event: ClientEvent = { ...base, type: \"response\", status: response.status, durationMs: Date.now() - started };\n emit(this.#observers, event);\n if (response.status === 429) emit(this.#observers, { ...event, type: \"throttle\", retryAfterMs: retryAfter(response.headers) ?? this.#retryBase });\n const until = this.#control.failed(response.status);\n if (until !== undefined) emit(this.#observers, { ...base, type: \"cooldown\", until: new Date(until).toISOString() });\n if (response.headers.has(\"x-tenant\") && response.headers.get(\"x-tenant\") !== this.#tenant) {\n await response.body?.cancel(); throw new TenantMismatchError(operation);\n }\n // Hold the concurrency slot through body consumption, not merely until headers arrive.\n const body = await response.arrayBuffer();\n return new Response(response.status === 204 || response.status === 205 || response.status === 304 ? null : body, { status: response.status, statusText: response.statusText, headers: response.headers });\n } finally { release(); }\n }\n\n #headers(token?: string): Headers {\n const headers = new Headers({ Accept: \"application/json\", \"x-tenant\": this.#tenant, \"x-version\": this.#version });\n if (token) headers.set(\"Authorization\", `Bearer ${token}`);\n return headers;\n }\n\n async #read(response: Response, operation: string, allowText = false): Promise<unknown> {\n if (!response.ok) {\n const requestId = response.headers.get(\"x-request-id\") ?? response.headers.get(\"request-id\") ?? undefined;\n const wait = retryAfter(response.headers);\n let responseBody: string | undefined;\n // Retain raw content only by explicit opt-in, never for authentication or throttling.\n if (this.#captureErrorBody && operation !== \"POST /authentication/SetAuthKey\" && ![401, 403, 429].includes(response.status)) {\n try { responseBody = await response.text(); } catch { /* Keep the HTTP failure if diagnostic reading fails. */ }\n } else await response.body?.cancel();\n if (response.status === 429) throw new ThrottledError(operation, wait ?? this.#retryBase, response.status, requestId);\n if (response.status === 401 || response.status === 403) throw new AuthError(operation, response.status);\n throw new UpstreamError(operation, response.status, requestId, wait, responseBody);\n }\n const text = await response.text();\n if (!text.trim()) return null;\n let value: unknown;\n try { value = JSON.parse(text); }\n catch {\n if (allowText) return text;\n throw new WellSkyError(\"protocol\", operation);\n }\n this.#checkTenant(value, operation);\n return value;\n }\n\n async #mint(forceRefresh: boolean, shared: SharedAuthentication): Promise<string> {\n const operation = \"POST /authentication/SetAuthKey\";\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new DOMException(\"Deadline exceeded\", \"TimeoutError\")), this.#timeout);\n const signal = controller.signal;\n let release: (() => void) | undefined;\n try {\n release = await tokenMintQueue.acquire(signal, operation);\n this.#control.check(operation);\n const correlationId = crypto.randomUUID();\n this.#control.tokenMintCount++;\n emit(this.#observers, { type: \"tokenMint\", operation, correlationId, retryCount: 0 });\n let token: unknown;\n if (this.#auth.kind === \"provider\") token = await withSignal(Promise.resolve().then(() => this.#auth.kind === \"provider\" ? this.#auth.getToken({ forceRefresh, signal }) : \"\"), signal, operation);\n else if (this.#auth.kind === \"credentials\") {\n const headers = this.#headers();\n headers.set(\"Content-Type\", \"application/json\");\n const response = await this.#send(`${this.#baseUrl}/authentication/SetAuthKey`, {\n method: \"POST\", headers, body: JSON.stringify({ username: this.#auth.username, password: this.#auth.password }), signal, redirect: \"error\", cache: \"no-store\",\n }, operation, correlationId, 0);\n const result = await this.#read(response, operation);\n token = isRecord(result) ? result.token : undefined;\n }\n if (typeof token !== \"string\" || !token || /\\s/.test(token)) throw new WellSkyError(\"protocol\", operation);\n this.#checkTokenTenant(token);\n const expiresAt = expiry(token);\n if (expiresAt !== 0 && expiresAt <= Date.now()) throw new WellSkyError(\"protocol\", operation);\n shared.cached = { token, expiresAt };\n return token;\n } catch (error) {\n if (signal.aborted) throw abortError(signal, operation);\n if (error instanceof WellSkyError) throw error;\n throw new WellSkyError(\"network\", operation);\n } finally { release?.(); clearTimeout(timer); }\n }\n\n async #token(rejectedToken?: string): Promise<string | undefined> {\n if (this.#auth.kind === \"none\") return Promise.resolve(undefined);\n if (this.#auth.kind === \"token\") return Promise.resolve(this.#auth.token);\n const shared = await this.#shared;\n // An older request's late 401 must not evict a newer token.\n if (rejectedToken && shared.cached?.token !== rejectedToken && shared.cached) return shared.cached.token;\n if (shared.inFlight) return shared.inFlight;\n if (!rejectedToken && shared.cached && shared.cached.expiresAt > Date.now() + 120_000) return shared.cached.token;\n shared.cached = undefined;\n shared.inFlight = this.#mint(Boolean(rejectedToken), shared).finally(() => { shared.inFlight = undefined; });\n return shared.inFlight;\n }\n\n async execute<T>(definition: OperationDefinition, args: Arguments): Promise<T> {\n const operation = `${definition.method} ${definition.path}`;\n const correlationId = args.correlationId ?? crypto.randomUUID();\n if (!/^[A-Za-z0-9_.:-]{1,128}$/.test(correlationId)) throw new ValidationError(operation, [\"correlationId\"]);\n const timeout = positiveInteger(args.timeoutMs ?? this.#timeout, \"timeoutMs\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(new DOMException(\"Deadline exceeded\", \"TimeoutError\")), timeout);\n const signal = args.signal ? AbortSignal.any([args.signal, controller.signal]) : controller.signal;\n try {\n if (signal.aborted) throw abortError(signal, operation);\n this.#control.check(operation);\n if (!matches(args.path ?? {}, definition.pathSchema, this.#schemas, \"request\") || !matches(args.query ?? {}, definition.querySchema, this.#schemas, \"request\") || (definition.bodySchema && !matches(args.body, definition.bodySchema, this.#schemas, \"request\"))) throw new ValidationError(operation);\n // Check file bytes before multipart construction or credential authentication.\n if (definition.multipart && isRecord(args.body) && args.body.fileData instanceof Blob && args.body.fileData.size > 10_000_000) throw new ValidationError(operation, [\"fileData\"]);\n const pathValues = new Map(Object.entries(args.path ?? {}));\n const path = definition.path.replace(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = String(pathValues.get(name));\n if (value === \".\" || value === \"..\") throw new WellSkyError(\"validation\", operation);\n return encodeURIComponent(value);\n });\n const url = new URL(this.#baseUrl + path);\n for (const [name, value] of Object.entries(args.query ?? {})) {\n if (value !== undefined && value !== null) {\n const encoded = this.#mobileDateCorrection !== undefined && name === \"dateEffective\" && operation === \"POST /assessmentsmobile/AddAssessmentAnswer/{clientId}/{assessmentCode}\"\n ? correctMobileEffectiveDate(value, this.#mobileDateCorrection, operation) : String(value);\n url.searchParams.set(name, encoded);\n }\n }\n let body: string | FormData | undefined;\n if (definition.multipart && isRecord(args.body)) {\n body = new FormData();\n for (const [name, value] of Object.entries(args.body)) {\n if (value !== undefined && value !== null) body.append(name, value instanceof Blob ? value : String(value));\n }\n } else if (args.body !== undefined) body = JSON.stringify(args.body);\n let token = definition.authenticated ? await withSignal(this.#token(), signal, operation) : undefined;\n let refreshed = false;\n let attempts = 0;\n while (true) {\n try {\n const headers = this.#headers(token);\n if (typeof body === \"string\") headers.set(\"Content-Type\", \"application/json\");\n const response = await this.#send(url, { method: definition.method, headers, ...(body === undefined ? {} : { body }), signal, redirect: \"error\", cache: \"no-store\" }, operation, correlationId, attempts);\n // Reads can refresh once. Writes are never automatically sent twice, even after a 401.\n if (response.status === 401 && definition.method === \"GET\" && definition.authenticated && !refreshed && (this.#auth.kind === \"credentials\" || this.#auth.kind === \"provider\")) {\n await response.body?.cancel();\n refreshed = true;\n token = await withSignal(this.#token(token), signal, operation);\n continue;\n }\n const result = await this.#read(response, operation, definition.responseSchema === undefined);\n return decodeResponse<T>(result, definition.responseSchema, this.#schemas, operation);\n } catch (error) {\n if (signal.aborted) throw abortError(signal, operation);\n const failure = error instanceof WellSkyError ? error : new WellSkyError(\"network\", operation);\n const retryable = failure.kind === \"network\" || ((failure.kind === \"http\" || failure.kind === \"throttled\") && retryStatuses.has(failure.status ?? 0));\n if (definition.method !== \"GET\" || failure.operation !== operation || !retryable || attempts >= this.#retries) throw failure;\n const wait = failure.retryAfterMs ?? Math.min(this.#retryMax, this.#retryBase * 2 ** attempts * (1 + Math.random() * 0.2));\n // Never retry earlier than Retry-After. Return the error if the delay exceeds our bound.\n if (wait > this.#retryMax) throw failure;\n attempts++;\n await delay(wait, signal, operation);\n }\n }\n } catch (error) {\n if (signal.aborted) { const error = abortError(signal, operation); error.correlationId = correlationId; throw error; }\n if (error instanceof WellSkyError) error.correlationId = correlationId;\n if (error instanceof WellSkyError || error instanceof TypeError) throw error;\n throw new WellSkyError(\"network\", operation);\n } finally { clearTimeout(timer); }\n }\n\n async *paginate<T>(definition: OperationDefinition, args: Arguments & PaginationOptions): AsyncGenerator<T> {\n const operation = `${definition.method} ${definition.path}`;\n const query = Object.fromEntries(Object.entries(args.query ?? {}));\n const start = positiveInteger(typeof query.startPage === \"number\" ? query.startPage : 1, \"startPage\");\n positiveInteger(typeof query.perPage === \"number\" ? query.perPage : 30, \"perPage\");\n const maxPages = positiveInteger(args.maxPages ?? 10_000, \"maxPages\");\n for (let page = 0; page < maxPages; page++) {\n const response = await this.execute<ApiResponse<T>>(definition, { ...args, query: { perPage: 30, ...query, startPage: start + page } });\n const items = toItems(response);\n if (!items.length) return;\n yield* items;\n // Continue through short pages: some tenants cap perPage below the requested size.\n }\n throw new WellSkyError(\"pagination\", operation);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/encoding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAK1F,MAAM,MAAM,WAAW,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AACzF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAC7K,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAClD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;IACjD,0GAA0G;IAC1G,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,KAAK,MAAM,GAAG,SAAS,CAAC;IAC1F,wGAAwG;IACxG,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC;CAClF;AACD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AA2DD,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,kBAAkB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,eAAe,EAAE,CAgBrI;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG;IAAE,cAAc,EAAE,eAAe,EAAE,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/encoding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAK1F,MAAM,MAAM,WAAW,GAAG,oBAAoB,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AACzF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAE,CAAC;AAC7K,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAClD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;IACjD,0GAA0G;IAC1G,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,KAAK,MAAM,GAAG,SAAS,CAAC;IAC1F,wGAAwG;IACxG,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC;CAClF;AACD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AA2DD,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,kBAAkB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,eAAe,EAAE,CAgBrI;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG;IAAE,cAAc,EAAE,eAAe,EAAE,CAAA;CAAE,CAWvJ"}
|
package/dist/esm/encoding.js
CHANGED
|
@@ -106,10 +106,11 @@ export function encodeNewSubassessmentRow(parent, answers, options) {
|
|
|
106
106
|
const encoded = encodeAnswers(parent.children, answers, options);
|
|
107
107
|
const included = new Set(encoded.map(q => q.virt_field_name));
|
|
108
108
|
for (const question of parent.children) {
|
|
109
|
+
// An unanswered provider child is omitted; answered ones are still refused for mobile in encodeValue.
|
|
109
110
|
if (!question.fieldName || included.has(question.fieldName) || ["label", "blank", "yes_no"].includes(question.questionType))
|
|
110
111
|
continue;
|
|
111
112
|
if (question.questionType === "provider" && options.endpoint === "mobile")
|
|
112
|
-
|
|
113
|
+
continue;
|
|
113
114
|
encoded.push({ question_id: question.questionId, question_type: question.questionType, virt_field_name: question.fieldName, answer_value: "" });
|
|
114
115
|
}
|
|
115
116
|
return { subAssessments: encoded };
|
package/dist/esm/encoding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/encoding.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PicklistOption, PicklistSelector, QuestionDefinition } from \"./metadata.js\";\nimport { resolvePicklistOption } from \"./metadata.js\";\nimport { ValidationError } from \"./errors.js\";\nimport { resolveRaceCombination } from \"./race.js\";\n\nexport type AnswerState = \"client_doesnt_know\" | \"client_refused\" | \"data_not_collected\";\nexport type AnswerValue = { value: string | number | boolean | string[] } | { state: AnswerState } | { option: PicklistSelector } | { options: readonly PicklistSelector[] };\nexport type Answers = Record<string, AnswerValue>;\nexport interface EncodingOptions {\n endpoint: \"standalone\" | \"enrollment\" | \"mobile\";\n /** Tenant-verified display labels, including exact whitespace/HUD suffixes, for label-based endpoints. */\n writeLabel?: (question: QuestionDefinition, option: PicklistOption) => string | undefined;\n /** Application configuration supplies the relevant option codes. No answer-state labels are guessed. */\n stateCodes?: Partial<Record<AnswerState, readonly string[]>>;\n multiValue?: (question: QuestionDefinition, values: readonly string[]) => string;\n}\nexport interface EncodedQuestion {\n question_id: number;\n question_type: string;\n virt_field_name: string;\n answer_value: string;\n}\n\nfunction encodeValue(question: QuestionDefinition, answer: AnswerValue, options: EncodingOptions): string | undefined {\n const field = question.fieldName ?? `#${question.questionId}`;\n if ([\"label\", \"blank\", \"sub_assessment\"].includes(question.questionType)) throw new ValidationError(\"assessment encoding\", [field]);\n if (question.questionType === \"provider\" && options.endpoint === \"mobile\") throw new ValidationError(\"mobile provider answers are unsupported\", [field]);\n if (\"state\" in answer) {\n if (question.questionType !== \"lookup\") return undefined;\n const codes = options.stateCodes?.[answer.state];\n if (!codes) throw new ValidationError(\"answer-state code configuration required\", [field]);\n const found = question.options.filter(option => option.code !== null && codes.includes(option.code));\n if (!found.length) return undefined;\n if (found.length !== 1 || !found[0]) throw new ValidationError(\"ambiguous answer-state option\", [field]);\n const option = question.fieldName === \"HUD_RACEETHNICITY\" && found[0].code !== null\n ? resolveRaceCombination(question, [{ code: found[0].code }]) : found[0];\n return lookupLabel(question, option, options);\n }\n if (question.questionType === \"lookup\") {\n if (question.fieldName === \"HUD_RACEETHNICITY\") {\n const selectors = \"options\" in answer ? answer.options : \"option\" in answer ? [answer.option]\n : typeof answer.value === \"string\" ? [{ name: answer.value }]\n : Array.isArray(answer.value) ? answer.value.map(name => ({ name })) : undefined;\n if (!selectors) throw new ValidationError(\"race requires category selectors\", [field]);\n return lookupLabel(question, resolveRaceCombination(question, selectors), options);\n }\n if (\"options\" in answer) throw new ValidationError(\"multiple options require a supported combination field\", [field]);\n if (\"option\" in answer) return lookupLabel(question, resolvePicklistOption(question, answer.option), options);\n if (typeof answer.value !== \"string\") throw new ValidationError(\"lookup requires a code or name selector\", [field]);\n return lookupLabel(question, resolvePicklistOption(question, { name: answer.value }), options);\n }\n if (!(\"value\" in answer)) throw new ValidationError(\"picklist selector on a non-lookup question\", [field]);\n const value = answer.value;\n if (Array.isArray(value)) {\n if (!options.multiValue) throw new ValidationError(\"multi-value encoding requires an explicit encoder\", [field]);\n return options.multiValue(question, value);\n }\n switch (question.questionType) {\n case \"yes_no\":\n if (value === true || value === \"Yes\") return \"Yes\";\n if (value === false || value === \"No\") return \"No\";\n throw new ValidationError(\"yes_no encoding\", [field]);\n case \"int\": case \"provider\":\n if ((typeof value !== \"number\" && typeof value !== \"string\") || value === \"\" || !Number.isSafeInteger(Number(value))) throw new ValidationError(\"integer encoding\", [field]);\n return String(value);\n case \"money\":\n if ((typeof value !== \"number\" && typeof value !== \"string\") || value === \"\" || !Number.isFinite(Number(value))) throw new ValidationError(\"money encoding\", [field]);\n return String(value);\n case \"date\": case \"textbox\": case \"textarea\": return String(value);\n default: throw new ValidationError(\"unsupported question type\", [field]);\n }\n}\n\nfunction lookupLabel(question: QuestionDefinition, option: PicklistOption, options: EncodingOptions): string {\n if (options.endpoint === \"mobile\") return String(option.id);\n const label = options.writeLabel?.(question, option);\n if (!label) throw new ValidationError(\"verified lookup write label required\", [question.fieldName ?? `#${question.questionId}`]);\n return label;\n}\n\nexport function encodeAnswers(questions: readonly QuestionDefinition[], answers: Answers, options: EncodingOptions): EncodedQuestion[] {\n const index = new Map<string, QuestionDefinition>();\n for (const question of questions) if (question.fieldName) {\n if (index.has(question.fieldName)) throw new ValidationError(\"ambiguous question field\", [question.fieldName]);\n index.set(question.fieldName, question);\n }\n const unknown = Object.keys(answers).filter(field => !index.has(field));\n if (unknown.length) throw new ValidationError(\"unknown assessment fields\", unknown);\n const result: EncodedQuestion[] = [];\n for (const [field, answer] of Object.entries(answers)) {\n const question = index.get(field);\n if (!question) throw new ValidationError(\"unknown assessment fields\", [field]);\n const value = encodeValue(question, answer, options);\n if (value !== undefined) result.push({ question_id: question.questionId, question_type: question.questionType, virt_field_name: field, answer_value: value });\n }\n return result;\n}\n\n/** Builds one new row only. Never accepts or echoes an existing recordset ID. */\nexport function encodeNewSubassessmentRow(parent: QuestionDefinition, answers: Answers, options: EncodingOptions): { subAssessments: EncodedQuestion[] } {\n if (parent.questionType !== \"sub_assessment\") throw new ValidationError(\"subassessment parent required\");\n const encoded = encodeAnswers(parent.children, answers, options);\n const included = new Set(encoded.map(q => q.virt_field_name));\n for (const question of parent.children) {\n if (!question.fieldName || included.has(question.fieldName) || [\"label\", \"blank\", \"yes_no\"].includes(question.questionType)) continue;\n if (question.questionType === \"provider\" && options.endpoint === \"mobile\") throw new ValidationError(\"mobile provider answers are unsupported\", [question.fieldName]);\n encoded.push({ question_id: question.questionId, question_type: question.questionType, virt_field_name: question.fieldName, answer_value: \"\" });\n }\n return { subAssessments: encoded };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/encoding.ts"],"names":[],"mappings":"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","sourcesContent":["import type { PicklistOption, PicklistSelector, QuestionDefinition } from \"./metadata.js\";\nimport { resolvePicklistOption } from \"./metadata.js\";\nimport { ValidationError } from \"./errors.js\";\nimport { resolveRaceCombination } from \"./race.js\";\n\nexport type AnswerState = \"client_doesnt_know\" | \"client_refused\" | \"data_not_collected\";\nexport type AnswerValue = { value: string | number | boolean | string[] } | { state: AnswerState } | { option: PicklistSelector } | { options: readonly PicklistSelector[] };\nexport type Answers = Record<string, AnswerValue>;\nexport interface EncodingOptions {\n endpoint: \"standalone\" | \"enrollment\" | \"mobile\";\n /** Tenant-verified display labels, including exact whitespace/HUD suffixes, for label-based endpoints. */\n writeLabel?: (question: QuestionDefinition, option: PicklistOption) => string | undefined;\n /** Application configuration supplies the relevant option codes. No answer-state labels are guessed. */\n stateCodes?: Partial<Record<AnswerState, readonly string[]>>;\n multiValue?: (question: QuestionDefinition, values: readonly string[]) => string;\n}\nexport interface EncodedQuestion {\n question_id: number;\n question_type: string;\n virt_field_name: string;\n answer_value: string;\n}\n\nfunction encodeValue(question: QuestionDefinition, answer: AnswerValue, options: EncodingOptions): string | undefined {\n const field = question.fieldName ?? `#${question.questionId}`;\n if ([\"label\", \"blank\", \"sub_assessment\"].includes(question.questionType)) throw new ValidationError(\"assessment encoding\", [field]);\n if (question.questionType === \"provider\" && options.endpoint === \"mobile\") throw new ValidationError(\"mobile provider answers are unsupported\", [field]);\n if (\"state\" in answer) {\n if (question.questionType !== \"lookup\") return undefined;\n const codes = options.stateCodes?.[answer.state];\n if (!codes) throw new ValidationError(\"answer-state code configuration required\", [field]);\n const found = question.options.filter(option => option.code !== null && codes.includes(option.code));\n if (!found.length) return undefined;\n if (found.length !== 1 || !found[0]) throw new ValidationError(\"ambiguous answer-state option\", [field]);\n const option = question.fieldName === \"HUD_RACEETHNICITY\" && found[0].code !== null\n ? resolveRaceCombination(question, [{ code: found[0].code }]) : found[0];\n return lookupLabel(question, option, options);\n }\n if (question.questionType === \"lookup\") {\n if (question.fieldName === \"HUD_RACEETHNICITY\") {\n const selectors = \"options\" in answer ? answer.options : \"option\" in answer ? [answer.option]\n : typeof answer.value === \"string\" ? [{ name: answer.value }]\n : Array.isArray(answer.value) ? answer.value.map(name => ({ name })) : undefined;\n if (!selectors) throw new ValidationError(\"race requires category selectors\", [field]);\n return lookupLabel(question, resolveRaceCombination(question, selectors), options);\n }\n if (\"options\" in answer) throw new ValidationError(\"multiple options require a supported combination field\", [field]);\n if (\"option\" in answer) return lookupLabel(question, resolvePicklistOption(question, answer.option), options);\n if (typeof answer.value !== \"string\") throw new ValidationError(\"lookup requires a code or name selector\", [field]);\n return lookupLabel(question, resolvePicklistOption(question, { name: answer.value }), options);\n }\n if (!(\"value\" in answer)) throw new ValidationError(\"picklist selector on a non-lookup question\", [field]);\n const value = answer.value;\n if (Array.isArray(value)) {\n if (!options.multiValue) throw new ValidationError(\"multi-value encoding requires an explicit encoder\", [field]);\n return options.multiValue(question, value);\n }\n switch (question.questionType) {\n case \"yes_no\":\n if (value === true || value === \"Yes\") return \"Yes\";\n if (value === false || value === \"No\") return \"No\";\n throw new ValidationError(\"yes_no encoding\", [field]);\n case \"int\": case \"provider\":\n if ((typeof value !== \"number\" && typeof value !== \"string\") || value === \"\" || !Number.isSafeInteger(Number(value))) throw new ValidationError(\"integer encoding\", [field]);\n return String(value);\n case \"money\":\n if ((typeof value !== \"number\" && typeof value !== \"string\") || value === \"\" || !Number.isFinite(Number(value))) throw new ValidationError(\"money encoding\", [field]);\n return String(value);\n case \"date\": case \"textbox\": case \"textarea\": return String(value);\n default: throw new ValidationError(\"unsupported question type\", [field]);\n }\n}\n\nfunction lookupLabel(question: QuestionDefinition, option: PicklistOption, options: EncodingOptions): string {\n if (options.endpoint === \"mobile\") return String(option.id);\n const label = options.writeLabel?.(question, option);\n if (!label) throw new ValidationError(\"verified lookup write label required\", [question.fieldName ?? `#${question.questionId}`]);\n return label;\n}\n\nexport function encodeAnswers(questions: readonly QuestionDefinition[], answers: Answers, options: EncodingOptions): EncodedQuestion[] {\n const index = new Map<string, QuestionDefinition>();\n for (const question of questions) if (question.fieldName) {\n if (index.has(question.fieldName)) throw new ValidationError(\"ambiguous question field\", [question.fieldName]);\n index.set(question.fieldName, question);\n }\n const unknown = Object.keys(answers).filter(field => !index.has(field));\n if (unknown.length) throw new ValidationError(\"unknown assessment fields\", unknown);\n const result: EncodedQuestion[] = [];\n for (const [field, answer] of Object.entries(answers)) {\n const question = index.get(field);\n if (!question) throw new ValidationError(\"unknown assessment fields\", [field]);\n const value = encodeValue(question, answer, options);\n if (value !== undefined) result.push({ question_id: question.questionId, question_type: question.questionType, virt_field_name: field, answer_value: value });\n }\n return result;\n}\n\n/** Builds one new row only. Never accepts or echoes an existing recordset ID. */\nexport function encodeNewSubassessmentRow(parent: QuestionDefinition, answers: Answers, options: EncodingOptions): { subAssessments: EncodedQuestion[] } {\n if (parent.questionType !== \"sub_assessment\") throw new ValidationError(\"subassessment parent required\");\n const encoded = encodeAnswers(parent.children, answers, options);\n const included = new Set(encoded.map(q => q.virt_field_name));\n for (const question of parent.children) {\n // An unanswered provider child is omitted; answered ones are still refused for mobile in encodeValue.\n if (!question.fieldName || included.has(question.fieldName) || [\"label\", \"blank\", \"yes_no\"].includes(question.questionType)) continue;\n if (question.questionType === \"provider\" && options.endpoint === \"mobile\") continue;\n encoded.push({ question_id: question.questionId, question_type: question.questionType, virt_field_name: question.fieldName, answer_value: \"\" });\n }\n return { subAssessments: encoded };\n}\n"]}
|
package/dist/esm/errors.d.ts
CHANGED
|
@@ -17,7 +17,10 @@ export declare class ValidationError extends WellSkyError {
|
|
|
17
17
|
constructor(operation: string, fields?: readonly string[]);
|
|
18
18
|
}
|
|
19
19
|
export declare class UpstreamError extends WellSkyError {
|
|
20
|
-
|
|
20
|
+
/** Opt-in private diagnostics; non-enumerable and absent by default. */
|
|
21
|
+
readonly responseBody?: string;
|
|
22
|
+
readonly responseBodyTruncated?: boolean;
|
|
23
|
+
constructor(operation: string, status: number, requestId?: string, retryAfterMs?: number, responseBody?: string);
|
|
21
24
|
}
|
|
22
25
|
export declare class AmbiguousCommitError extends WellSkyError {
|
|
23
26
|
constructor(operation: string);
|
package/dist/esm/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,SAAS,EAAE,MAAM;CAC9B;AACD,qBAAa,SAAU,SAAQ,YAAY;gBAC7B,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAC/C;AACD,qBAAa,cAAe,SAAQ,YAAY;gBAClC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CACtF;AACD,qBAAa,aAAc,SAAQ,YAAY;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACX,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAC7C;AACD,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;gBACvB,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,MAAM,EAAO;CAC9D;AACD,qBAAa,aAAc,SAAQ,YAAY;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,SAAS,EAAE,MAAM;CAC9B;AACD,qBAAa,SAAU,SAAQ,YAAY;gBAC7B,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAC/C;AACD,qBAAa,cAAe,SAAQ,YAAY;gBAClC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CACtF;AACD,qBAAa,aAAc,SAAQ,YAAY;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACX,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAC7C;AACD,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;gBACvB,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,SAAS,MAAM,EAAO;CAC9D;AACD,qBAAa,aAAc,SAAQ,YAAY;IAC7C,wEAAwE;IACxE,SAAiB,YAAY,CAAC,EAAE,MAAM,CAAC;IACvC,SAAiB,qBAAqB,CAAC,EAAE,OAAO,CAAC;gBACrC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAOhH;AACD,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,SAAS,EAAE,MAAM;CAC9B;AACD,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;gBACvB,MAAM,EAAE,SAAS,MAAM,EAAE;CACtC;AACD,qBAAa,yBAA0B,SAAQ,YAAY;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBACX,KAAK,EAAE,MAAM;CAC1B"}
|
package/dist/esm/errors.js
CHANGED
|
@@ -17,7 +17,15 @@ export class ValidationError extends WellSkyError {
|
|
|
17
17
|
constructor(operation, fields = []) { super("validation", operation); this.name = "ValidationError"; this.fields = [...fields]; }
|
|
18
18
|
}
|
|
19
19
|
export class UpstreamError extends WellSkyError {
|
|
20
|
-
constructor(operation, status, requestId, retryAfterMs
|
|
20
|
+
constructor(operation, status, requestId, retryAfterMs, responseBody) {
|
|
21
|
+
super("http", operation, { status, ...(requestId === undefined ? {} : { requestId }), ...(retryAfterMs === undefined ? {} : { retryAfterMs }) });
|
|
22
|
+
this.name = "UpstreamError";
|
|
23
|
+
if (responseBody !== undefined)
|
|
24
|
+
Object.defineProperties(this, {
|
|
25
|
+
responseBody: { value: responseBody.slice(0, 16384), enumerable: false },
|
|
26
|
+
responseBodyTruncated: { value: responseBody.length > 16384, enumerable: false },
|
|
27
|
+
});
|
|
28
|
+
}
|
|
21
29
|
}
|
|
22
30
|
export class AmbiguousCommitError extends WellSkyError {
|
|
23
31
|
constructor(operation) { super("ambiguous_commit", operation); this.name = "AmbiguousCommitError"; }
|
package/dist/esm/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IACnD,YAAY,SAAiB,IAAI,KAAK,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC,CAAC,CAAC;CAC3G;AACD,MAAM,OAAO,SAAU,SAAQ,YAAY;IACzC,YAAY,SAAiB,EAAE,MAAe,IAAI,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC;CAC/I;AACD,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC9C,YAAY,SAAiB,EAAE,YAAoB,EAAE,MAAM,GAAG,GAAG,EAAE,SAAkB,IAAI,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC;CACrO;AACD,MAAM,OAAO,aAAc,SAAQ,YAAY;IACpC,KAAK,CAAS;IACvB,YAAY,SAAiB,EAAE,KAAa,IAAI,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;CACzJ;AACD,MAAM,OAAO,eAAgB,SAAQ,YAAY;IACtC,MAAM,CAAoB;IACnC,YAAY,SAAiB,EAAE,SAA4B,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;CAC7J;AACD,MAAM,OAAO,aAAc,SAAQ,YAAY;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { WellSkyError } from \"./runtime.js\";\n\nexport class TenantMismatchError extends WellSkyError {\n constructor(operation: string) { super(\"tenant_mismatch\", operation); this.name = \"TenantMismatchError\"; }\n}\nexport class AuthError extends WellSkyError {\n constructor(operation: string, status?: number) { super(\"auth\", operation, status === undefined ? {} : { status }); this.name = \"AuthError\"; }\n}\nexport class ThrottledError extends WellSkyError {\n constructor(operation: string, retryAfterMs: number, status = 429, requestId?: string) { super(\"throttled\", operation, { status, retryAfterMs, ...(requestId === undefined ? {} : { requestId }) }); this.name = \"ThrottledError\"; }\n}\nexport class CooldownError extends WellSkyError {\n readonly until: string;\n constructor(operation: string, until: number) { super(\"cooldown\", operation); this.name = \"CooldownError\"; this.until = new Date(until).toISOString(); }\n}\nexport class ValidationError extends WellSkyError {\n readonly fields: readonly string[];\n constructor(operation: string, fields: readonly string[] = []) { super(\"validation\", operation); this.name = \"ValidationError\"; this.fields = [...fields]; }\n}\nexport class UpstreamError extends WellSkyError {\n /** Opt-in private diagnostics; non-enumerable and absent by default. */\n declare readonly responseBody?: string;\n declare readonly responseBodyTruncated?: boolean;\n constructor(operation: string, status: number, requestId?: string, retryAfterMs?: number, responseBody?: string) {\n super(\"http\", operation, { status, ...(requestId === undefined ? {} : { requestId }), ...(retryAfterMs === undefined ? {} : { retryAfterMs }) }); this.name = \"UpstreamError\";\n if (responseBody !== undefined) Object.defineProperties(this, {\n responseBody: { value: responseBody.slice(0, 16384), enumerable: false },\n responseBodyTruncated: { value: responseBody.length > 16384, enumerable: false },\n });\n }\n}\nexport class AmbiguousCommitError extends WellSkyError {\n constructor(operation: string) { super(\"ambiguous_commit\", operation); this.name = \"AmbiguousCommitError\"; }\n}\nexport class DefinitionDriftError extends WellSkyError {\n readonly fields: readonly string[];\n constructor(fields: readonly string[]) { super(\"definition_drift\", \"assessment metadata\"); this.name = \"DefinitionDriftError\"; this.fields = [...fields]; }\n}\nexport class UnknownPicklistValueError extends WellSkyError {\n readonly field: string;\n constructor(field: string) { super(\"unknown_picklist_value\", \"picklist resolution\"); this.name = \"UnknownPicklistValueError\"; this.field = field; }\n}\n"]}
|
package/dist/esm/runtime.d.ts
CHANGED
|
@@ -33,6 +33,10 @@ export interface ClientOptions {
|
|
|
33
33
|
* Added to the requested instant on POST AddAssessmentAnswer only. No default timezone is assumed.
|
|
34
34
|
* Revalidate against saved effective dates when the server's offset changes. */
|
|
35
35
|
mobileAssessmentDateCorrectionMinutes?: number;
|
|
36
|
+
/** Opt in to retaining up to 16384 characters of an UpstreamError response body.
|
|
37
|
+
* May contain private data. Excluded from JSON serialization and ordinary telemetry.
|
|
38
|
+
* Authentication and throttle error bodies are never retained. */
|
|
39
|
+
captureErrorBody?: boolean;
|
|
36
40
|
/** Defaults to the public production API URL. Supply the target environment explicitly when needed. */
|
|
37
41
|
baseUrl?: string;
|
|
38
42
|
/** Inject a fetch-compatible transport for tests or network routing. */
|
|
@@ -91,7 +95,7 @@ export interface CountedCollection<T> {
|
|
|
91
95
|
export type ApiResponse<T> = T | T[] | ODataCollection<T> | CountedCollection<T> | null;
|
|
92
96
|
export declare function toItems<T>(response: ApiResponse<T>): T[];
|
|
93
97
|
export type ErrorKind = "http" | "network" | "timeout" | "aborted" | "validation" | "protocol" | "pagination" | "tenant_mismatch" | "auth" | "throttled" | "cooldown" | "ambiguous_commit" | "definition_drift" | "unknown_picklist_value";
|
|
94
|
-
/** Deliberately contains no credentials, query values,
|
|
98
|
+
/** Deliberately contains no credentials, query values, or client IDs, and no response body unless `captureErrorBody` is enabled (then non-enumerable). */
|
|
95
99
|
export declare class WellSkyError extends Error {
|
|
96
100
|
readonly kind: ErrorKind;
|
|
97
101
|
readonly status: number | undefined;
|