@financeable/lenders 0.5.4 → 0.5.6

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.
Files changed (119) hide show
  1. package/README.md +11 -7
  2. package/bin/mcp-server.js +30 -20
  3. package/bin/mcp-server.js.map +16 -16
  4. package/dist/commonjs/funcs/createCommercialSubmission.d.ts.map +1 -1
  5. package/dist/commonjs/funcs/createCommercialSubmission.js +2 -1
  6. package/dist/commonjs/funcs/createCommercialSubmission.js.map +1 -1
  7. package/dist/commonjs/funcs/createConsumerSubmission.d.ts.map +1 -1
  8. package/dist/commonjs/funcs/createConsumerSubmission.js +2 -1
  9. package/dist/commonjs/funcs/createConsumerSubmission.js.map +1 -1
  10. package/dist/commonjs/funcs/createDocumentsSubmission.d.ts.map +1 -1
  11. package/dist/commonjs/funcs/createDocumentsSubmission.js +2 -1
  12. package/dist/commonjs/funcs/createDocumentsSubmission.js.map +1 -1
  13. package/dist/commonjs/funcs/createPersonalSubmission.d.ts.map +1 -1
  14. package/dist/commonjs/funcs/createPersonalSubmission.js +2 -1
  15. package/dist/commonjs/funcs/createPersonalSubmission.js.map +1 -1
  16. package/dist/commonjs/lib/config.d.ts +3 -3
  17. package/dist/commonjs/lib/config.js +3 -3
  18. package/dist/commonjs/lib/encodings.d.ts +1 -0
  19. package/dist/commonjs/lib/encodings.d.ts.map +1 -1
  20. package/dist/commonjs/lib/encodings.js +27 -5
  21. package/dist/commonjs/lib/encodings.js.map +1 -1
  22. package/dist/commonjs/lib/files.d.ts +13 -0
  23. package/dist/commonjs/lib/files.d.ts.map +1 -1
  24. package/dist/commonjs/lib/files.js +19 -0
  25. package/dist/commonjs/lib/files.js.map +1 -1
  26. package/dist/commonjs/lib/matchers.d.ts.map +1 -1
  27. package/dist/commonjs/lib/matchers.js +0 -1
  28. package/dist/commonjs/lib/matchers.js.map +1 -1
  29. package/dist/commonjs/lib/sdks.d.ts +1 -1
  30. package/dist/commonjs/lib/sdks.d.ts.map +1 -1
  31. package/dist/commonjs/lib/sdks.js +10 -6
  32. package/dist/commonjs/lib/sdks.js.map +1 -1
  33. package/dist/commonjs/lib/security.d.ts.map +1 -1
  34. package/dist/commonjs/lib/security.js +1 -2
  35. package/dist/commonjs/lib/security.js.map +1 -1
  36. package/dist/commonjs/lib/url.d.ts.map +1 -1
  37. package/dist/commonjs/lib/url.js +4 -2
  38. package/dist/commonjs/lib/url.js.map +1 -1
  39. package/dist/commonjs/mcp-server/mcp-server.js +1 -1
  40. package/dist/commonjs/mcp-server/server.js +1 -1
  41. package/dist/commonjs/mcp-server/shared.js +1 -1
  42. package/dist/commonjs/mcp-server/shared.js.map +1 -1
  43. package/dist/commonjs/models/components/consumerincometypes.d.ts +1 -0
  44. package/dist/commonjs/models/components/consumerincometypes.d.ts.map +1 -1
  45. package/dist/commonjs/models/components/consumerincometypes.js +1 -0
  46. package/dist/commonjs/models/components/consumerincometypes.js.map +1 -1
  47. package/dist/commonjs/models/components/customerprofile.d.ts +2 -0
  48. package/dist/commonjs/models/components/customerprofile.d.ts.map +1 -1
  49. package/dist/commonjs/models/components/customerprofile.js +2 -0
  50. package/dist/commonjs/models/components/customerprofile.js.map +1 -1
  51. package/dist/esm/funcs/createCommercialSubmission.d.ts.map +1 -1
  52. package/dist/esm/funcs/createCommercialSubmission.js +2 -1
  53. package/dist/esm/funcs/createCommercialSubmission.js.map +1 -1
  54. package/dist/esm/funcs/createConsumerSubmission.d.ts.map +1 -1
  55. package/dist/esm/funcs/createConsumerSubmission.js +2 -1
  56. package/dist/esm/funcs/createConsumerSubmission.js.map +1 -1
  57. package/dist/esm/funcs/createDocumentsSubmission.d.ts.map +1 -1
  58. package/dist/esm/funcs/createDocumentsSubmission.js +2 -1
  59. package/dist/esm/funcs/createDocumentsSubmission.js.map +1 -1
  60. package/dist/esm/funcs/createPersonalSubmission.d.ts.map +1 -1
  61. package/dist/esm/funcs/createPersonalSubmission.js +2 -1
  62. package/dist/esm/funcs/createPersonalSubmission.js.map +1 -1
  63. package/dist/esm/lib/config.d.ts +3 -3
  64. package/dist/esm/lib/config.js +3 -3
  65. package/dist/esm/lib/encodings.d.ts +1 -0
  66. package/dist/esm/lib/encodings.d.ts.map +1 -1
  67. package/dist/esm/lib/encodings.js +26 -5
  68. package/dist/esm/lib/encodings.js.map +1 -1
  69. package/dist/esm/lib/files.d.ts +13 -0
  70. package/dist/esm/lib/files.d.ts.map +1 -1
  71. package/dist/esm/lib/files.js +18 -0
  72. package/dist/esm/lib/files.js.map +1 -1
  73. package/dist/esm/lib/matchers.d.ts.map +1 -1
  74. package/dist/esm/lib/matchers.js +0 -1
  75. package/dist/esm/lib/matchers.js.map +1 -1
  76. package/dist/esm/lib/sdks.d.ts +1 -1
  77. package/dist/esm/lib/sdks.d.ts.map +1 -1
  78. package/dist/esm/lib/sdks.js +11 -7
  79. package/dist/esm/lib/sdks.js.map +1 -1
  80. package/dist/esm/lib/security.d.ts.map +1 -1
  81. package/dist/esm/lib/security.js +1 -2
  82. package/dist/esm/lib/security.js.map +1 -1
  83. package/dist/esm/lib/url.d.ts.map +1 -1
  84. package/dist/esm/lib/url.js +4 -2
  85. package/dist/esm/lib/url.js.map +1 -1
  86. package/dist/esm/mcp-server/mcp-server.js +1 -1
  87. package/dist/esm/mcp-server/server.js +1 -1
  88. package/dist/esm/mcp-server/shared.js +1 -1
  89. package/dist/esm/mcp-server/shared.js.map +1 -1
  90. package/dist/esm/models/components/consumerincometypes.d.ts +1 -0
  91. package/dist/esm/models/components/consumerincometypes.d.ts.map +1 -1
  92. package/dist/esm/models/components/consumerincometypes.js +1 -0
  93. package/dist/esm/models/components/consumerincometypes.js.map +1 -1
  94. package/dist/esm/models/components/customerprofile.d.ts +2 -0
  95. package/dist/esm/models/components/customerprofile.d.ts.map +1 -1
  96. package/dist/esm/models/components/customerprofile.js +2 -0
  97. package/dist/esm/models/components/customerprofile.js.map +1 -1
  98. package/jsr.json +1 -1
  99. package/package.json +2 -2
  100. package/src/funcs/createCommercialSubmission.ts +3 -1
  101. package/src/funcs/createConsumerSubmission.ts +3 -1
  102. package/src/funcs/createDocumentsSubmission.ts +3 -1
  103. package/src/funcs/createPersonalSubmission.ts +3 -1
  104. package/src/lib/config.ts +3 -3
  105. package/src/lib/encodings.ts +32 -4
  106. package/src/lib/files.ts +22 -0
  107. package/src/lib/matchers.ts +3 -2
  108. package/src/lib/sdks.ts +10 -9
  109. package/src/lib/security.ts +1 -2
  110. package/src/lib/url.ts +16 -14
  111. package/src/mcp-server/mcp-server.ts +1 -1
  112. package/src/mcp-server/server.ts +1 -1
  113. package/src/mcp-server/shared.ts +2 -2
  114. package/src/models/components/consumerincometypes.ts +1 -0
  115. package/src/models/components/customerprofile.ts +4 -0
  116. package/.devcontainer/devcontainer.json +0 -45
  117. package/examples/package-lock.json +0 -620
  118. package/examples/package.json +0 -18
  119. package/tsconfig.json +0 -40
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { FinanceableLendersCore } from "../core.js";
6
6
  import { encodeFormQuery, encodeJSON } from "../lib/encodings.js";
7
+ import { matchStatusCode } from "../lib/http.js";
7
8
  import * as M from "../lib/matchers.js";
8
9
  import { compactMap } from "../lib/primitives.js";
9
10
  import { safeParse } from "../lib/schemas.js";
@@ -136,7 +137,8 @@ async function $do(
136
137
 
137
138
  const doResult = await client._do(req, {
138
139
  context,
139
- errorCodes: ["400", "401", "403", "404", "4XX", "500", "5XX"],
140
+ isErrorStatusCode: (statusCode: number) =>
141
+ matchStatusCode({ status: statusCode } as Response, ["4XX", "5XX"]),
140
142
  retryConfig: context.retryConfig,
141
143
  retryCodes: context.retryCodes,
142
144
  });
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { FinanceableLendersCore } from "../core.js";
6
6
  import { encodeFormQuery, encodeJSON } from "../lib/encodings.js";
7
+ import { matchStatusCode } from "../lib/http.js";
7
8
  import * as M from "../lib/matchers.js";
8
9
  import { compactMap } from "../lib/primitives.js";
9
10
  import { safeParse } from "../lib/schemas.js";
@@ -136,7 +137,8 @@ async function $do(
136
137
 
137
138
  const doResult = await client._do(req, {
138
139
  context,
139
- errorCodes: ["400", "401", "403", "404", "4XX", "500", "5XX"],
140
+ isErrorStatusCode: (statusCode: number) =>
141
+ matchStatusCode({ status: statusCode } as Response, ["4XX", "5XX"]),
140
142
  retryConfig: context.retryConfig,
141
143
  retryCodes: context.retryCodes,
142
144
  });
package/src/lib/config.ts CHANGED
@@ -59,8 +59,8 @@ export function serverURLFromOptions(options: SDKOptions): URL | null {
59
59
  export const SDK_METADATA = {
60
60
  language: "typescript",
61
61
  openapiDocVersion: "0.1.0",
62
- sdkVersion: "0.5.4",
63
- genVersion: "2.816.0",
62
+ sdkVersion: "0.5.6",
63
+ genVersion: "2.881.0",
64
64
  userAgent:
65
- "speakeasy-sdk/typescript 0.5.4 2.816.0 0.1.0 @financeable/lenders",
65
+ "speakeasy-sdk/typescript 0.5.6 2.881.0 0.1.0 @financeable/lenders",
66
66
  } as const;
@@ -479,6 +479,23 @@ export const encodeSpaceDelimitedQuery = queryEncoder(encodeSpaceDelimited);
479
479
  export const encodePipeDelimitedQuery = queryEncoder(encodePipeDelimited);
480
480
  export const encodeDeepObjectQuery = queryEncoder(encodeDeepObject);
481
481
 
482
+ function isBlobLike(val: unknown): val is Blob {
483
+ if (val instanceof Blob) {
484
+ return true;
485
+ }
486
+
487
+ if (typeof val !== "object" || val == null || !(Symbol.toStringTag in val)) {
488
+ return false;
489
+ }
490
+
491
+ const tag = val[Symbol.toStringTag];
492
+ if (tag !== "Blob" && tag !== "File") {
493
+ return false;
494
+ }
495
+
496
+ return "stream" in val && typeof val.stream === "function";
497
+ }
498
+
482
499
  export function appendForm(
483
500
  fd: FormData,
484
501
  key: string,
@@ -487,11 +504,22 @@ export function appendForm(
487
504
  ): void {
488
505
  if (value == null) {
489
506
  return;
490
- } else if (value instanceof Blob && fileName) {
491
- fd.append(key, value, fileName);
492
- } else if (value instanceof Blob) {
493
- fd.append(key, value);
507
+ } else if (isBlobLike(value)) {
508
+ if (fileName) {
509
+ fd.append(key, value as Blob, fileName);
510
+ } else {
511
+ fd.append(key, value as Blob);
512
+ }
494
513
  } else {
495
514
  fd.append(key, String(value));
496
515
  }
497
516
  }
517
+
518
+ export async function normalizeBlob(
519
+ value: Pick<Blob, "arrayBuffer" | "type">,
520
+ ): Promise<Blob> {
521
+ if (value instanceof Blob) {
522
+ return value;
523
+ }
524
+ return new Blob([await value.arrayBuffer()], { type: value.type });
525
+ }
package/src/lib/files.ts CHANGED
@@ -80,3 +80,25 @@ export function getContentTypeFromFileName(fileName: string): string | null {
80
80
 
81
81
  return mimeTypes[ext] || null;
82
82
  }
83
+
84
+ /**
85
+ * Creates a Blob from file content with the given MIME type.
86
+ *
87
+ * Node.js Buffers are Uint8Array subclasses that may share a pooled
88
+ * ArrayBuffer (byteOffset > 0, byteLength < buffer.byteLength). Passing
89
+ * such a Buffer directly to `new Blob([buf])` can include the entire
90
+ * underlying pool on some runtimes, producing a Blob with extra bytes
91
+ * that corrupts multipart uploads.
92
+ *
93
+ * Copying into a standalone Uint8Array ensures the Blob receives only the
94
+ * intended bytes regardless of runtime behaviour.
95
+ */
96
+ export function bytesToBlob(
97
+ content: Uint8Array<ArrayBufferLike> | ArrayBuffer | Blob | string,
98
+ contentType: string,
99
+ ): Blob {
100
+ if (content instanceof Uint8Array) {
101
+ return new Blob([new Uint8Array(content)], { type: contentType });
102
+ }
103
+ return new Blob([content as BlobPart], { type: contentType });
104
+ }
@@ -248,8 +248,9 @@ export function match<T, E>(
248
248
  raw = body;
249
249
  break;
250
250
  default:
251
- encoding satisfies never;
252
- throw new Error(`Unsupported response type: ${encoding}`);
251
+ throw new Error(
252
+ `Unsupported response type: ${encoding satisfies never}`,
253
+ );
253
254
  }
254
255
 
255
256
  if (matcher.enc === "fail") {
package/src/lib/sdks.ts CHANGED
@@ -22,7 +22,6 @@ import {
22
22
  isConnectionError,
23
23
  isTimeoutError,
24
24
  matchContentType,
25
- matchStatusCode,
26
25
  } from "./http.js";
27
26
  import { Logger } from "./logger.js";
28
27
  import { retry, RetryConfig } from "./retries.js";
@@ -127,13 +126,15 @@ export class ClientSDK {
127
126
  if (!base) {
128
127
  return ERR(new InvalidRequestError("No base URL provided for operation"));
129
128
  }
130
- const reqURL = new URL(base);
131
- const inputURL = new URL(path, reqURL);
132
-
129
+ const baseURL = new URL(base);
130
+ let reqURL: URL;
133
131
  if (path) {
134
- reqURL.pathname += reqURL.pathname.endsWith("/") ? "" : "/";
135
- reqURL.pathname += inputURL.pathname.replace(/^\/+/, "");
132
+ baseURL.pathname = baseURL.pathname.replace(/\/+$/, "") + "/";
133
+ reqURL = new URL(path, baseURL);
134
+ } else {
135
+ reqURL = baseURL;
136
136
  }
137
+ reqURL.hash = "";
137
138
 
138
139
  let finalQuery = query || "";
139
140
 
@@ -231,7 +232,7 @@ export class ClientSDK {
231
232
  request: Request,
232
233
  options: {
233
234
  context: HookContext;
234
- errorCodes: number | string | (number | string)[];
235
+ isErrorStatusCode: (statusCode: number) => boolean;
235
236
  retryConfig: RetryConfig;
236
237
  retryCodes: string[];
237
238
  },
@@ -244,7 +245,7 @@ export class ClientSDK {
244
245
  | UnexpectedClientError
245
246
  >
246
247
  > {
247
- const { context, errorCodes } = options;
248
+ const { context, isErrorStatusCode } = options;
248
249
 
249
250
  return retry(
250
251
  async () => {
@@ -256,7 +257,7 @@ export class ClientSDK {
256
257
  let response = await this.#httpClient.request(req);
257
258
 
258
259
  try {
259
- if (matchStatusCode(response, errorCodes)) {
260
+ if (isErrorStatusCode(response.status)) {
260
261
  const result = await this.#hooks.afterError(
261
262
  context,
262
263
  response,
@@ -195,8 +195,7 @@ export function resolveSecurity(
195
195
  applyBearer(state, spec);
196
196
  break;
197
197
  default:
198
- spec satisfies never;
199
- throw SecurityError.unrecognizedType(type);
198
+ throw SecurityError.unrecognizedType((spec satisfies never, type));
200
199
  }
201
200
  });
202
201
 
package/src/lib/url.ts CHANGED
@@ -13,21 +13,23 @@ export function pathToFunc(
13
13
  const paramRE = /\{([a-zA-Z0-9_][a-zA-Z0-9_-]*?)\}/g;
14
14
 
15
15
  return function buildURLPath(params: Record<string, unknown> = {}): string {
16
- return pathPattern.replace(paramRE, function (_, placeholder) {
17
- if (!hasOwn.call(params, placeholder)) {
18
- throw new Error(`Parameter '${placeholder}' is required`);
19
- }
16
+ return pathPattern
17
+ .replace(paramRE, function (_, placeholder) {
18
+ if (!hasOwn.call(params, placeholder)) {
19
+ throw new Error(`Parameter '${placeholder}' is required`);
20
+ }
20
21
 
21
- const value = params[placeholder];
22
- if (typeof value !== "string" && typeof value !== "number") {
23
- throw new Error(
24
- `Parameter '${placeholder}' must be a string or number`,
25
- );
26
- }
22
+ const value = params[placeholder];
23
+ if (typeof value !== "string" && typeof value !== "number") {
24
+ throw new Error(
25
+ `Parameter '${placeholder}' must be a string or number`,
26
+ );
27
+ }
27
28
 
28
- return options?.charEncoding === "percent"
29
- ? encodeURIComponent(`${value}`)
30
- : `${value}`;
31
- });
29
+ return options?.charEncoding === "percent"
30
+ ? encodeURIComponent(`${value}`)
31
+ : `${value}`;
32
+ })
33
+ .replace(/^\/+/, "");
32
34
  };
33
35
  }
@@ -19,7 +19,7 @@ const routes = buildRouteMap({
19
19
  export const app = buildApplication(routes, {
20
20
  name: "mcp",
21
21
  versionInfo: {
22
- currentVersion: "0.5.4",
22
+ currentVersion: "0.5.6",
23
23
  },
24
24
  });
25
25
 
@@ -27,7 +27,7 @@ export function createMCPServer(deps: {
27
27
  }) {
28
28
  const server = new McpServer({
29
29
  name: "FinanceableLenders",
30
- version: "0.5.4",
30
+ version: "0.5.6",
31
31
  });
32
32
 
33
33
  const client = new FinanceableLendersCore({
@@ -16,12 +16,12 @@ export async function consumeStream(
16
16
  stream: ReadableStream<Uint8Array>,
17
17
  ): Promise<Uint8Array> {
18
18
  const reader = stream.getReader();
19
- const chunks: Uint8Array[] = [];
19
+ const chunks: ArrayBuffer[] = [];
20
20
 
21
21
  try {
22
22
  while (true) {
23
23
  const { done, value } = await reader.read();
24
- if (value != null) chunks.push(value);
24
+ if (value != null) chunks.push(new Uint8Array(value).buffer);
25
25
  if (done) break;
26
26
  }
27
27
  } finally {
@@ -17,6 +17,7 @@ export const ConsumerIncomeTypes = {
17
17
  Pension: "Pension",
18
18
  Trust: "Trust",
19
19
  Benefits: "Benefits",
20
+ Spouse: "Spouse",
20
21
  Other: "Other",
21
22
  } as const;
22
23
  /**
@@ -45,6 +45,7 @@ export type CustomerProfile = {
45
45
  shareOfExpenses?: number | undefined;
46
46
  rentAmount?: string | undefined;
47
47
  landlordName?: string | undefined;
48
+ serviceabilitySurplus?: number | undefined;
48
49
  };
49
50
 
50
51
  /** @internal */
@@ -62,6 +63,7 @@ export const CustomerProfile$inboundSchema: z.ZodType<
62
63
  shareOfExpenses: z.number().optional(),
63
64
  rentAmount: z.string().optional(),
64
65
  landlordName: z.string().optional(),
66
+ serviceabilitySurplus: z.number().optional(),
65
67
  }).transform((v) => {
66
68
  return remap$(v, {
67
69
  "_id": "id",
@@ -78,6 +80,7 @@ export type CustomerProfile$Outbound = {
78
80
  shareOfExpenses?: number | undefined;
79
81
  rentAmount?: string | undefined;
80
82
  landlordName?: string | undefined;
83
+ serviceabilitySurplus?: number | undefined;
81
84
  };
82
85
 
83
86
  /** @internal */
@@ -95,6 +98,7 @@ export const CustomerProfile$outboundSchema: z.ZodType<
95
98
  shareOfExpenses: z.number().optional(),
96
99
  rentAmount: z.string().optional(),
97
100
  landlordName: z.string().optional(),
101
+ serviceabilitySurplus: z.number().optional(),
98
102
  }).transform((v) => {
99
103
  return remap$(v, {
100
104
  id: "_id",
@@ -1,45 +0,0 @@
1
- // For format details, see https://aka.ms/devcontainer.json. For config options, see the
2
- // README at: https://github.com/devcontainers/images/tree/main/src/typescript-node
3
- {
4
- "name": "TypeScript",
5
- "image": "mcr.microsoft.com/devcontainers/typescript-node:1-20-bullseye",
6
- // Features to add to the dev container. More info: https://containers.dev/features.
7
- // "features": {},
8
- // Use 'forwardPorts' to make a list of ports inside the container available locally.
9
- // "forwardPorts": [],
10
- // Use 'postCreateCommand' to run commands after the container is created.
11
- "postCreateCommand": "sudo chmod +x ./.devcontainer/setup.sh && ./.devcontainer/setup.sh",
12
- "customizations": {
13
- "vscode": {
14
- "extensions": [
15
- "ms-vscode.vscode-typescript-tslint-plugin",
16
- "esbenp.prettier-vscode",
17
- "github.vscode-pull-request-github"
18
- ],
19
- "settings": {
20
- "files.eol": "\n",
21
- "editor.formatOnSave": true,
22
- "typescript.tsc.autoDetect": "on",
23
- "typescript.updateImportsOnFileMove.enabled": "always",
24
- "typescript.preferences.importModuleSpecifier": "relative",
25
- "[typescript]": {
26
- "editor.codeActionsOnSave": {
27
- "source.organizeImports": true
28
- }
29
- },
30
- "[typescriptreact]": {
31
- "editor.codeActionsOnSave": {
32
- "source.organizeImports": true
33
- }
34
- }
35
- }
36
- },
37
- "codespaces": {
38
- "openFiles": [
39
- ".devcontainer/README.md"
40
- ]
41
- }
42
- }
43
- // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
44
- // "remoteUser": "root"
45
- }