@putdotio/sdk 9.1.2 → 9.1.3

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/README.md CHANGED
@@ -71,7 +71,7 @@ const duration = secondsToReadableDuration(444);
71
71
 
72
72
  ```ts
73
73
  import { Effect } from "effect";
74
- import { createPutioSdkEffectClient, makePutioSdkLayer } from "@putdotio/sdk";
74
+ import { createPutioSdkEffectClient, makePutioSdkLiveLayer } from "@putdotio/sdk";
75
75
 
76
76
  const sdk = createPutioSdkEffectClient();
77
77
 
@@ -80,17 +80,14 @@ const program = sdk.files
80
80
  per_page: 20,
81
81
  total: 1,
82
82
  })
83
- .pipe(
84
- Effect.provide(
85
- makePutioSdkLayer({
86
- accessToken: process.env.PUTIO_TOKEN!,
87
- }),
88
- ),
89
- );
83
+ .pipe(Effect.provide(makePutioSdkLiveLayer({ accessToken: process.env.PUTIO_TOKEN! })));
90
84
 
91
85
  const result = await Effect.runPromise(program);
92
86
  ```
93
87
 
88
+ `makePutioSdkLiveLayer(...)` provides both the SDK config and the default fetch-backed `HttpClient`.
89
+ Use `makePutioSdkLayer(...)` only when you want to supply your own `HttpClient` service.
90
+
94
91
  ## Side-By-Side Usage
95
92
 
96
93
  Both client styles expose the same domain surface:
@@ -161,6 +158,7 @@ The package is designed around standard Web APIs. Host runtimes should provide:
161
158
  - `URL` and `URLSearchParams`
162
159
  - `AbortController`
163
160
  - `FormData`
161
+ - `btoa` for username/password auth flows such as `auth.login(...)`
164
162
 
165
163
  For upload flows, the host should also provide file-compatible inputs such as `File` or `Blob`.
166
164
 
@@ -203,7 +201,7 @@ Effect consumers keep errors in the typed error channel instead of throwing:
203
201
 
204
202
  ```ts
205
203
  import { Effect } from "effect";
206
- import { createPutioSdkEffectClient, makePutioSdkLayer } from "@putdotio/sdk";
204
+ import { createPutioSdkEffectClient, makePutioSdkLiveLayer } from "@putdotio/sdk";
207
205
 
208
206
  const sdk = createPutioSdkEffectClient();
209
207
 
@@ -220,11 +218,7 @@ const handled = sdk.files
220
218
 
221
219
  return Effect.fail(error);
222
220
  }),
223
- Effect.provide(
224
- makePutioSdkLayer({
225
- accessToken: process.env.PUTIO_TOKEN!,
226
- }),
227
- ),
221
+ Effect.provide(makePutioSdkLiveLayer({ accessToken: process.env.PUTIO_TOKEN! })),
228
222
  );
229
223
  ```
230
224
 
@@ -269,10 +263,10 @@ The Effect client also works well when you want the canonical typed API:
269
263
  ```ts
270
264
  import { useQuery } from "@tanstack/react-query";
271
265
  import { Effect } from "effect";
272
- import { createPutioSdkEffectClient, makePutioSdkLayer } from "@putdotio/sdk";
266
+ import { createPutioSdkEffectClient, makePutioSdkLiveLayer } from "@putdotio/sdk";
273
267
 
274
268
  const sdk = createPutioSdkEffectClient();
275
- const sdkLayer = makePutioSdkLayer({
269
+ const sdkLayer = makePutioSdkLiveLayer({
276
270
  accessToken: token,
277
271
  });
278
272
 
@@ -1,5 +1,5 @@
1
- import { Headers, HttpClient, HttpClientRequest, HttpClientResponse } from "@effect/platform";
2
1
  import { Context, Data, Effect, Layer, Option, Schema } from "effect";
2
+ import { FetchHttpClient, Headers, HttpClient, HttpClientRequest, HttpClientResponse } from "@effect/platform";
3
3
  //#region src/core/errors.ts
4
4
  const PutioErrorEnvelopeSchema = Schema.Struct({
5
5
  error_message: Schema.optional(Schema.String),
@@ -8,7 +8,10 @@ const PutioErrorEnvelopeSchema = Schema.Struct({
8
8
  details: Schema.optional(Schema.Unknown)
9
9
  });
10
10
  const isKnownContractMatch = (contract, error) => {
11
- if (contract.errorType !== void 0) return error.body.error_type === contract.errorType;
11
+ if (contract.errorType !== void 0) {
12
+ if (error.body.error_type !== contract.errorType) return false;
13
+ return contract.statusCode === void 0 || error.status === contract.statusCode;
14
+ }
12
15
  if (contract.statusCode !== void 0) return error.status === contract.statusCode;
13
16
  return false;
14
17
  };
@@ -99,6 +102,7 @@ const makePutioSdkConfig = (config) => ({
99
102
  webAppUrl: config.webAppUrl ?? "https://app.put.io"
100
103
  });
101
104
  const makePutioSdkLayer = (config) => Layer.succeed(PutioSdkConfig, makePutioSdkConfig(config));
105
+ const makePutioSdkLiveLayer = (config) => Layer.mergeAll(makePutioSdkLayer(config), FetchHttpClient.layer);
102
106
  const buildPutioUrl = (baseUrl, path, query) => {
103
107
  const url = new URL(path, baseUrl);
104
108
  if (query) {
@@ -173,6 +177,6 @@ const toCursorSelectionForm = (selection, idsFieldName) => {
173
177
  };
174
178
  };
175
179
  //#endregion
176
- export { mapTransportError as A, PutioValidationError as C, makeResponseError as D, fallbackPutioErrorEnvelope as E, responseRateLimitHeaders as M, withOperationErrors as N, mapConfigurationError as O, PutioTransportError as S, definePutioOperationErrorSpec as T, PutioAuthError as _, buildPutioUrl as a, PutioOperationError as b, requestArrayBuffer as c, selectJsonField as d, selectJsonFields as f, PutioApiError as g, DEFAULT_PUTIO_WEB_APP_URL as h, PutioSdkConfig as i, parseErrorBody as j, mapDecodeErrorToValidationError as k, requestJson as l, DEFAULT_PUTIO_UPLOAD_BASE_URL as m, toCursorSelectionForm as n, makePutioSdkConfig as o, DEFAULT_PUTIO_API_BASE_URL as p, OkResponseSchema as r, makePutioSdkLayer as s, joinCsv as t, requestVoid as u, PutioConfigurationError as v, decodePutioErrorEnvelope as w, PutioRateLimitError as x, PutioErrorEnvelopeSchema as y };
180
+ export { mapDecodeErrorToValidationError as A, PutioTransportError as C, fallbackPutioErrorEnvelope as D, definePutioOperationErrorSpec as E, parseErrorBody as M, responseRateLimitHeaders as N, makeResponseError as O, withOperationErrors as P, PutioRateLimitError as S, decodePutioErrorEnvelope as T, PutioApiError as _, buildPutioUrl as a, PutioErrorEnvelopeSchema as b, makePutioSdkLiveLayer as c, requestVoid as d, selectJsonField as f, DEFAULT_PUTIO_WEB_APP_URL as g, DEFAULT_PUTIO_UPLOAD_BASE_URL as h, PutioSdkConfig as i, mapTransportError as j, mapConfigurationError as k, requestArrayBuffer as l, DEFAULT_PUTIO_API_BASE_URL as m, toCursorSelectionForm as n, makePutioSdkConfig as o, selectJsonFields as p, OkResponseSchema as r, makePutioSdkLayer as s, joinCsv as t, requestJson as u, PutioAuthError as v, PutioValidationError as w, PutioOperationError as x, PutioConfigurationError as y };
177
181
 
178
- //# sourceMappingURL=forms-DM_sjuyz.js.map
182
+ //# sourceMappingURL=forms-BoZMwEUj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms-BoZMwEUj.js","names":[],"sources":["../src/core/errors.ts","../src/core/defaults.ts","../src/core/http.ts","../src/core/forms.ts"],"sourcesContent":["import { Headers } from \"@effect/platform\";\nimport { Data, Effect, Option, Schema } from \"effect\";\n\nexport const PutioErrorEnvelopeSchema = Schema.Struct({\n error_message: Schema.optional(Schema.String),\n error_type: Schema.optional(Schema.String),\n status_code: Schema.optional(Schema.Number.pipe(Schema.int())),\n details: Schema.optional(Schema.Unknown),\n});\n\nexport type PutioErrorEnvelope = Schema.Schema.Type<typeof PutioErrorEnvelopeSchema>;\n\nexport interface PutioKnownErrorContract<\n TType extends string = string,\n TStatus extends number = number,\n> {\n readonly errorType?: TType;\n readonly statusCode?: TStatus;\n}\n\ntype ContractErrorType<TContract extends PutioKnownErrorContract> =\n TContract extends PutioKnownErrorContract<infer TType, number> ? TType : never;\n\ntype ContractStatusCode<TContract extends PutioKnownErrorContract> =\n TContract extends PutioKnownErrorContract<string, infer TStatus> ? TStatus : never;\n\nexport type PutioTypedErrorEnvelope<TContract extends PutioKnownErrorContract> = Omit<\n PutioErrorEnvelope,\n \"error_message\" | \"error_type\" | \"status_code\"\n> & {\n readonly error_message?: string;\n readonly error_type?: [ContractErrorType<TContract>] extends [never]\n ? string\n : ContractErrorType<TContract>;\n readonly status_code?: [ContractStatusCode<TContract>] extends [never]\n ? number\n : ContractStatusCode<TContract>;\n};\n\nexport interface PutioOperationErrorSpec<\n TDomain extends string = string,\n TOperation extends string = string,\n TContracts extends ReadonlyArray<PutioKnownErrorContract> =\n ReadonlyArray<PutioKnownErrorContract>,\n> {\n readonly domain: TDomain;\n readonly operation: TOperation;\n readonly knownErrors: TContracts;\n}\n\ntype OperationContractOf<TSpec extends PutioOperationErrorSpec> = TSpec[\"knownErrors\"][number];\n\ntype PutioOperationErrorReason<TContract extends PutioKnownErrorContract> = TContract extends {\n readonly errorType: infer TType extends string;\n}\n ? {\n readonly kind: \"error_type\";\n readonly errorType: TType;\n }\n : TContract extends { readonly statusCode: infer TStatus extends number }\n ? {\n readonly kind: \"status_code\";\n readonly statusCode: TStatus;\n }\n : never;\n\ntype PutioMatchableKnownErrorContract =\n | {\n readonly errorType: string;\n readonly statusCode?: number;\n }\n | {\n readonly errorType?: undefined;\n readonly statusCode: number;\n };\n\nconst isKnownContractMatch = <TContract extends PutioKnownErrorContract>(\n contract: TContract,\n error: PutioApiError | PutioAuthError,\n): contract is Extract<TContract, PutioMatchableKnownErrorContract> => {\n if (contract.errorType !== undefined) {\n if (error.body.error_type !== contract.errorType) {\n return false;\n }\n\n return contract.statusCode === undefined || error.status === contract.statusCode;\n }\n\n if (contract.statusCode !== undefined) {\n return error.status === contract.statusCode;\n }\n\n return false;\n};\n\nconst isMatchableApiError = (error: PutioSdkError): error is PutioApiError | PutioAuthError =>\n error._tag === \"PutioApiError\" || error._tag === \"PutioAuthError\";\n\nfunction toOperationReason<TType extends string>(contract: {\n readonly errorType: TType;\n readonly statusCode?: number;\n}): {\n readonly kind: \"error_type\";\n readonly errorType: TType;\n};\nfunction toOperationReason<TStatus extends number>(contract: {\n readonly errorType?: undefined;\n readonly statusCode: TStatus;\n}): {\n readonly kind: \"status_code\";\n readonly statusCode: TStatus;\n};\nfunction toOperationReason(contract: PutioMatchableKnownErrorContract) {\n if (contract.errorType !== undefined) {\n return {\n kind: \"error_type\",\n errorType: contract.errorType,\n };\n }\n\n return {\n kind: \"status_code\",\n statusCode: contract.statusCode,\n };\n}\n\nexport class PutioTransportError extends Data.TaggedError(\"PutioTransportError\")<{\n readonly cause: unknown;\n}> {}\n\nexport class PutioConfigurationError extends Data.TaggedError(\"PutioConfigurationError\")<{\n readonly cause: unknown;\n}> {}\n\nexport class PutioValidationError extends Data.TaggedError(\"PutioValidationError\")<{\n readonly cause: unknown;\n}> {}\n\nexport class PutioApiError extends Data.TaggedError(\"PutioApiError\")<{\n readonly status: number;\n readonly body: PutioErrorEnvelope;\n}> {}\n\nexport class PutioAuthError extends Data.TaggedError(\"PutioAuthError\")<{\n readonly status: number;\n readonly body: PutioErrorEnvelope;\n}> {}\n\nexport class PutioRateLimitError extends Data.TaggedError(\"PutioRateLimitError\")<{\n readonly status: number;\n readonly body: PutioErrorEnvelope;\n readonly action?: string;\n readonly id?: string;\n readonly limit?: string;\n readonly remaining?: string;\n readonly retryAfter?: string;\n readonly reset?: string;\n}> {}\n\nexport class PutioOperationError<\n TDomain extends string,\n TOperation extends string,\n TContract extends PutioKnownErrorContract,\n> extends Data.TaggedError(\"PutioOperationError\")<{\n readonly body: PutioTypedErrorEnvelope<TContract>;\n readonly contract: TContract;\n readonly domain: TDomain;\n readonly operation: TOperation;\n readonly reason: PutioOperationErrorReason<TContract>;\n readonly status: number;\n}> {}\n\nexport type PutioSdkError =\n | PutioConfigurationError\n | PutioTransportError\n | PutioValidationError\n | PutioApiError\n | PutioAuthError\n | PutioRateLimitError;\n\nexport type PutioUnhandledSdkError =\n | PutioConfigurationError\n | PutioTransportError\n | PutioValidationError\n | PutioApiError\n | PutioAuthError\n | PutioRateLimitError;\n\nexport type PutioOperationErrorFromSpec<TSpec extends PutioOperationErrorSpec> =\n PutioOperationError<TSpec[\"domain\"], TSpec[\"operation\"], OperationContractOf<TSpec>>;\n\nexport type PutioOperationFailure<TSpec extends PutioOperationErrorSpec> =\n | PutioUnhandledSdkError\n | PutioOperationErrorFromSpec<TSpec>;\n\nexport const definePutioOperationErrorSpec = <\n const TDomain extends string,\n const TOperation extends string,\n const TContracts extends ReadonlyArray<PutioKnownErrorContract>,\n>(\n spec: PutioOperationErrorSpec<TDomain, TOperation, TContracts>,\n) => spec;\n\nexport const decodePutioErrorEnvelope = Schema.decodeUnknown(PutioErrorEnvelopeSchema);\n\nexport const fallbackPutioErrorEnvelope = (status: number): PutioErrorEnvelope => ({\n error_message: `put.io API request failed with status ${status}`,\n status_code: status,\n});\n\nexport const responseRateLimitHeaders = (headers: Headers.Headers) => ({\n action: Option.getOrUndefined(Headers.get(headers, \"x-ratelimit-action\")),\n id: Option.getOrUndefined(Headers.get(headers, \"x-ratelimit-id\")),\n limit: Option.getOrUndefined(Headers.get(headers, \"x-ratelimit-limit\")),\n remaining: Option.getOrUndefined(Headers.get(headers, \"x-ratelimit-remaining\")),\n retryAfter: Option.getOrUndefined(Headers.get(headers, \"retry-after\")),\n reset: Option.getOrUndefined(Headers.get(headers, \"x-ratelimit-reset\")),\n});\n\nexport const mapDecodeErrorToValidationError = (cause: unknown) =>\n new PutioValidationError({ cause });\n\nexport const mapConfigurationError = (cause: unknown) => new PutioConfigurationError({ cause });\n\nexport const mapTransportError = (cause: unknown) => new PutioTransportError({ cause });\n\nexport const makeResponseError = (\n status: number,\n headers: Headers.Headers,\n body: PutioErrorEnvelope,\n): PutioSdkError => {\n if (status === 429) {\n return new PutioRateLimitError({\n status,\n body,\n ...responseRateLimitHeaders(headers),\n });\n }\n\n if (status === 401 || status === 403) {\n return new PutioAuthError({ status, body });\n }\n\n return new PutioApiError({ status, body });\n};\n\nexport const parseErrorBody = (status: number, json: unknown) =>\n decodePutioErrorEnvelope(json).pipe(\n Effect.orElseSucceed(() => fallbackPutioErrorEnvelope(status)),\n );\n\nexport function withOperationErrors<\n A,\n E extends PutioSdkError,\n R,\n const TDomain extends string,\n const TOperation extends string,\n const TContracts extends ReadonlyArray<PutioKnownErrorContract>,\n>(\n effect: Effect.Effect<A, E, R>,\n spec: PutioOperationErrorSpec<TDomain, TOperation, TContracts>,\n): Effect.Effect<A, E | PutioOperationError<TDomain, TOperation, TContracts[number]>, R>;\nexport function withOperationErrors<\n const TDomain extends string,\n const TOperation extends string,\n const TContracts extends ReadonlyArray<PutioKnownErrorContract>,\n>(\n spec: PutioOperationErrorSpec<TDomain, TOperation, TContracts>,\n): <A, E extends PutioSdkError, R>(\n effect: Effect.Effect<A, E, R>,\n) => Effect.Effect<A, E | PutioOperationError<TDomain, TOperation, TContracts[number]>, R>;\nexport function withOperationErrors<\n A,\n E extends PutioSdkError,\n R,\n const TDomain extends string,\n const TOperation extends string,\n const TContracts extends ReadonlyArray<PutioKnownErrorContract>,\n>(\n effectOrSpec: Effect.Effect<A, E, R> | PutioOperationErrorSpec<TDomain, TOperation, TContracts>,\n maybeSpec?: PutioOperationErrorSpec<TDomain, TOperation, TContracts>,\n):\n | Effect.Effect<A, E | PutioOperationError<TDomain, TOperation, TContracts[number]>, R>\n | (<A2, E2 extends PutioSdkError, R2>(\n effect: Effect.Effect<A2, E2, R2>,\n ) => Effect.Effect<A2, E2 | PutioOperationError<TDomain, TOperation, TContracts[number]>, R2>) {\n if (maybeSpec === undefined) {\n const spec = effectOrSpec as PutioOperationErrorSpec<TDomain, TOperation, TContracts>;\n\n return <A2, E2 extends PutioSdkError, R2>(effect: Effect.Effect<A2, E2, R2>) =>\n withOperationErrors(effect, spec);\n }\n\n const effect = effectOrSpec as Effect.Effect<A, E, R>;\n const spec = maybeSpec;\n\n return effect.pipe(\n Effect.mapError((error) => {\n if (!isMatchableApiError(error)) {\n return error;\n }\n\n const contract = spec.knownErrors.find((candidate) => isKnownContractMatch(candidate, error));\n\n if (!contract) {\n return error;\n }\n\n return new PutioOperationError({\n body: error.body as PutioTypedErrorEnvelope<TContracts[number]>,\n contract,\n domain: spec.domain,\n operation: spec.operation,\n reason: toOperationReason(contract),\n status: error.status,\n });\n }),\n );\n}\n","export const DEFAULT_PUTIO_API_BASE_URL = \"https://api.put.io\";\nexport const DEFAULT_PUTIO_UPLOAD_BASE_URL = \"https://upload.put.io\";\nexport const DEFAULT_PUTIO_WEB_APP_URL = \"https://app.put.io\";\n","import {\n FetchHttpClient,\n Headers,\n HttpClient,\n HttpClientRequest,\n HttpClientResponse,\n} from \"@effect/platform\";\nimport { Context, Effect, Layer, Schema } from \"effect\";\n\nimport {\n DEFAULT_PUTIO_API_BASE_URL,\n DEFAULT_PUTIO_UPLOAD_BASE_URL,\n DEFAULT_PUTIO_WEB_APP_URL,\n} from \"./defaults.js\";\nimport {\n fallbackPutioErrorEnvelope,\n makeResponseError,\n mapConfigurationError,\n mapDecodeErrorToValidationError,\n mapTransportError,\n parseErrorBody,\n type PutioSdkError,\n} from \"./errors.js\";\n\nexport type PutioQueryValue = string | number | boolean | null | undefined;\n\nexport type PutioQuery = Readonly<Record<string, PutioQueryValue>>;\n\nexport interface PutioSdkConfigShape {\n readonly accessToken?: string;\n readonly baseUrl?: string | URL;\n readonly uploadBaseUrl?: string | URL;\n readonly webAppUrl?: string | URL;\n}\n\nexport class PutioSdkConfig extends Context.Tag(\"PutioSdkConfig\")<\n PutioSdkConfig,\n PutioSdkConfigShape\n>() {}\n\nexport type PutioSdkContext = PutioSdkConfig | HttpClient.HttpClient;\n\nexport const makePutioSdkConfig = (config: PutioSdkConfigShape): PutioSdkConfigShape => ({\n accessToken: config.accessToken,\n baseUrl: config.baseUrl ?? DEFAULT_PUTIO_API_BASE_URL,\n uploadBaseUrl: config.uploadBaseUrl ?? DEFAULT_PUTIO_UPLOAD_BASE_URL,\n webAppUrl: config.webAppUrl ?? DEFAULT_PUTIO_WEB_APP_URL,\n});\n\nexport const makePutioSdkLayer = (config: PutioSdkConfigShape) =>\n Layer.succeed(PutioSdkConfig, makePutioSdkConfig(config));\n\nexport const makePutioSdkLiveLayer = (config: PutioSdkConfigShape) =>\n Layer.mergeAll(makePutioSdkLayer(config), FetchHttpClient.layer);\n\nexport const buildPutioUrl = (baseUrl: string | URL, path: string, query?: PutioQuery): string => {\n const url = new URL(path, baseUrl);\n\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n return url.toString();\n};\n\nexport const OkResponseSchema = Schema.Struct({\n status: Schema.Literal(\"OK\"),\n});\n\nexport type PutioAuth =\n | { readonly type: \"config-token\" }\n | { readonly type: \"token\"; readonly token: string }\n | { readonly type: \"basic\"; readonly username: string; readonly password: string }\n | { readonly type: \"none\" };\n\ntype PutioRequestBody =\n | { readonly type: \"none\" }\n | { readonly type: \"json\"; readonly value: unknown }\n | { readonly type: \"form\"; readonly value: Record<string, unknown> }\n | { readonly type: \"form-data\"; readonly value: FormData };\n\ninterface PutioRequestOptions {\n readonly method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n readonly path: string;\n readonly baseUrl?: string | URL;\n readonly query?: PutioQuery;\n readonly headers?: Headers.Input;\n readonly auth?: PutioAuth;\n readonly body?: PutioRequestBody;\n}\n\nconst isSuccessStatus = (status: number) => status >= 200 && status < 300;\n\nconst decodeSuccessJson = <A, I, R>(\n schema: Schema.Schema<A, I, R>,\n response: HttpClientResponse.HttpClientResponse,\n) =>\n HttpClientResponse.schemaBodyJson(schema)(response).pipe(\n Effect.mapError(mapDecodeErrorToValidationError),\n );\n\nconst decodeFailure = (response: HttpClientResponse.HttpClientResponse, headers: Headers.Headers) =>\n response.json.pipe(\n Effect.flatMap((json) => parseErrorBody(response.status, json)),\n Effect.orElseSucceed(() => fallbackPutioErrorEnvelope(response.status)),\n Effect.map((body) => makeResponseError(response.status, headers, body)),\n );\n\nconst toBasicAuthorization = (username: string, password: string) => {\n if (typeof globalThis.btoa === \"function\") {\n return `Basic ${globalThis.btoa(`${username}:${password}`)}`;\n }\n\n throw mapConfigurationError(\n \"This runtime does not provide btoa(), so Basic auth cannot be encoded safely\",\n );\n};\n\nconst resolveAuthorization = (\n config: PutioSdkConfigShape,\n auth: PutioAuth | undefined,\n): Effect.Effect<string | undefined, PutioSdkError> => {\n const resolvedAuth = auth ?? { type: \"config-token\" as const };\n\n switch (resolvedAuth.type) {\n case \"none\":\n return Effect.succeed(undefined);\n case \"token\":\n return Effect.succeed(`Token ${resolvedAuth.token}`);\n case \"basic\":\n return Effect.try({\n try: () => toBasicAuthorization(resolvedAuth.username, resolvedAuth.password),\n catch: mapConfigurationError,\n });\n case \"config-token\":\n if (!config.accessToken) {\n return Effect.fail(\n mapConfigurationError(\n \"This endpoint requires an access token, but PutioSdkConfig.accessToken is missing\",\n ),\n );\n }\n\n return Effect.succeed(`Token ${config.accessToken}`);\n }\n};\n\nconst normalizeFormValue = (value: unknown): string => {\n if (value === null || value === undefined) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n return value;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n return JSON.stringify(value);\n};\n\nconst withBody = (\n request: HttpClientRequest.HttpClientRequest,\n body: PutioRequestBody,\n): Effect.Effect<HttpClientRequest.HttpClientRequest, PutioSdkError> => {\n switch (body.type) {\n case \"none\":\n return Effect.succeed(request);\n case \"json\":\n return HttpClientRequest.bodyJson(request, body.value).pipe(\n Effect.mapError(mapDecodeErrorToValidationError),\n );\n case \"form\":\n return Effect.succeed(\n HttpClientRequest.bodyUrlParams(\n request,\n Object.fromEntries(\n Object.entries(body.value).flatMap(([key, value]) =>\n value === undefined ? [] : [[key, normalizeFormValue(value)]],\n ),\n ),\n ),\n );\n case \"form-data\":\n return Effect.succeed(HttpClientRequest.bodyFormData(request, body.value));\n }\n};\n\nconst makeRequest = (url: string, options: PutioRequestOptions, authorization?: string) =>\n Effect.gen(function* () {\n const headers = authorization\n ? Headers.set(Headers.fromInput(options.headers), \"authorization\", authorization)\n : Headers.fromInput(options.headers);\n\n const body = options.body ?? { type: \"none\" as const };\n const request = HttpClientRequest.make(options.method)(url, {\n acceptJson: true,\n headers,\n });\n\n return yield* withBody(request, body);\n });\n\nconst executeRequest = (options: PutioRequestOptions) =>\n Effect.gen(function* () {\n const config = yield* PutioSdkConfig;\n const authorization = yield* resolveAuthorization(config, options.auth);\n const url = buildPutioUrl(\n options.baseUrl ?? config.baseUrl ?? DEFAULT_PUTIO_API_BASE_URL,\n options.path,\n options.query,\n );\n const request = yield* makeRequest(url, options, authorization);\n\n return yield* HttpClient.execute(request).pipe(Effect.mapError(mapTransportError));\n });\n\nexport const requestJson = <A, I, R>(\n schema: Schema.Schema<A, I, R>,\n options: PutioRequestOptions,\n): Effect.Effect<A, PutioSdkError, PutioSdkContext | R> =>\n executeRequest(options).pipe(\n Effect.flatMap((response) =>\n isSuccessStatus(response.status)\n ? decodeSuccessJson(schema, response)\n : decodeFailure(response, response.headers).pipe(Effect.flatMap(Effect.fail)),\n ),\n );\n\nexport const selectJsonField =\n <K extends string>(field: K) =>\n <A extends Record<K, unknown>, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A[K], E, R> =>\n effect.pipe(Effect.map((value) => value[field]));\n\nexport const selectJsonFields =\n <const K extends readonly string[]>(...fields: K) =>\n <A extends Record<K[number], unknown>, E, R>(\n effect: Effect.Effect<A, E, R>,\n ): Effect.Effect<Pick<A, K[number]>, E, R> =>\n effect.pipe(\n Effect.map(\n (value) =>\n Object.fromEntries(fields.map((field) => [field, value[field]])) as Pick<A, K[number]>,\n ),\n );\n\nexport const requestArrayBuffer = (\n options: PutioRequestOptions,\n): Effect.Effect<Uint8Array, PutioSdkError, PutioSdkContext> =>\n executeRequest(options).pipe(\n Effect.flatMap((response) =>\n isSuccessStatus(response.status)\n ? response.arrayBuffer.pipe(\n Effect.mapError(mapTransportError),\n Effect.map((buffer) => new Uint8Array(buffer)),\n )\n : decodeFailure(response, response.headers).pipe(Effect.flatMap(Effect.fail)),\n ),\n );\n\nexport const requestVoid = (\n options: PutioRequestOptions,\n): Effect.Effect<void, PutioSdkError, PutioSdkContext> =>\n executeRequest(options).pipe(\n Effect.flatMap((response) =>\n isSuccessStatus(response.status)\n ? Effect.void\n : decodeFailure(response, response.headers).pipe(Effect.flatMap(Effect.fail)),\n ),\n );\n","type CsvValue = string | number;\n\nexport interface CursorSelectionInput<TValue extends CsvValue = number> {\n readonly cursor?: string;\n readonly excludeIds?: ReadonlyArray<TValue>;\n readonly ids?: ReadonlyArray<TValue>;\n}\n\nexport const joinCsv = <TValue extends CsvValue>(\n values: ReadonlyArray<TValue> | undefined,\n): string | undefined => (values && values.length > 0 ? values.join(\",\") : undefined);\n\nexport const toCursorSelectionForm = <\n TValue extends CsvValue,\n const TIdsFieldName extends string = \"file_ids\",\n>(\n selection: CursorSelectionInput<TValue>,\n idsFieldName?: TIdsFieldName,\n): {\n readonly cursor?: string;\n readonly exclude_ids?: string;\n} & Record<TIdsFieldName, string | undefined> => {\n const resolvedIdsFieldName = (idsFieldName ?? \"file_ids\") as TIdsFieldName;\n\n return {\n cursor: selection.cursor,\n exclude_ids: joinCsv(selection.excludeIds),\n [resolvedIdsFieldName]: joinCsv(selection.ids),\n } as {\n readonly cursor?: string;\n readonly exclude_ids?: string;\n } & Record<TIdsFieldName, string | undefined>;\n};\n"],"mappings":"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"}