@markupai/api 0.3.0 → 1.1.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.
Files changed (91) hide show
  1. package/README.md +18 -1
  2. package/dist/cjs/Client.js +2 -2
  3. package/dist/cjs/api/errors/TooManyRequestsError.d.ts +9 -0
  4. package/dist/cjs/api/errors/TooManyRequestsError.js +52 -0
  5. package/dist/cjs/api/errors/index.d.ts +1 -0
  6. package/dist/cjs/api/errors/index.js +1 -0
  7. package/dist/cjs/api/resources/styleChecks/client/Client.d.ts +3 -2
  8. package/dist/cjs/api/resources/styleChecks/client/Client.js +5 -2
  9. package/dist/cjs/api/resources/{styleSuggestions/client/requests/CreateStyleSuggestionV1StyleSuggestionsPostRequest.d.ts → styleChecks/client/requests/StyleCheckRequestBody.d.ts} +4 -4
  10. package/dist/cjs/api/resources/styleChecks/client/requests/index.d.ts +1 -1
  11. package/dist/cjs/api/resources/styleGuides/client/Client.js +3 -0
  12. package/dist/cjs/api/resources/styleGuides/client/requests/StyleGuideRequestBody.d.ts +3 -0
  13. package/dist/cjs/api/resources/styleRewrites/client/Client.d.ts +3 -2
  14. package/dist/cjs/api/resources/styleRewrites/client/Client.js +5 -2
  15. package/dist/cjs/api/resources/{styleChecks/client/requests/CreateStyleCheckV1StyleChecksPostRequest.d.ts → styleRewrites/client/requests/StyleRewriteRequestBody.d.ts} +4 -4
  16. package/dist/cjs/api/resources/styleRewrites/client/requests/index.d.ts +1 -1
  17. package/dist/cjs/api/resources/styleSuggestions/client/Client.d.ts +3 -2
  18. package/dist/cjs/api/resources/styleSuggestions/client/Client.js +5 -2
  19. package/dist/cjs/api/resources/{styleRewrites/client/requests/CreateStyleRewriteV1StyleRewritesPostRequest.d.ts → styleSuggestions/client/requests/StyleSuggestionRequestBody.d.ts} +4 -4
  20. package/dist/cjs/api/resources/styleSuggestions/client/requests/index.d.ts +1 -1
  21. package/dist/cjs/api/types/BaseStyleGuideType.d.ts +9 -0
  22. package/dist/cjs/api/types/BaseStyleGuideType.js +11 -0
  23. package/dist/cjs/api/types/StyleGuideResponse.d.ts +3 -1
  24. package/dist/cjs/api/types/StyleGuides.d.ts +1 -2
  25. package/dist/cjs/api/types/StyleGuides.js +0 -1
  26. package/dist/cjs/api/types/WorkflowInfo.d.ts +2 -0
  27. package/dist/cjs/api/types/index.d.ts +1 -0
  28. package/dist/cjs/api/types/index.js +1 -0
  29. package/dist/cjs/core/auth/index.d.ts +2 -2
  30. package/dist/cjs/core/fetcher/EndpointMetadata.d.ts +13 -0
  31. package/dist/cjs/core/fetcher/EndpointMetadata.js +2 -0
  32. package/dist/cjs/core/fetcher/EndpointSupplier.d.ts +12 -0
  33. package/dist/cjs/core/fetcher/EndpointSupplier.js +22 -0
  34. package/dist/cjs/core/fetcher/Fetcher.d.ts +4 -2
  35. package/dist/cjs/core/fetcher/Fetcher.js +3 -2
  36. package/dist/cjs/core/fetcher/index.d.ts +2 -0
  37. package/dist/cjs/core/fetcher/index.js +3 -1
  38. package/dist/cjs/core/fetcher/requestWithRetries.js +44 -8
  39. package/dist/cjs/core/file/exports.d.ts +1 -1
  40. package/dist/cjs/core/headers.d.ts +2 -3
  41. package/dist/cjs/version.d.ts +1 -1
  42. package/dist/cjs/version.js +1 -1
  43. package/dist/esm/Client.mjs +2 -2
  44. package/dist/esm/api/errors/TooManyRequestsError.d.mts +9 -0
  45. package/dist/esm/api/errors/TooManyRequestsError.mjs +15 -0
  46. package/dist/esm/api/errors/index.d.mts +1 -0
  47. package/dist/esm/api/errors/index.mjs +1 -0
  48. package/dist/esm/api/resources/styleChecks/client/Client.d.mts +3 -2
  49. package/dist/esm/api/resources/styleChecks/client/Client.mjs +5 -2
  50. package/dist/esm/api/resources/{styleSuggestions/client/requests/CreateStyleSuggestionV1StyleSuggestionsPostRequest.d.mts → styleChecks/client/requests/StyleCheckRequestBody.d.mts} +4 -4
  51. package/dist/esm/api/resources/styleChecks/client/requests/index.d.mts +1 -1
  52. package/dist/esm/api/resources/styleGuides/client/Client.mjs +3 -0
  53. package/dist/esm/api/resources/styleGuides/client/requests/StyleGuideRequestBody.d.mts +3 -0
  54. package/dist/esm/api/resources/styleRewrites/client/Client.d.mts +3 -2
  55. package/dist/esm/api/resources/styleRewrites/client/Client.mjs +5 -2
  56. package/dist/esm/api/resources/styleRewrites/client/requests/{CreateStyleRewriteV1StyleRewritesPostRequest.d.mts → StyleRewriteRequestBody.d.mts} +4 -4
  57. package/dist/esm/api/resources/styleRewrites/client/requests/index.d.mts +1 -1
  58. package/dist/esm/api/resources/styleSuggestions/client/Client.d.mts +3 -2
  59. package/dist/esm/api/resources/styleSuggestions/client/Client.mjs +5 -2
  60. package/dist/esm/api/resources/{styleChecks/client/requests/CreateStyleCheckV1StyleChecksPostRequest.d.mts → styleSuggestions/client/requests/StyleSuggestionRequestBody.d.mts} +4 -4
  61. package/dist/esm/api/resources/styleSuggestions/client/requests/index.d.mts +1 -1
  62. package/dist/esm/api/types/BaseStyleGuideType.d.mts +9 -0
  63. package/dist/esm/api/types/BaseStyleGuideType.mjs +8 -0
  64. package/dist/esm/api/types/StyleGuideResponse.d.mts +3 -1
  65. package/dist/esm/api/types/StyleGuides.d.mts +1 -2
  66. package/dist/esm/api/types/StyleGuides.mjs +0 -1
  67. package/dist/esm/api/types/WorkflowInfo.d.mts +2 -0
  68. package/dist/esm/api/types/index.d.mts +1 -0
  69. package/dist/esm/api/types/index.mjs +1 -0
  70. package/dist/esm/core/auth/index.d.mts +2 -2
  71. package/dist/esm/core/fetcher/EndpointMetadata.d.mts +13 -0
  72. package/dist/esm/core/fetcher/EndpointMetadata.mjs +1 -0
  73. package/dist/esm/core/fetcher/EndpointSupplier.d.mts +12 -0
  74. package/dist/esm/core/fetcher/EndpointSupplier.mjs +19 -0
  75. package/dist/esm/core/fetcher/Fetcher.d.mts +4 -2
  76. package/dist/esm/core/fetcher/Fetcher.mjs +3 -2
  77. package/dist/esm/core/fetcher/index.d.mts +2 -0
  78. package/dist/esm/core/fetcher/index.mjs +1 -0
  79. package/dist/esm/core/fetcher/requestWithRetries.mjs +44 -8
  80. package/dist/esm/core/file/exports.d.mts +1 -1
  81. package/dist/esm/core/headers.d.mts +2 -3
  82. package/dist/esm/version.d.mts +1 -1
  83. package/dist/esm/version.mjs +1 -1
  84. package/package.json +8 -13
  85. package/reference.md +3 -3
  86. /package/dist/cjs/api/resources/styleChecks/client/requests/{CreateStyleCheckV1StyleChecksPostRequest.js → StyleCheckRequestBody.js} +0 -0
  87. /package/dist/cjs/api/resources/styleRewrites/client/requests/{CreateStyleRewriteV1StyleRewritesPostRequest.js → StyleRewriteRequestBody.js} +0 -0
  88. /package/dist/cjs/api/resources/styleSuggestions/client/requests/{CreateStyleSuggestionV1StyleSuggestionsPostRequest.js → StyleSuggestionRequestBody.js} +0 -0
  89. /package/dist/esm/api/resources/styleChecks/client/requests/{CreateStyleCheckV1StyleChecksPostRequest.mjs → StyleCheckRequestBody.mjs} +0 -0
  90. /package/dist/esm/api/resources/styleRewrites/client/requests/{CreateStyleRewriteV1StyleRewritesPostRequest.mjs → StyleRewriteRequestBody.mjs} +0 -0
  91. /package/dist/esm/api/resources/styleSuggestions/client/requests/{CreateStyleSuggestionV1StyleSuggestionsPostRequest.mjs → StyleSuggestionRequestBody.mjs} +0 -0
@@ -0,0 +1,12 @@
1
+ import { EndpointMetadata } from "./EndpointMetadata.mjs";
2
+ import { Supplier } from "./Supplier.mjs";
3
+ type EndpointSupplierFn<T> = (arg: {
4
+ endpointMetadata: EndpointMetadata;
5
+ }) => T | Promise<T>;
6
+ export type EndpointSupplier<T> = Supplier<T> | EndpointSupplierFn<T>;
7
+ export declare const EndpointSupplier: {
8
+ get: <T>(supplier: EndpointSupplier<T>, arg: {
9
+ endpointMetadata: EndpointMetadata;
10
+ }) => Promise<T>;
11
+ };
12
+ export {};
@@ -0,0 +1,19 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ export const EndpointSupplier = {
11
+ get: (supplier, arg) => __awaiter(void 0, void 0, void 0, function* () {
12
+ if (typeof supplier === "function") {
13
+ return supplier(arg);
14
+ }
15
+ else {
16
+ return supplier;
17
+ }
18
+ }),
19
+ };
@@ -1,12 +1,13 @@
1
1
  import { APIResponse } from "./APIResponse.mjs";
2
- import { Supplier } from "./Supplier.mjs";
2
+ import { EndpointMetadata } from "./EndpointMetadata.mjs";
3
+ import { EndpointSupplier } from "./EndpointSupplier.mjs";
3
4
  export type FetchFunction = <R = unknown>(args: Fetcher.Args) => Promise<APIResponse<R, Fetcher.Error>>;
4
5
  export declare namespace Fetcher {
5
6
  interface Args {
6
7
  url: string;
7
8
  method: string;
8
9
  contentType?: string;
9
- headers?: Record<string, string | Supplier<string | null | undefined> | null | undefined>;
10
+ headers?: Record<string, string | EndpointSupplier<string | null | undefined> | null | undefined>;
10
11
  queryParameters?: Record<string, unknown>;
11
12
  body?: unknown;
12
13
  timeoutMs?: number;
@@ -16,6 +17,7 @@ export declare namespace Fetcher {
16
17
  requestType?: "json" | "file" | "bytes";
17
18
  responseType?: "json" | "blob" | "sse" | "streaming" | "text" | "arrayBuffer" | "binary-response";
18
19
  duplex?: "half";
20
+ endpointMetadata?: EndpointMetadata;
19
21
  }
20
22
  type Error = FailedStatusCodeError | NonJsonError | TimeoutError | UnknownError;
21
23
  interface FailedStatusCodeError {
@@ -9,6 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import { toJson } from "../json.mjs";
11
11
  import { createRequestUrl } from "./createRequestUrl.mjs";
12
+ import { EndpointSupplier } from "./EndpointSupplier.mjs";
12
13
  import { getErrorResponseBody } from "./getErrorResponseBody.mjs";
13
14
  import { getFetchFn } from "./getFetchFn.mjs";
14
15
  import { getRequestBody } from "./getRequestBody.mjs";
@@ -16,9 +17,9 @@ import { getResponseBody } from "./getResponseBody.mjs";
16
17
  import { makeRequest } from "./makeRequest.mjs";
17
18
  import { abortRawResponse, toRawResponse, unknownRawResponse } from "./RawResponse.mjs";
18
19
  import { requestWithRetries } from "./requestWithRetries.mjs";
19
- import { Supplier } from "./Supplier.mjs";
20
20
  function getHeaders(args) {
21
21
  return __awaiter(this, void 0, void 0, function* () {
22
+ var _a;
22
23
  const newHeaders = {};
23
24
  if (args.body !== undefined && args.contentType != null) {
24
25
  newHeaders["Content-Type"] = args.contentType;
@@ -27,7 +28,7 @@ function getHeaders(args) {
27
28
  return newHeaders;
28
29
  }
29
30
  for (const [key, value] of Object.entries(args.headers)) {
30
- const result = yield Supplier.get(value);
31
+ const result = yield EndpointSupplier.get(value, { endpointMetadata: (_a = args.endpointMetadata) !== null && _a !== void 0 ? _a : {} });
31
32
  if (typeof result === "string") {
32
33
  newHeaders[key] = result;
33
34
  continue;
@@ -1,5 +1,7 @@
1
1
  export type { APIResponse } from "./APIResponse.mjs";
2
2
  export type { BinaryResponse } from "./BinaryResponse.mjs";
3
+ export type { EndpointMetadata } from "./EndpointMetadata.mjs";
4
+ export { EndpointSupplier } from "./EndpointSupplier.mjs";
3
5
  export type { Fetcher, FetchFunction } from "./Fetcher.mjs";
4
6
  export { fetcher } from "./Fetcher.mjs";
5
7
  export { getHeader } from "./getHeader.mjs";
@@ -1,3 +1,4 @@
1
+ export { EndpointSupplier } from "./EndpointSupplier.mjs";
1
2
  export { fetcher } from "./Fetcher.mjs";
2
3
  export { getHeader } from "./getHeader.mjs";
3
4
  export { HttpResponsePromise } from "./HttpResponsePromise.mjs";
@@ -11,21 +11,57 @@ const INITIAL_RETRY_DELAY = 1000; // in milliseconds
11
11
  const MAX_RETRY_DELAY = 60000; // in milliseconds
12
12
  const DEFAULT_MAX_RETRIES = 2;
13
13
  const JITTER_FACTOR = 0.2; // 20% random jitter
14
- function addJitter(delay) {
15
- // Generate a random value between -JITTER_FACTOR and +JITTER_FACTOR
16
- const jitterMultiplier = 1 + (Math.random() * 2 - 1) * JITTER_FACTOR;
14
+ function addPositiveJitter(delay) {
15
+ // Generate a random value between 0 and +JITTER_FACTOR
16
+ const jitterMultiplier = 1 + Math.random() * JITTER_FACTOR;
17
17
  return delay * jitterMultiplier;
18
18
  }
19
+ function addSymmetricJitter(delay) {
20
+ // Generate a random value in a JITTER_FACTOR-sized percentage range around delay
21
+ const jitterMultiplier = 1 + (Math.random() - 0.5) * JITTER_FACTOR;
22
+ return delay * jitterMultiplier;
23
+ }
24
+ function getRetryDelayFromHeaders(response, retryAttempt) {
25
+ // Check for Retry-After header first (RFC 7231), with no jitter
26
+ const retryAfter = response.headers.get("Retry-After");
27
+ if (retryAfter) {
28
+ // Parse as number of seconds...
29
+ const retryAfterSeconds = parseInt(retryAfter, 10);
30
+ if (!isNaN(retryAfterSeconds) && retryAfterSeconds > 0) {
31
+ return Math.min(retryAfterSeconds * 1000, MAX_RETRY_DELAY);
32
+ }
33
+ // ...or as an HTTP date; both are valid
34
+ const retryAfterDate = new Date(retryAfter);
35
+ if (!isNaN(retryAfterDate.getTime())) {
36
+ const delay = retryAfterDate.getTime() - Date.now();
37
+ if (delay > 0) {
38
+ return Math.min(Math.max(delay, 0), MAX_RETRY_DELAY);
39
+ }
40
+ }
41
+ }
42
+ // Then check for industry-standard X-RateLimit-Reset header, with positive jitter
43
+ const rateLimitReset = response.headers.get("X-RateLimit-Reset");
44
+ if (rateLimitReset) {
45
+ const resetTime = parseInt(rateLimitReset, 10);
46
+ if (!isNaN(resetTime)) {
47
+ // Assume Unix timestamp in epoch seconds
48
+ const delay = resetTime * 1000 - Date.now();
49
+ if (delay > 0) {
50
+ return addPositiveJitter(Math.min(delay, MAX_RETRY_DELAY));
51
+ }
52
+ }
53
+ }
54
+ // Fall back to exponential backoff, with symmetric jitter
55
+ return addSymmetricJitter(Math.min(INITIAL_RETRY_DELAY * Math.pow(2, retryAttempt), MAX_RETRY_DELAY));
56
+ }
19
57
  export function requestWithRetries(requestFn_1) {
20
58
  return __awaiter(this, arguments, void 0, function* (requestFn, maxRetries = DEFAULT_MAX_RETRIES) {
21
59
  let response = yield requestFn();
22
60
  for (let i = 0; i < maxRetries; ++i) {
23
61
  if ([408, 429].includes(response.status) || response.status >= 500) {
24
- // Calculate base delay using exponential backoff (in milliseconds)
25
- const baseDelay = Math.min(INITIAL_RETRY_DELAY * Math.pow(2, i), MAX_RETRY_DELAY);
26
- // Add jitter to the delay
27
- const delayWithJitter = addJitter(baseDelay);
28
- yield new Promise((resolve) => setTimeout(resolve, delayWithJitter));
62
+ // Get delay with appropriate jitter applied
63
+ const delay = getRetryDelayFromHeaders(response, i);
64
+ yield new Promise((resolve) => setTimeout(resolve, delay));
29
65
  response = yield requestFn();
30
66
  }
31
67
  else {
@@ -1 +1 @@
1
- export { Uploadable } from "./types.mjs";
1
+ export type { Uploadable } from "./types.mjs";
@@ -1,3 +1,2 @@
1
- import * as core from "./index.mjs";
2
- export declare function mergeHeaders(...headersArray: (Record<string, string | core.Supplier<string | null | undefined> | null | undefined> | null | undefined)[]): Record<string, string | core.Supplier<string | null | undefined>>;
3
- export declare function mergeOnlyDefinedHeaders(...headersArray: (Record<string, string | core.Supplier<string | null | undefined> | null | undefined> | null | undefined)[]): Record<string, string | core.Supplier<string | null | undefined>>;
1
+ export declare function mergeHeaders<THeaderValue>(...headersArray: (Record<string, THeaderValue> | null | undefined)[]): Record<string, string | THeaderValue>;
2
+ export declare function mergeOnlyDefinedHeaders<THeaderValue>(...headersArray: (Record<string, THeaderValue> | null | undefined)[]): Record<string, THeaderValue>;
@@ -1 +1 @@
1
- export declare const SDK_VERSION = "0.3.0";
1
+ export declare const SDK_VERSION = "1.1.0";
@@ -1 +1 @@
1
- export const SDK_VERSION = "0.3.0";
1
+ export const SDK_VERSION = "1.1.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@markupai/api",
3
- "version": "0.3.0",
3
+ "version": "1.1.0",
4
4
  "private": false,
5
5
  "repository": "github:markupai/markup-ai-typescript-sdk",
6
6
  "license": "Apache-2.0",
@@ -31,23 +31,18 @@
31
31
  ],
32
32
  "scripts": {
33
33
  "format": "prettier . --write --ignore-unknown",
34
- "build": "yarn build:cjs && yarn build:esm",
34
+ "build": "pnpm build:cjs && pnpm build:esm",
35
35
  "build:cjs": "tsc --project ./tsconfig.cjs.json",
36
36
  "build:esm": "tsc --project ./tsconfig.esm.json && node scripts/rename-to-esm-files.js dist/esm",
37
- "test": "jest --config jest.config.mjs",
38
- "test:unit": "jest --selectProjects unit",
39
- "test:browser": "jest --selectProjects browser",
40
- "test:wire": "jest --selectProjects wire"
37
+ "test": "vitest",
38
+ "test:unit": "vitest --project unit",
39
+ "test:wire": "vitest --project wire"
41
40
  },
42
41
  "devDependencies": {
43
42
  "webpack": "^5.97.1",
44
43
  "ts-loader": "^9.5.1",
45
- "jest": "^29.7.0",
46
- "@jest/globals": "^29.7.0",
47
- "@types/jest": "^29.5.14",
48
- "ts-jest": "^29.3.4",
49
- "jest-environment-jsdom": "^29.7.0",
50
- "msw": "^2.8.4",
44
+ "vitest": "^3.2.4",
45
+ "msw": "2.11.2",
51
46
  "@types/node": "^18.19.70",
52
47
  "prettier": "^3.4.2",
53
48
  "typescript": "~5.7.2"
@@ -58,7 +53,7 @@
58
53
  "path": false,
59
54
  "stream": false
60
55
  },
61
- "packageManager": "yarn@1.22.22",
56
+ "packageManager": "pnpm@10.14.0",
62
57
  "engines": {
63
58
  "node": ">=18.0.0"
64
59
  },
package/reference.md CHANGED
@@ -372,7 +372,7 @@ await client.styleChecks.createStyleCheck({
372
372
  <dl>
373
373
  <dd>
374
374
 
375
- **request:** `MarkupAI.CreateStyleCheckV1StyleChecksPostRequest`
375
+ **request:** `MarkupAI.StyleCheckRequestBody`
376
376
 
377
377
  </dd>
378
378
  </dl>
@@ -504,7 +504,7 @@ await client.styleSuggestions.createStyleSuggestion({
504
504
  <dl>
505
505
  <dd>
506
506
 
507
- **request:** `MarkupAI.CreateStyleSuggestionV1StyleSuggestionsPostRequest`
507
+ **request:** `MarkupAI.StyleSuggestionRequestBody`
508
508
 
509
509
  </dd>
510
510
  </dl>
@@ -636,7 +636,7 @@ await client.styleRewrites.createStyleRewrite({
636
636
  <dl>
637
637
  <dd>
638
638
 
639
- **request:** `MarkupAI.CreateStyleRewriteV1StyleRewritesPostRequest`
639
+ **request:** `MarkupAI.StyleRewriteRequestBody`
640
640
 
641
641
  </dd>
642
642
  </dl>