qstd 0.3.26 → 0.3.27

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../../src/shared/api/domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import * as _t from "./types";
2
+ /**
3
+ * Detect whether a request path is an absolute URL (external request).
4
+ *
5
+ * This module's domain layer uses this check to decide when **not** to apply
6
+ * app-configured defaults (like `baseUrl` and auth headers). That protects us
7
+ * from accidentally leaking credentials to third-party URLs (e.g. S3 presigned
8
+ * uploads, CDN downloads).
9
+ *
10
+ * Note: This is intentionally simple (`startsWith("http")`) because the only
11
+ * "external" URLs we care about are `http://` and `https://` fetch targets.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * isAbsolute("/users"); // false
16
+ * isAbsolute("https://example.com"); // true
17
+ * isAbsolute("http://localhost:8787"); // true
18
+ * ```
19
+ */
20
+ export declare const isAbsolute: (path: string) => boolean;
21
+ /**
22
+ * Build the final request URL from a path, a `baseUrl`, and optional query params.
23
+ *
24
+ * The app calls the API client with "internal" paths like `/entries` and expects
25
+ * the module to consistently:
26
+ * - Prefix `baseUrl` for internal paths
27
+ * - Leave absolute URLs untouched (for presigned URLs, third-party services)
28
+ * - Encode query params safely and skip `null`/`undefined` values
29
+ *
30
+ * Centralizing this avoids scattered string-concatenation bugs and keeps request
31
+ * construction consistent across the app.
32
+ *
33
+ * @example
34
+ * ```ts
35
+ * prepareUrl("/users", {
36
+ * baseUrl: "https://api.example.com",
37
+ * params: { limit: 10, q: "alice", includeInactive: false, empty: null },
38
+ * });
39
+ * // "https://api.example.com/users?limit=10&q=alice&includeInactive=false"
40
+ *
41
+ * prepareUrl("https://s3.amazonaws.com/bucket/key", { baseUrl: "ignored" });
42
+ * // "https://s3.amazonaws.com/bucket/key"
43
+ * ```
44
+ */
45
+ export declare const prepareUrl: (path: string, props: {
46
+ baseUrl: string;
47
+ params?: _t.Params;
48
+ }) => string;
49
+ /**
50
+ * Produce the final request headers for a fetch call.
51
+ *
52
+ * This helper exists to keep `domain.ts` readable while enforcing a few
53
+ * non-obvious rules that prevent subtle integration bugs:
54
+ * - `headers: false` means **no headers at all** (escape hatch)
55
+ * - `FormData` must NOT set `Content-Type` (browser adds the multipart boundary)
56
+ * - `Blob` should use `blob.type` when present
57
+ * - `input: "json"`/`"text"` set the appropriate `Content-Type`
58
+ * - A header transform function can layer on top of module defaults
59
+ *
60
+ * Returning `undefined` (instead of `{}`) is intentional: it allows the caller
61
+ * to omit the `headers` field entirely in `fetch(...)`.
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * // Default JSON request
66
+ * await prepareHeaders({
67
+ * defaults: { Authorization: "Bearer token" },
68
+ * headersOption: true,
69
+ * input: "json",
70
+ * body: { hello: "world" },
71
+ * });
72
+ * // { Authorization: "...", "Content-Type": "application/json" }
73
+ *
74
+ * // Escape hatch: no headers at all
75
+ * await prepareHeaders({
76
+ * defaults: { Authorization: "Bearer token" },
77
+ * headersOption: false,
78
+ * input: "json",
79
+ * body: { hello: "world" },
80
+ * });
81
+ * // undefined
82
+ * ```
83
+ */
84
+ export declare const prepareHeaders: (props: {
85
+ defaults: _t.HeadersObject;
86
+ headersOption: true | false | _t.HeadersTransform | undefined;
87
+ input: _t.Input | undefined;
88
+ body: unknown;
89
+ }) => Promise<_t.HeadersObject | undefined>;
90
+ /**
91
+ * Convert a user-supplied body into a `fetch`-compatible `BodyInit`.
92
+ *
93
+ * The API client accepts `unknown` bodies to support multiple request styles
94
+ * (JSON APIs, multipart uploads, plain text payloads). This helper centralizes
95
+ * serialization rules so callers don't have to remember when to `JSON.stringify`
96
+ * or how to build `FormData`.
97
+ *
98
+ * @throws When `input: "text"` is specified but `body` is not a string.
99
+ *
100
+ * @example
101
+ * ```ts
102
+ * prepareBody({ a: 1 }, "json"); // '{"a":1}'
103
+ * prepareBody("hello", "text"); // "hello"
104
+ *
105
+ * // Convert a plain object to FormData
106
+ * const fd = prepareBody({ file, title: "cover" }, "form");
107
+ * fd instanceof FormData; // true
108
+ * ```
109
+ */
110
+ export declare const prepareBody: (body: unknown, input: _t.Input | undefined) => BodyInit | undefined;
111
+ /**
112
+ * Parse a `fetch` response into the configured output type.
113
+ *
114
+ * Why this exists:
115
+ * - Most app endpoints are JSON, but uploads/downloads need `blob`, `arrayBuffer`,
116
+ * or raw streaming bodies.
117
+ * - Progress reporting for downloads requires manually reading the response
118
+ * stream. When `onProgress` is provided, we buffer the response to compute
119
+ * `loaded/total/percent`.
120
+ *
121
+ * Notes:
122
+ * - For `output: "json"`, an empty response body returns `null`.
123
+ * - For `output: "stream"`, we return `response.body` (no buffering/parsing).
124
+ *
125
+ * @example
126
+ * ```ts
127
+ * const data = await parseResponse<{ id: string }>(response, "json");
128
+ *
129
+ * const blob = await parseResponse<Blob>(response, "blob", (p) => {
130
+ * console.log(p.percent);
131
+ * });
132
+ *
133
+ * const stream = await parseResponse<ReadableStream<Uint8Array> | null>(
134
+ * response,
135
+ * "stream"
136
+ * );
137
+ * ```
138
+ */
139
+ export declare const parseResponse: <Res, O extends _t.Output | undefined = undefined>(response: Response, output?: O, onProgress?: (progress: _t.Progress) => void) => Promise<_t.DataForOutput<Res, O>>;
140
+ //# sourceMappingURL=fns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fns.d.ts","sourceRoot":"","sources":["../../../src/shared/api/fns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAwB9B;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,YAA4B,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,UAAU,GACrB,MAAM,MAAM,EACZ,OAAO;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAA;CAAE,KAC7C,MA+BF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,eAAO,MAAM,cAAc,GAAU,OAAO;IAC1C,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC;IAC3B,aAAa,EAAE,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAC9D,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;CACf,KAAG,OAAO,CAAC,EAAE,CAAC,aAAa,GAAG,SAAS,CA6BvC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,WAAW,GACtB,MAAM,OAAO,EACb,OAAO,EAAE,CAAC,KAAK,GAAG,SAAS,KAC1B,QAAQ,GAAG,SAuBb,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,aAAa,GACxB,GAAG,EACH,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,SAAS,GAAG,SAAS,EAE3C,UAAU,QAAQ,EAClB,SAAS,CAAC,EACV,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,KAC3C,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,CAAC,CAiDlC,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * REST API client module for making HTTP requests.
3
+ *
4
+ * This module wraps fetch with sensible defaults and type-safe options.
5
+ * It eliminates boilerplate: base URL handling, JSON serialization,
6
+ * Content-Type headers, error parsing, and response transformation.
7
+ *
8
+ * ### Types vs runtime decoding (important)
9
+ * - **Generics (`Req`/`Res`) are compile-time only** (they do not exist at runtime).
10
+ * - The **`output` option is runtime** and controls how we decode the `Response`:
11
+ * - default / `"json"` → `response.text()` then `JSON.parse(...)`
12
+ * - `"blob"` → `response.blob()`
13
+ * - `"arrayBuffer"` → `response.arrayBuffer()`
14
+ * - `"stream"` → `response.body`
15
+ *
16
+ * The return type is derived from `output`. If you try to use a non-JSON response
17
+ * type (like `Blob`) without setting `output`, TypeScript will surface a helpful
18
+ * error type to prevent "type says blob, runtime parses JSON" bugs.
19
+ *
20
+ * Body types are auto-detected:
21
+ * - Objects → JSON (Content-Type: application/json)
22
+ * - FormData → multipart (browser sets Content-Type with boundary)
23
+ * - Blob → uses blob.type for Content-Type
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * // Configure once at app startup
28
+ * Api.configure({
29
+ * baseUrl: import.meta.env.VITE_API_URL,
30
+ * headers: () => ({ Authorization: `Bearer ${getToken()}` }),
31
+ * });
32
+ *
33
+ * // GET (JSON)
34
+ * const users = await Api.get<User[]>("/users"); // legacy shorthand
35
+ * const users2 = await Api.get<{ Res: User[] }>("/users"); // named type-args
36
+ *
37
+ * // POST (typed body + typed JSON response)
38
+ * const user = await Api.post<{ Req: { name: string }; Res: User }>(
39
+ * "/users",
40
+ * { name: "Alice" }
41
+ * );
42
+ *
43
+ * // Download (non-JSON) — use `output` (return type follows `output`)
44
+ * const image = await Api.get("/avatar.png", { output: "blob" }); // Blob
45
+ *
46
+ * // POST FormData (auto-detected)
47
+ * await Api.post("/upload", formData);
48
+ *
49
+ * // External URL (never includes configured default headers like auth)
50
+ * await Api.post(s3PresignedUrl, formData);
51
+ * ```
52
+ */
53
+ export { RestError } from "./types";
54
+ export type * from "./types";
55
+ export * from "./domain";
56
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,mBAAmB,SAAS,CAAC;AAC7B,cAAc,UAAU,CAAC"}
@@ -0,0 +1,102 @@
1
+ export type Method = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
2
+ export declare class RestError extends Error {
3
+ status: number;
4
+ body: string;
5
+ constructor(props: {
6
+ status: number;
7
+ body: string;
8
+ });
9
+ }
10
+ export type HeadersObject = Record<string, string>;
11
+ export type HeadersGetter = () => HeadersObject | Promise<HeadersObject>;
12
+ export type HeadersTransform = (defaults: HeadersObject) => HeadersObject | Promise<HeadersObject>;
13
+ export type Config = {
14
+ baseUrl: string;
15
+ headers?: HeadersObject | HeadersGetter;
16
+ };
17
+ export type Params = Record<string, string | number | boolean | undefined | null>;
18
+ export type Input = "json" | "form" | "text";
19
+ export type Output = "json" | "text" | "blob" | "stream" | "arrayBuffer";
20
+ /**
21
+ * Named generic type-args for API calls.
22
+ *
23
+ * This enables patterns like:
24
+ * - `Api.post<{ Req: CreateUser; Res: User }>("/users", body)`
25
+ * - `Api.post<{ Req: CreateUser }>("/users", body)` (response defaults to `unknown`)
26
+ * - `Api.get<{ Res: User[] }>("/users")`
27
+ *
28
+ * Calls can still use the legacy shorthand `Api.get<User[]>()` / `Api.post<User>()`
29
+ * where the generic is treated as the JSON response type.
30
+ *
31
+ * Important: these type arguments are compile-time only. For non-JSON responses
32
+ * (blob/arrayBuffer/stream), use the runtime `output` option (the return type
33
+ * is derived from `output`).
34
+ */
35
+ export type TypeArgs = {
36
+ Req?: unknown;
37
+ Res?: unknown;
38
+ };
39
+ type IsTypeArgs<T> = T extends object ? "Req" extends keyof T ? true : "Res" extends keyof T ? true : false : false;
40
+ /** Extract request/body type from either `TypeArgs` or legacy shorthand. */
41
+ export type ReqFrom<T> = IsTypeArgs<T> extends true ? T extends {
42
+ Req?: infer Req;
43
+ } ? Req : unknown : unknown;
44
+ /** Extract JSON response type from either `TypeArgs` or legacy shorthand. */
45
+ export type ResFrom<T> = IsTypeArgs<T> extends true ? "Res" extends keyof T ? T extends {
46
+ Res?: infer Res;
47
+ } ? Res : unknown : unknown : T;
48
+ /**
49
+ * Map the runtime `output` option to the parsed value type.
50
+ *
51
+ * - `output: "json"` (or omitted) → `Res`
52
+ * - `output: "blob"` → `Blob`
53
+ * - etc.
54
+ *
55
+ * This makes `output` the single source of truth for non-JSON response shapes,
56
+ * while `Res` describes the JSON-decoded shape when `output` is omitted/`"json"`.
57
+ */
58
+ export type DataForOutput<Res, O extends Output | undefined> = O extends "text" ? string : O extends "blob" ? Blob : O extends "stream" ? ReadableStream<Uint8Array> | null : O extends "arrayBuffer" ? ArrayBuffer : Res;
59
+ /**
60
+ * Types that cannot be produced by JSON parsing and therefore require an explicit `output`.
61
+ *
62
+ * (We intentionally do NOT include `string` here because JSON can legitimately parse to a
63
+ * string, e.g. `"hello"`.)
64
+ */
65
+ export type NonJsonDecoded = Blob | ArrayBuffer | ReadableStream<Uint8Array>;
66
+ /**
67
+ * A helpful compile-time error shape when a non-JSON decoded type is requested without
68
+ * specifying the matching `output` option.
69
+ */
70
+ export type OutputRequiredError = {
71
+ __api_output_required: "Set opts.output to 'blob' | 'arrayBuffer' | 'stream' (or use the default JSON output).";
72
+ };
73
+ /** If `Res` contains a non-JSON decoded type, replace it with an error helper type. */
74
+ export type JsonRes<Res> = [Extract<Res, NonJsonDecoded>] extends [never] ? Res : OutputRequiredError;
75
+ export type Progress = {
76
+ loaded: number;
77
+ total: number;
78
+ percent: number;
79
+ };
80
+ export type Options<Res, Return = Res, O extends Output | undefined = undefined> = {
81
+ headers?: true | false | HeadersTransform;
82
+ params?: Params;
83
+ output?: O;
84
+ signal?: AbortSignal;
85
+ onProgress?: (progress: Progress) => void;
86
+ onSuccess?: (data: DataForOutput<Res, O>) => Return;
87
+ onError?: (error: RestError) => Return;
88
+ };
89
+ export type BodyOptions<Req = unknown, Res = unknown, Return = Res, O extends Output | undefined = undefined> = {
90
+ body?: Req;
91
+ input?: Input;
92
+ headers?: true | false | HeadersTransform;
93
+ params?: Params;
94
+ output?: O;
95
+ signal?: AbortSignal;
96
+ onProgress?: (progress: Progress) => void;
97
+ onSuccess?: (data: DataForOutput<Res, O>) => Return;
98
+ onError?: (error: RestError) => Return;
99
+ };
100
+ export type BodylessOptions<Req = unknown, Res = unknown, Return = Res, O extends Output | undefined = undefined> = Omit<BodyOptions<Req, Res, Return, O>, "body">;
101
+ export {};
102
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/api/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qstd",
3
- "version": "0.3.26",
3
+ "version": "0.3.27",
4
4
  "description": "Standard Block component and utilities library with Panda CSS",
5
5
  "author": "malin1",
6
6
  "license": "MIT",