@missioncontrolio/client 0.0.9 → 0.0.10

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 (90) hide show
  1. package/dist/client/autoCancelOrderHandler.d.ts +7 -0
  2. package/dist/client/autoCancelOrderHandler.js +95 -0
  3. package/dist/client/clientBuilder.d.ts +16 -0
  4. package/dist/client/clientBuilder.js +57 -0
  5. package/dist/client/generated/client.d.ts +20 -0
  6. package/{src/client/generated/client.ts → dist/client/generated/client.js} +14 -79
  7. package/dist/client/generated/models/index.d.ts +277 -0
  8. package/dist/client/generated/models/index.js +585 -0
  9. package/dist/client/generated/order/cancelOrder/index.d.ts +8 -0
  10. package/dist/client/generated/order/cancelOrder/index.js +17 -0
  11. package/dist/client/generated/order/claimReservation/index.d.ts +7 -0
  12. package/dist/client/generated/order/claimReservation/index.js +8 -0
  13. package/dist/client/generated/order/claimReservation/item/index.d.ts +8 -0
  14. package/dist/client/generated/order/claimReservation/item/index.js +17 -0
  15. package/dist/client/generated/order/createOrder/index.d.ts +8 -0
  16. package/dist/client/generated/order/createOrder/index.js +17 -0
  17. package/dist/client/generated/order/index.d.ts +25 -0
  18. package/dist/client/generated/order/index.js +32 -0
  19. package/dist/client/generated/order/reportOrder/index.d.ts +8 -0
  20. package/dist/client/generated/order/reportOrder/index.js +17 -0
  21. package/dist/client/generated/partner/index.d.ts +12 -0
  22. package/dist/client/generated/partner/index.js +14 -0
  23. package/dist/client/generated/priceList/index.d.ts +12 -0
  24. package/dist/client/generated/priceList/index.js +14 -0
  25. package/dist/client/generated/product/hasStock/index.d.ts +8 -0
  26. package/dist/client/generated/product/hasStock/index.js +17 -0
  27. package/dist/client/generated/product/index.d.ts +33 -0
  28. package/dist/client/generated/product/index.js +37 -0
  29. package/dist/client/generated/publisher/index.d.ts +12 -0
  30. package/dist/client/generated/publisher/index.js +14 -0
  31. package/dist/client/generated/region/index.d.ts +14 -0
  32. package/dist/client/generated/region/index.js +14 -0
  33. package/dist/client/generated/reservation/index.d.ts +11 -0
  34. package/dist/client/generated/reservation/index.js +25 -0
  35. package/dist/client/generated/reservation/item/cancel/index.d.ts +8 -0
  36. package/dist/client/generated/reservation/item/cancel/index.js +14 -0
  37. package/dist/client/generated/reservation/item/index.d.ts +11 -0
  38. package/dist/client/generated/reservation/item/index.js +20 -0
  39. package/dist/client/missionControlEnvironment.d.ts +6 -0
  40. package/dist/client/missionControlEnvironment.js +21 -0
  41. package/dist/client/missionControlHandlers.d.ts +2 -0
  42. package/dist/client/missionControlHandlers.js +34 -0
  43. package/dist/client/missionControlHeaders.d.ts +3 -0
  44. package/dist/client/missionControlHeaders.js +3 -0
  45. package/dist/client/nonIdempotentPaths.d.ts +1 -0
  46. package/dist/client/nonIdempotentPaths.js +5 -0
  47. package/dist/client/partnerIdHandler.d.ts +8 -0
  48. package/dist/client/partnerIdHandler.js +14 -0
  49. package/dist/index.d.ts +5 -0
  50. package/dist/index.js +3 -0
  51. package/package.json +15 -3
  52. package/.env.local.example +0 -9
  53. package/src/client/autoCancelOrderHandler.ts +0 -135
  54. package/src/client/clientBuilder.ts +0 -139
  55. package/src/client/generated/kiota-lock.json +0 -34
  56. package/src/client/generated/models/index.ts +0 -1723
  57. package/src/client/generated/order/cancelOrder/index.ts +0 -53
  58. package/src/client/generated/order/claimReservation/index.ts +0 -34
  59. package/src/client/generated/order/claimReservation/item/index.ts +0 -53
  60. package/src/client/generated/order/createOrder/index.ts +0 -53
  61. package/src/client/generated/order/index.ts +0 -112
  62. package/src/client/generated/order/reportOrder/index.ts +0 -53
  63. package/src/client/generated/partner/index.ts +0 -55
  64. package/src/client/generated/priceList/index.ts +0 -55
  65. package/src/client/generated/product/hasStock/index.ts +0 -53
  66. package/src/client/generated/product/index.ts +0 -119
  67. package/src/client/generated/publisher/index.ts +0 -55
  68. package/src/client/generated/region/index.ts +0 -63
  69. package/src/client/generated/reservation/index.ts +0 -71
  70. package/src/client/generated/reservation/item/cancel/index.ts +0 -48
  71. package/src/client/generated/reservation/item/index.ts +0 -62
  72. package/src/client/missionControlEnvironment.ts +0 -32
  73. package/src/client/missionControlHandlers.ts +0 -61
  74. package/src/client/missionControlHeaders.ts +0 -10
  75. package/src/client/nonIdempotentPaths.ts +0 -9
  76. package/src/client/partnerIdHandler.ts +0 -33
  77. package/tests/autoCancelOrderHandler.test.ts +0 -263
  78. package/tests/clientBuilder.test.ts +0 -154
  79. package/tests/integration/fixture.ts +0 -50
  80. package/tests/integration/partner.test.ts +0 -32
  81. package/tests/integration/priceList.test.ts +0 -28
  82. package/tests/integration/product.test.ts +0 -30
  83. package/tests/integration/publisher.test.ts +0 -30
  84. package/tests/integration/region.test.ts +0 -36
  85. package/tests/integration/setup.ts +0 -22
  86. package/tests/missionControlEnvironment.test.ts +0 -66
  87. package/tests/missionControlHeaders.test.ts +0 -20
  88. package/tsconfig.json +0 -18
  89. package/vitest.config.ts +0 -8
  90. package/vitest.integration.config.ts +0 -9
@@ -1,135 +0,0 @@
1
- import type { RequestOption } from "@microsoft/kiota-abstractions";
2
- import type { Middleware } from "@microsoft/kiota-http-fetchlibrary";
3
- import { MissionControlHeaders } from "./missionControlHeaders";
4
- import { nonIdempotentPaths } from "./nonIdempotentPaths";
5
-
6
- const CANCEL_TIMEOUT_MS = 30_000;
7
-
8
- /**
9
- * A Kiota middleware that automatically attempts to cancel an order when a request to one of
10
- * the order-mutation endpoints fails with a server error (5xx) or a network/connection error.
11
- *
12
- * Affected endpoints: `createOrder`, `claimReservation`, `reportOrder`.
13
- *
14
- * The cancellation attempt is best-effort. If it fails the original error is still propagated
15
- * to the caller unchanged.
16
- */
17
- export class AutoCancelOrderHandler implements Middleware {
18
- next: Middleware | undefined;
19
-
20
- async execute(
21
- url: string,
22
- requestInit: RequestInit,
23
- requestOptions?: Record<string, RequestOption>,
24
- ): Promise<Response> {
25
- if (!isAutoCancelEndpoint(url)) {
26
- return this.next!.execute(url, requestInit, requestOptions);
27
- }
28
-
29
- // Buffer the request body before the inner handler consumes it.
30
- const requestBody =
31
- requestInit.body != null ? String(requestInit.body) : null;
32
-
33
- let response: Response;
34
- try {
35
- response = await this.next!.execute(url, requestInit, requestOptions);
36
- } catch (err) {
37
- // Network/connection error — attempt a best-effort cancel.
38
- await this.tryCancelOrderAsync(url, requestInit, requestBody);
39
- throw err;
40
- }
41
-
42
- if (isServerError(response)) {
43
- await this.tryCancelOrderAsync(url, requestInit, requestBody);
44
- }
45
-
46
- return response;
47
- }
48
-
49
- private async tryCancelOrderAsync(
50
- originalUrl: string,
51
- originalInit: RequestInit,
52
- requestBody: string | null,
53
- ): Promise<void> {
54
- try {
55
- const requestId = extractRequestId(requestBody);
56
- if (requestId == null) return;
57
-
58
- const cancelUrl = buildCancelUrl(originalUrl);
59
- if (cancelUrl == null) return;
60
-
61
- const headers = new Headers();
62
- headers.set("Content-Type", "application/json");
63
-
64
- // Copy auth and partner-id headers so the cancel request is properly authenticated
65
- // and attributed — the inner middleware handles retry and other cross-cutting concerns.
66
- const originalHeaders = new Headers(originalInit.headers);
67
- const auth = originalHeaders.get("Authorization");
68
- if (auth) headers.set("Authorization", auth);
69
- const partnerId = originalHeaders.get(MissionControlHeaders.PartnerId);
70
- if (partnerId) headers.set(MissionControlHeaders.PartnerId, partnerId);
71
-
72
- const cancelInit: RequestInit = {
73
- method: "POST",
74
- headers,
75
- body: JSON.stringify({ originalRequestId: requestId }),
76
- signal: AbortSignal.timeout(CANCEL_TIMEOUT_MS),
77
- };
78
-
79
- await this.next!.execute(cancelUrl, cancelInit, undefined);
80
- } catch {
81
- // Best-effort: swallow failures so the original error propagates.
82
- }
83
- }
84
- }
85
-
86
- function isAutoCancelEndpoint(url: string): boolean {
87
- try {
88
- const path = new URL(url).pathname;
89
- // Use includes so this works regardless of any base-path prefix
90
- // (e.g. /partnerApi/v2/Order/createOrder).
91
- return nonIdempotentPaths.some((prefix) =>
92
- path.toLowerCase().includes(prefix.toLowerCase()),
93
- );
94
- } catch {
95
- return false;
96
- }
97
- }
98
-
99
- function isServerError(response: Response): boolean {
100
- return response.status >= 500;
101
- }
102
-
103
- function extractRequestId(json: string | null): string | null {
104
- if (!json) return null;
105
- try {
106
- const parsed: unknown = JSON.parse(json);
107
- if (
108
- parsed != null &&
109
- typeof parsed === "object" &&
110
- "requestId" in parsed &&
111
- typeof (parsed as Record<string, unknown>).requestId === "string"
112
- ) {
113
- return (parsed as Record<string, unknown>).requestId as string;
114
- }
115
- } catch {
116
- // Malformed body — nothing to extract.
117
- }
118
- return null;
119
- }
120
-
121
- function buildCancelUrl(url: string): string | null {
122
- try {
123
- const parsed = new URL(url);
124
- const path = parsed.pathname;
125
- const orderIndex = path.toLowerCase().indexOf("/order/");
126
- if (orderIndex < 0) return null;
127
-
128
- parsed.pathname =
129
- path.slice(0, orderIndex + "/Order/".length) + "cancelOrder";
130
- parsed.search = "";
131
- return parsed.toString();
132
- } catch {
133
- return null;
134
- }
135
- }
@@ -1,139 +0,0 @@
1
- import { ClientSecretCredential } from "@azure/identity";
2
- import { AzureIdentityAuthenticationProvider } from "@microsoft/kiota-authentication-azure";
3
- import {
4
- FetchRequestAdapter,
5
- KiotaClientFactory,
6
- } from "@microsoft/kiota-http-fetchlibrary";
7
- import { createClient, type Client } from "./generated/client";
8
- import {
9
- getBaseUrl,
10
- getScope,
11
- MissionControlEnvironment,
12
- } from "./missionControlEnvironment";
13
- import { createHandlers } from "./missionControlHandlers";
14
-
15
- /**
16
- * Fluent builder for creating a configured {@link Client} instance.
17
- */
18
- export class ClientBuilder {
19
- private _baseUrl: string = getBaseUrl(MissionControlEnvironment.Production);
20
- private _scope: string = getScope(MissionControlEnvironment.Production);
21
- private _tenantId: string = "13d084c1-d072-41f2-878b-c45ca721c9f6";
22
- private _clientId?: string;
23
- private _clientSecret?: string;
24
- private _defaultPartnerId?: string;
25
-
26
- /**
27
- * Sets the default `X-Partner-Id` header value sent with every request.
28
- *
29
- * Most partners operate under a single partner identity, so setting this once on the
30
- * builder means you never have to specify it per-request. When a request explicitly sets
31
- * the header that value takes precedence over the default configured here.
32
- *
33
- * @param partnerId The partner ID shown on the client credentials page in the portal.
34
- */
35
- withDefaultPartnerId(partnerId: string): this {
36
- if (!partnerId?.trim())
37
- throw new Error("partnerId must not be null or whitespace.");
38
- this._defaultPartnerId = partnerId;
39
- return this;
40
- }
41
-
42
- /**
43
- * Overrides the base URL used for all API requests.
44
- * Useful for pointing at a local development server or a custom endpoint.
45
- * When combined with {@link forEnvironment}, the last call wins.
46
- *
47
- * @param baseUrl The base URL, e.g. `http://localhost:5000`.
48
- */
49
- withBaseUrl(baseUrl: string): this {
50
- if (!baseUrl?.trim())
51
- throw new Error("baseUrl must not be null or whitespace.");
52
- this._baseUrl = baseUrl;
53
- return this;
54
- }
55
-
56
- /**
57
- * Overrides the OAuth scope used when acquiring tokens.
58
- * Useful when running against a local or custom environment whose app registration
59
- * differs from the well-known environments.
60
- * When combined with {@link forEnvironment}, the last call wins.
61
- *
62
- * @param scope The full scope URI, e.g. `api://<app-id>/.default`.
63
- */
64
- withScope(scope: string): this {
65
- if (!scope?.trim())
66
- throw new Error("scope must not be null or whitespace.");
67
- this._scope = scope;
68
- return this;
69
- }
70
-
71
- /**
72
- * Targets a well-known MissionControl environment. Sets the matching base URL and API scope together.
73
- * Defaults to {@link MissionControlEnvironment.Production} when not called.
74
- *
75
- * @param environment The target environment.
76
- */
77
- forEnvironment(environment: MissionControlEnvironment): this {
78
- this._baseUrl = getBaseUrl(environment);
79
- this._scope = getScope(environment);
80
- return this;
81
- }
82
-
83
- /**
84
- * Configures the client to authenticate using Azure AD client credentials (client secret flow).
85
- * The API scope is derived from the configured environment unless overridden by {@link withScope}.
86
- *
87
- * @param clientId The application (client) ID of the app registration.
88
- * @param clientSecret The client secret of the app registration.
89
- * @param tenantId The Azure AD tenant ID. Uses the PandoMC tenant when omitted.
90
- */
91
- withAzureAdClientCredentials(
92
- clientId: string,
93
- clientSecret: string,
94
- tenantId?: string,
95
- ): this {
96
- this._clientId = clientId;
97
- this._clientSecret = clientSecret;
98
- if (tenantId) this._tenantId = tenantId;
99
- return this;
100
- }
101
-
102
- /**
103
- * Builds and returns the configured {@link Client}.
104
- *
105
- * @throws {Error} When credentials have not been configured via {@link withAzureAdClientCredentials}.
106
- */
107
- build(): Client {
108
- if (!this._clientId || !this._clientSecret) {
109
- throw new Error(
110
- "No credentials configured. " +
111
- "Call withAzureAdClientCredentials() before calling build().",
112
- );
113
- }
114
-
115
- const credential = new ClientSecretCredential(
116
- this._tenantId,
117
- this._clientId,
118
- this._clientSecret,
119
- );
120
- const allowedHosts = new Set([new URL(this._baseUrl).host]);
121
- const authProvider = new AzureIdentityAuthenticationProvider(
122
- credential,
123
- [this._scope],
124
- undefined,
125
- allowedHosts,
126
- );
127
-
128
- const middlewares = createHandlers(this._defaultPartnerId);
129
- const httpClient = KiotaClientFactory.create(undefined, middlewares);
130
- const adapter = new FetchRequestAdapter(
131
- authProvider,
132
- undefined,
133
- undefined,
134
- httpClient,
135
- );
136
- adapter.baseUrl = this._baseUrl;
137
- return createClient(adapter);
138
- }
139
- }
@@ -1,34 +0,0 @@
1
- {
2
- "descriptionHash": "BAA14736D92DDDCC5514AEDDA4CBB363BD631F11F8F866137B467426B28CA83515C4F363D45106D48863C937E2D12297A0B4BB74245583675637DE9C235216EB",
3
- "descriptionLocation": "../../../../swagger.json",
4
- "lockFileVersion": "1.0.0",
5
- "kiotaVersion": "1.32.3",
6
- "clientClassName": "client",
7
- "typeAccessModifier": "Public",
8
- "clientNamespaceName": "missioncontrol.client",
9
- "language": "TypeScript",
10
- "usesBackingStore": false,
11
- "excludeBackwardCompatible": false,
12
- "includeAdditionalData": true,
13
- "disableSSLValidation": false,
14
- "serializers": [
15
- "Microsoft.Kiota.Serialization.Json.JsonSerializationWriterFactory",
16
- "Microsoft.Kiota.Serialization.Text.TextSerializationWriterFactory",
17
- "Microsoft.Kiota.Serialization.Form.FormSerializationWriterFactory",
18
- "Microsoft.Kiota.Serialization.Multipart.MultipartSerializationWriterFactory"
19
- ],
20
- "deserializers": [
21
- "Microsoft.Kiota.Serialization.Json.JsonParseNodeFactory",
22
- "Microsoft.Kiota.Serialization.Text.TextParseNodeFactory",
23
- "Microsoft.Kiota.Serialization.Form.FormParseNodeFactory"
24
- ],
25
- "structuredMimeTypes": [
26
- "application/json",
27
- "text/plain;q=0.9",
28
- "application/x-www-form-urlencoded;q=0.2",
29
- "multipart/form-data;q=0.1"
30
- ],
31
- "includePatterns": [],
32
- "excludePatterns": [],
33
- "disabledValidationRules": []
34
- }