@moinax/orc 0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/index.ts","../../src/runtime/errors.ts","../../src/runtime/Client.ts","../../src/runtime/Resource.ts","../../src/runtime/parseSchema.ts","../../src/runtime/date-schemas.ts"],"sourcesContent":["export { Client } from './Client';\nexport { Resource } from './Resource';\nexport { ClientError, ParseError, formatError } from './errors';\nexport { parseSchema } from './parseSchema';\nexport {\n stringToDateSchema,\n stringToDaySchema,\n dateToStringSchema,\n dayToStringSchema,\n} from './date-schemas';\nexport type { DateString, DayString } from './date-schemas';\nexport type { ClientOptions, ClientRequestInit, DownloadDTO, Logger } from './types';\n","import {\n ZodError,\n ZodInvalidLiteralIssue,\n ZodInvalidTypeIssue,\n ZodIssueCode,\n ZodIssueOptionalMessage,\n ZodTypeAny,\n ZodUnrecognizedKeysIssue,\n} from 'zod';\n\nexport class ClientError extends Error {\n constructor(\n public readonly message: string,\n public readonly status: number,\n public readonly requestId?: string,\n ) {\n super(message);\n this.name = 'ClientError';\n }\n}\n\nfunction isInvalidIssue(issue: ZodIssueOptionalMessage): issue is ZodInvalidTypeIssue {\n return issue.code === ZodIssueCode.invalid_type;\n}\nfunction isLiteralIssue(issue: ZodIssueOptionalMessage): issue is ZodInvalidLiteralIssue {\n return issue.code === ZodIssueCode.invalid_literal;\n}\nfunction isUnrecognizedKeysIssue(issue: ZodIssueOptionalMessage): issue is ZodUnrecognizedKeysIssue {\n return issue.code === ZodIssueCode.unrecognized_keys;\n}\n\nfunction getNestedValue(data: Record<string, any>, path: string): any {\n return path.split('.').reduce((obj, key) => obj?.[key], data);\n}\n\nexport function formatError(error: ZodError, schema: ZodTypeAny, data?: Record<string, any>) {\n const schemaName = (schema._def as any)?.description ?? 'unknown';\n\n const issues = error.issues\n .map((issue) => {\n let formattedMessage = '\\n-';\n const field = `${issue.path.join('.').replace(/\\.(\\d+)/g, '[$1]')}`.trim();\n formattedMessage += ` ${field !== '' ? field : 'Unknown field'}: ${issue.code}`;\n if (isInvalidIssue(issue) || isLiteralIssue(issue)) {\n formattedMessage += ` (Expected: ${issue.expected} / Received: ${issue.received})`;\n }\n if (isUnrecognizedKeysIssue(issue)) {\n formattedMessage += ` (${issue.keys.join(', ')})`;\n }\n if (data) {\n formattedMessage += ` (Value: ${JSON.stringify(getNestedValue(data, issue.path.join('.')))})`;\n }\n return formattedMessage;\n })\n .join('');\n\n return `Error in schema ${schemaName}:${issues}`;\n}\n\nexport class ParseError extends Error {\n constructor(\n public readonly error: ZodError,\n schema: ZodTypeAny,\n data?: Record<string, any>,\n ) {\n super(formatError(error, schema, data));\n this.name = 'ParseError';\n }\n}\n","import { ClientError } from './errors';\nimport type { ClientOptions, ClientRequestInit, DownloadDTO, Logger } from './types';\n\nasync function defaultResponseHandler(response: Response): Promise<Response> {\n if (!response.ok) {\n let body, json, text;\n try {\n body = await response.text();\n json = JSON.parse(body);\n } catch {\n text = body;\n }\n throw new ClientError(json?.message ?? json?.detail ?? text ?? response.statusText, response.status);\n }\n return response;\n}\n\nexport class Client {\n protected baseUrl: string;\n protected getAccessToken: () => Promise<string | undefined>;\n protected responseHandler: (response: Response, debugInfo?: object) => Promise<Response>;\n protected logger: Logger;\n protected retries: number;\n protected debug: boolean;\n\n public constructor(baseUrl: string = '', options?: ClientOptions) {\n this.baseUrl = baseUrl;\n this.getAccessToken = options?.getAccessToken ?? (() => Promise.resolve(undefined));\n this.responseHandler = options?.responseHandler ?? defaultResponseHandler;\n this.logger = options?.logger ?? console;\n this.retries = options?.retries ?? 0;\n this.debug = options?.debug ?? false;\n }\n\n protected async initRequest(options: ClientRequestInit = {}): Promise<ClientRequestInit> {\n options.headers = new Headers(options.headers);\n if (!options.headers.has('Accept')) {\n options.headers.append('Accept', 'application/json; version=1.0');\n }\n if (options.accessToken) {\n options.headers.append('Authorization', `Bearer ${options.accessToken}`);\n } else {\n const accessToken = await this.getAccessToken();\n if (accessToken) {\n options.headers.append('Authorization', `Bearer ${accessToken}`);\n }\n }\n if (!options?.method) {\n options.method = 'GET';\n }\n return options;\n }\n\n protected setJsonContentType(options: ClientRequestInit = {}): ClientRequestInit {\n options.headers = new Headers(options.headers);\n if (!options.headers.has('Content-Type')) {\n options.headers.append('Content-Type', 'application/json; charset=utf-8');\n }\n return options;\n }\n\n public async fetch(path: string, options?: ClientRequestInit): Promise<Response> {\n try {\n const init = await this.initRequest(options);\n\n if (path.startsWith('/')) {\n path = `${this.baseUrl}${path}`;\n }\n\n let retryCounter: number = this.retries;\n let response = await fetch(path, init);\n\n while (init.method === 'GET' && response.status >= 500 && response.status <= 504 && retryCounter > 0) {\n this.logger.warn(`Server response ${response.status}, try again (${this.retries - retryCounter + 1})`);\n response = await fetch(path, init);\n retryCounter--;\n }\n\n return this.responseHandler(response);\n } catch (error) {\n this.logger.error(error);\n throw error;\n }\n }\n\n public async get<T = any>(path: string, options: ClientRequestInit = {}): Promise<T> {\n const response = await this.fetch(path, options);\n return response.json() as Promise<T>;\n }\n\n public async post(path: string, body?: object, options?: ClientRequestInit): Promise<void>;\n public async post<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;\n public async post<T = void>(path: string, body?: object, options: ClientRequestInit = {}): Promise<T | void> {\n options = this.setJsonContentType(options);\n options.method = 'POST';\n options.body = JSON.stringify(body);\n const response = await this.fetch(path, options);\n if (response.status !== 204) {\n return response.json() as Promise<T>;\n }\n }\n\n public async put(path: string, body?: object, options?: ClientRequestInit): Promise<void>;\n public async put<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;\n public async put<T = void>(path: string, body = {}, options: ClientRequestInit = {}): Promise<T | void> {\n options = this.setJsonContentType(options);\n options.method = 'PUT';\n options.body = JSON.stringify(body);\n const response = await this.fetch(path, options);\n if (response.status !== 204) {\n return response.json() as Promise<T>;\n }\n }\n\n public async patch(path: string, body?: object, options?: ClientRequestInit): Promise<void>;\n public async patch<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;\n public async patch<T = void>(path: string, body = {}, options: ClientRequestInit = {}): Promise<T | void> {\n options = this.setJsonContentType(options);\n options.method = 'PATCH';\n options.body = JSON.stringify(body);\n const response = await this.fetch(path, options);\n if (response.status !== 204) {\n return response.json() as Promise<T>;\n }\n }\n\n public async delete(path: string, options?: ClientRequestInit): Promise<void>;\n public async delete<T>(path: string, options?: ClientRequestInit): Promise<T>;\n public async delete<T = void>(path: string, options: ClientRequestInit = {}): Promise<T | void> {\n options.method = 'DELETE';\n const response = await this.fetch(path, options);\n if (response.status !== 204) {\n return response.json() as Promise<T>;\n }\n }\n\n public async upload(path: string, file: Blob, field?: string, options?: ClientRequestInit): Promise<void>;\n public async upload<T>(path: string, file: Blob, field?: string, options?: ClientRequestInit): Promise<T>;\n public async upload<T = void>(\n path: string,\n file: Blob,\n field = 'file',\n options: ClientRequestInit = {},\n ): Promise<T | void> {\n const payload = new FormData();\n payload.append(field, file);\n if (!options.method) {\n options.method = 'POST';\n }\n options.body = payload;\n const response = await this.fetch(path, options);\n\n if (response.status !== 204) {\n return response.json() as Promise<T>;\n }\n }\n\n public async download(path: string, filename?: string, options: ClientRequestInit = {}): Promise<DownloadDTO> {\n options.method = 'GET';\n const response = await this.fetch(path, options);\n const data = await response.blob();\n\n if (!filename) {\n const fileNameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n const matches = fileNameRegex.exec(response.headers.get('content-disposition') ?? '');\n filename = matches?.[1]?.replace(/['\"]/g, '') ?? undefined;\n }\n\n return { data, filename };\n }\n}\n","import { Client } from './Client';\n\nexport class Resource<T extends Client = Client> {\n protected client: T;\n\n constructor(client: T) {\n this.client = client;\n }\n}\n","import { z, ZodDiscriminatedUnion, ZodError, ZodObject, ZodTypeAny } from 'zod';\nimport { formatError, ParseError } from './errors';\n\nfunction applyPartial(schema: ZodTypeAny, discriminator?: string): ZodTypeAny {\n if (schema instanceof ZodObject) {\n const shape = schema._def.shape();\n const partialShape: Record<string, ZodTypeAny> = {};\n\n for (const [key, value] of Object.entries(shape)) {\n const transformedValue = applyPartial(value as ZodTypeAny, discriminator);\n partialShape[key] = key === discriminator ? transformedValue : transformedValue.optional();\n }\n\n return z.object(partialShape);\n }\n\n if (schema instanceof ZodDiscriminatedUnion) {\n const partialOptions = schema.options.map((option: unknown) => {\n if (option instanceof ZodObject) {\n return applyPartial(option, schema.discriminator);\n }\n return option;\n });\n return z.discriminatedUnion(schema.discriminator, partialOptions);\n }\n\n if (schema instanceof z.ZodArray) {\n return z.array(applyPartial(schema.element, discriminator));\n }\n\n if (schema instanceof z.ZodNullable) {\n return applyPartial(schema.unwrap(), discriminator).nullable();\n }\n\n if (schema instanceof z.ZodOptional) {\n return applyPartial(schema.unwrap(), discriminator).optional();\n }\n\n return schema;\n}\n\nexport function parseSchema<S extends ZodTypeAny>(schema: S, data: any, partial = false): z.infer<S> {\n try {\n if (partial) {\n return applyPartial(schema).parse(data);\n } else if (schema instanceof ZodObject) {\n return schema.strict().parse(data);\n } else {\n return schema.parse(data);\n }\n } catch (error) {\n if (error instanceof ZodError) {\n if (!partial) {\n console.warn(formatError(error, schema, data));\n return parseSchema(schema, data, true);\n }\n throw new ParseError(error, schema, data);\n }\n throw error;\n }\n}\n","import { format, parseISO } from 'date-fns';\nimport { z } from 'zod';\n\n// String to Date transformations (for parsing API responses)\n\nexport const stringToDateSchema = z.string().transform((val) => parseISO(val));\n\nexport const stringToDaySchema = z.string().transform((val) => new Date(`${val}T00:00:00`));\n\n// Date to String transformations (for request bodies)\n\nexport const dateToStringSchema = z.coerce.date().transform((val) => val.toISOString());\n\nexport const dayToStringSchema = z.coerce.date().transform((val) => format(val, 'yyyy-MM-dd'));\n\nexport type DateString = string;\nexport type DayString = string;\n"],"mappings":"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","names":["import_zod","import_zod"]}
@@ -0,0 +1,76 @@
1
+ import { ZodError, ZodTypeAny, z } from 'zod';
2
+
3
+ interface Logger {
4
+ debug: (...args: unknown[]) => void;
5
+ info: (...args: unknown[]) => void;
6
+ warn: (...args: unknown[]) => void;
7
+ error: (...args: unknown[]) => void;
8
+ }
9
+ interface ClientRequestInit extends RequestInit {
10
+ headers?: Headers;
11
+ accessToken?: string;
12
+ }
13
+ interface ClientOptions {
14
+ getAccessToken?: () => Promise<string | undefined>;
15
+ responseHandler?: (response: Response, debugInfo?: object) => Promise<Response>;
16
+ logger?: Logger;
17
+ retries?: number;
18
+ debug?: boolean;
19
+ }
20
+ interface DownloadDTO {
21
+ data: Blob;
22
+ filename?: string;
23
+ }
24
+
25
+ declare class Client {
26
+ protected baseUrl: string;
27
+ protected getAccessToken: () => Promise<string | undefined>;
28
+ protected responseHandler: (response: Response, debugInfo?: object) => Promise<Response>;
29
+ protected logger: Logger;
30
+ protected retries: number;
31
+ protected debug: boolean;
32
+ constructor(baseUrl?: string, options?: ClientOptions);
33
+ protected initRequest(options?: ClientRequestInit): Promise<ClientRequestInit>;
34
+ protected setJsonContentType(options?: ClientRequestInit): ClientRequestInit;
35
+ fetch(path: string, options?: ClientRequestInit): Promise<Response>;
36
+ get<T = any>(path: string, options?: ClientRequestInit): Promise<T>;
37
+ post(path: string, body?: object, options?: ClientRequestInit): Promise<void>;
38
+ post<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;
39
+ put(path: string, body?: object, options?: ClientRequestInit): Promise<void>;
40
+ put<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;
41
+ patch(path: string, body?: object, options?: ClientRequestInit): Promise<void>;
42
+ patch<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;
43
+ delete(path: string, options?: ClientRequestInit): Promise<void>;
44
+ delete<T>(path: string, options?: ClientRequestInit): Promise<T>;
45
+ upload(path: string, file: Blob, field?: string, options?: ClientRequestInit): Promise<void>;
46
+ upload<T>(path: string, file: Blob, field?: string, options?: ClientRequestInit): Promise<T>;
47
+ download(path: string, filename?: string, options?: ClientRequestInit): Promise<DownloadDTO>;
48
+ }
49
+
50
+ declare class Resource<T extends Client = Client> {
51
+ protected client: T;
52
+ constructor(client: T);
53
+ }
54
+
55
+ declare class ClientError extends Error {
56
+ readonly message: string;
57
+ readonly status: number;
58
+ readonly requestId?: string | undefined;
59
+ constructor(message: string, status: number, requestId?: string | undefined);
60
+ }
61
+ declare function formatError(error: ZodError, schema: ZodTypeAny, data?: Record<string, any>): string;
62
+ declare class ParseError extends Error {
63
+ readonly error: ZodError;
64
+ constructor(error: ZodError, schema: ZodTypeAny, data?: Record<string, any>);
65
+ }
66
+
67
+ declare function parseSchema<S extends ZodTypeAny>(schema: S, data: any, partial?: boolean): z.infer<S>;
68
+
69
+ declare const stringToDateSchema: z.ZodEffects<z.ZodString, Date, string>;
70
+ declare const stringToDaySchema: z.ZodEffects<z.ZodString, Date, string>;
71
+ declare const dateToStringSchema: z.ZodEffects<z.ZodDate, string, Date>;
72
+ declare const dayToStringSchema: z.ZodEffects<z.ZodDate, string, Date>;
73
+ type DateString = string;
74
+ type DayString = string;
75
+
76
+ export { Client, ClientError, type ClientOptions, type ClientRequestInit, type DateString, type DayString, type DownloadDTO, type Logger, ParseError, Resource, dateToStringSchema, dayToStringSchema, formatError, parseSchema, stringToDateSchema, stringToDaySchema };
@@ -0,0 +1,76 @@
1
+ import { ZodError, ZodTypeAny, z } from 'zod';
2
+
3
+ interface Logger {
4
+ debug: (...args: unknown[]) => void;
5
+ info: (...args: unknown[]) => void;
6
+ warn: (...args: unknown[]) => void;
7
+ error: (...args: unknown[]) => void;
8
+ }
9
+ interface ClientRequestInit extends RequestInit {
10
+ headers?: Headers;
11
+ accessToken?: string;
12
+ }
13
+ interface ClientOptions {
14
+ getAccessToken?: () => Promise<string | undefined>;
15
+ responseHandler?: (response: Response, debugInfo?: object) => Promise<Response>;
16
+ logger?: Logger;
17
+ retries?: number;
18
+ debug?: boolean;
19
+ }
20
+ interface DownloadDTO {
21
+ data: Blob;
22
+ filename?: string;
23
+ }
24
+
25
+ declare class Client {
26
+ protected baseUrl: string;
27
+ protected getAccessToken: () => Promise<string | undefined>;
28
+ protected responseHandler: (response: Response, debugInfo?: object) => Promise<Response>;
29
+ protected logger: Logger;
30
+ protected retries: number;
31
+ protected debug: boolean;
32
+ constructor(baseUrl?: string, options?: ClientOptions);
33
+ protected initRequest(options?: ClientRequestInit): Promise<ClientRequestInit>;
34
+ protected setJsonContentType(options?: ClientRequestInit): ClientRequestInit;
35
+ fetch(path: string, options?: ClientRequestInit): Promise<Response>;
36
+ get<T = any>(path: string, options?: ClientRequestInit): Promise<T>;
37
+ post(path: string, body?: object, options?: ClientRequestInit): Promise<void>;
38
+ post<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;
39
+ put(path: string, body?: object, options?: ClientRequestInit): Promise<void>;
40
+ put<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;
41
+ patch(path: string, body?: object, options?: ClientRequestInit): Promise<void>;
42
+ patch<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;
43
+ delete(path: string, options?: ClientRequestInit): Promise<void>;
44
+ delete<T>(path: string, options?: ClientRequestInit): Promise<T>;
45
+ upload(path: string, file: Blob, field?: string, options?: ClientRequestInit): Promise<void>;
46
+ upload<T>(path: string, file: Blob, field?: string, options?: ClientRequestInit): Promise<T>;
47
+ download(path: string, filename?: string, options?: ClientRequestInit): Promise<DownloadDTO>;
48
+ }
49
+
50
+ declare class Resource<T extends Client = Client> {
51
+ protected client: T;
52
+ constructor(client: T);
53
+ }
54
+
55
+ declare class ClientError extends Error {
56
+ readonly message: string;
57
+ readonly status: number;
58
+ readonly requestId?: string | undefined;
59
+ constructor(message: string, status: number, requestId?: string | undefined);
60
+ }
61
+ declare function formatError(error: ZodError, schema: ZodTypeAny, data?: Record<string, any>): string;
62
+ declare class ParseError extends Error {
63
+ readonly error: ZodError;
64
+ constructor(error: ZodError, schema: ZodTypeAny, data?: Record<string, any>);
65
+ }
66
+
67
+ declare function parseSchema<S extends ZodTypeAny>(schema: S, data: any, partial?: boolean): z.infer<S>;
68
+
69
+ declare const stringToDateSchema: z.ZodEffects<z.ZodString, Date, string>;
70
+ declare const stringToDaySchema: z.ZodEffects<z.ZodString, Date, string>;
71
+ declare const dateToStringSchema: z.ZodEffects<z.ZodDate, string, Date>;
72
+ declare const dayToStringSchema: z.ZodEffects<z.ZodDate, string, Date>;
73
+ type DateString = string;
74
+ type DayString = string;
75
+
76
+ export { Client, ClientError, type ClientOptions, type ClientRequestInit, type DateString, type DayString, type DownloadDTO, type Logger, ParseError, Resource, dateToStringSchema, dayToStringSchema, formatError, parseSchema, stringToDateSchema, stringToDaySchema };
@@ -0,0 +1,269 @@
1
+ // src/runtime/errors.ts
2
+ import {
3
+ ZodIssueCode
4
+ } from "zod";
5
+ var ClientError = class extends Error {
6
+ constructor(message, status, requestId) {
7
+ super(message);
8
+ this.message = message;
9
+ this.status = status;
10
+ this.requestId = requestId;
11
+ this.name = "ClientError";
12
+ }
13
+ };
14
+ function isInvalidIssue(issue) {
15
+ return issue.code === ZodIssueCode.invalid_type;
16
+ }
17
+ function isLiteralIssue(issue) {
18
+ return issue.code === ZodIssueCode.invalid_literal;
19
+ }
20
+ function isUnrecognizedKeysIssue(issue) {
21
+ return issue.code === ZodIssueCode.unrecognized_keys;
22
+ }
23
+ function getNestedValue(data, path) {
24
+ return path.split(".").reduce((obj, key) => obj?.[key], data);
25
+ }
26
+ function formatError(error, schema, data) {
27
+ const schemaName = schema._def?.description ?? "unknown";
28
+ const issues = error.issues.map((issue) => {
29
+ let formattedMessage = "\n-";
30
+ const field = `${issue.path.join(".").replace(/\.(\d+)/g, "[$1]")}`.trim();
31
+ formattedMessage += ` ${field !== "" ? field : "Unknown field"}: ${issue.code}`;
32
+ if (isInvalidIssue(issue) || isLiteralIssue(issue)) {
33
+ formattedMessage += ` (Expected: ${issue.expected} / Received: ${issue.received})`;
34
+ }
35
+ if (isUnrecognizedKeysIssue(issue)) {
36
+ formattedMessage += ` (${issue.keys.join(", ")})`;
37
+ }
38
+ if (data) {
39
+ formattedMessage += ` (Value: ${JSON.stringify(getNestedValue(data, issue.path.join(".")))})`;
40
+ }
41
+ return formattedMessage;
42
+ }).join("");
43
+ return `Error in schema ${schemaName}:${issues}`;
44
+ }
45
+ var ParseError = class extends Error {
46
+ constructor(error, schema, data) {
47
+ super(formatError(error, schema, data));
48
+ this.error = error;
49
+ this.name = "ParseError";
50
+ }
51
+ };
52
+
53
+ // src/runtime/Client.ts
54
+ async function defaultResponseHandler(response) {
55
+ if (!response.ok) {
56
+ let body, json, text;
57
+ try {
58
+ body = await response.text();
59
+ json = JSON.parse(body);
60
+ } catch {
61
+ text = body;
62
+ }
63
+ throw new ClientError(json?.message ?? json?.detail ?? text ?? response.statusText, response.status);
64
+ }
65
+ return response;
66
+ }
67
+ var Client = class {
68
+ baseUrl;
69
+ getAccessToken;
70
+ responseHandler;
71
+ logger;
72
+ retries;
73
+ debug;
74
+ constructor(baseUrl = "", options) {
75
+ this.baseUrl = baseUrl;
76
+ this.getAccessToken = options?.getAccessToken ?? (() => Promise.resolve(void 0));
77
+ this.responseHandler = options?.responseHandler ?? defaultResponseHandler;
78
+ this.logger = options?.logger ?? console;
79
+ this.retries = options?.retries ?? 0;
80
+ this.debug = options?.debug ?? false;
81
+ }
82
+ async initRequest(options = {}) {
83
+ options.headers = new Headers(options.headers);
84
+ if (!options.headers.has("Accept")) {
85
+ options.headers.append("Accept", "application/json; version=1.0");
86
+ }
87
+ if (options.accessToken) {
88
+ options.headers.append("Authorization", `Bearer ${options.accessToken}`);
89
+ } else {
90
+ const accessToken = await this.getAccessToken();
91
+ if (accessToken) {
92
+ options.headers.append("Authorization", `Bearer ${accessToken}`);
93
+ }
94
+ }
95
+ if (!options?.method) {
96
+ options.method = "GET";
97
+ }
98
+ return options;
99
+ }
100
+ setJsonContentType(options = {}) {
101
+ options.headers = new Headers(options.headers);
102
+ if (!options.headers.has("Content-Type")) {
103
+ options.headers.append("Content-Type", "application/json; charset=utf-8");
104
+ }
105
+ return options;
106
+ }
107
+ async fetch(path, options) {
108
+ try {
109
+ const init = await this.initRequest(options);
110
+ if (path.startsWith("/")) {
111
+ path = `${this.baseUrl}${path}`;
112
+ }
113
+ let retryCounter = this.retries;
114
+ let response = await fetch(path, init);
115
+ while (init.method === "GET" && response.status >= 500 && response.status <= 504 && retryCounter > 0) {
116
+ this.logger.warn(`Server response ${response.status}, try again (${this.retries - retryCounter + 1})`);
117
+ response = await fetch(path, init);
118
+ retryCounter--;
119
+ }
120
+ return this.responseHandler(response);
121
+ } catch (error) {
122
+ this.logger.error(error);
123
+ throw error;
124
+ }
125
+ }
126
+ async get(path, options = {}) {
127
+ const response = await this.fetch(path, options);
128
+ return response.json();
129
+ }
130
+ async post(path, body, options = {}) {
131
+ options = this.setJsonContentType(options);
132
+ options.method = "POST";
133
+ options.body = JSON.stringify(body);
134
+ const response = await this.fetch(path, options);
135
+ if (response.status !== 204) {
136
+ return response.json();
137
+ }
138
+ }
139
+ async put(path, body = {}, options = {}) {
140
+ options = this.setJsonContentType(options);
141
+ options.method = "PUT";
142
+ options.body = JSON.stringify(body);
143
+ const response = await this.fetch(path, options);
144
+ if (response.status !== 204) {
145
+ return response.json();
146
+ }
147
+ }
148
+ async patch(path, body = {}, options = {}) {
149
+ options = this.setJsonContentType(options);
150
+ options.method = "PATCH";
151
+ options.body = JSON.stringify(body);
152
+ const response = await this.fetch(path, options);
153
+ if (response.status !== 204) {
154
+ return response.json();
155
+ }
156
+ }
157
+ async delete(path, options = {}) {
158
+ options.method = "DELETE";
159
+ const response = await this.fetch(path, options);
160
+ if (response.status !== 204) {
161
+ return response.json();
162
+ }
163
+ }
164
+ async upload(path, file, field = "file", options = {}) {
165
+ const payload = new FormData();
166
+ payload.append(field, file);
167
+ if (!options.method) {
168
+ options.method = "POST";
169
+ }
170
+ options.body = payload;
171
+ const response = await this.fetch(path, options);
172
+ if (response.status !== 204) {
173
+ return response.json();
174
+ }
175
+ }
176
+ async download(path, filename, options = {}) {
177
+ options.method = "GET";
178
+ const response = await this.fetch(path, options);
179
+ const data = await response.blob();
180
+ if (!filename) {
181
+ const fileNameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
182
+ const matches = fileNameRegex.exec(response.headers.get("content-disposition") ?? "");
183
+ filename = matches?.[1]?.replace(/['"]/g, "") ?? void 0;
184
+ }
185
+ return { data, filename };
186
+ }
187
+ };
188
+
189
+ // src/runtime/Resource.ts
190
+ var Resource = class {
191
+ client;
192
+ constructor(client) {
193
+ this.client = client;
194
+ }
195
+ };
196
+
197
+ // src/runtime/parseSchema.ts
198
+ import { z, ZodDiscriminatedUnion, ZodError as ZodError2, ZodObject } from "zod";
199
+ function applyPartial(schema, discriminator) {
200
+ if (schema instanceof ZodObject) {
201
+ const shape = schema._def.shape();
202
+ const partialShape = {};
203
+ for (const [key, value] of Object.entries(shape)) {
204
+ const transformedValue = applyPartial(value, discriminator);
205
+ partialShape[key] = key === discriminator ? transformedValue : transformedValue.optional();
206
+ }
207
+ return z.object(partialShape);
208
+ }
209
+ if (schema instanceof ZodDiscriminatedUnion) {
210
+ const partialOptions = schema.options.map((option) => {
211
+ if (option instanceof ZodObject) {
212
+ return applyPartial(option, schema.discriminator);
213
+ }
214
+ return option;
215
+ });
216
+ return z.discriminatedUnion(schema.discriminator, partialOptions);
217
+ }
218
+ if (schema instanceof z.ZodArray) {
219
+ return z.array(applyPartial(schema.element, discriminator));
220
+ }
221
+ if (schema instanceof z.ZodNullable) {
222
+ return applyPartial(schema.unwrap(), discriminator).nullable();
223
+ }
224
+ if (schema instanceof z.ZodOptional) {
225
+ return applyPartial(schema.unwrap(), discriminator).optional();
226
+ }
227
+ return schema;
228
+ }
229
+ function parseSchema(schema, data, partial = false) {
230
+ try {
231
+ if (partial) {
232
+ return applyPartial(schema).parse(data);
233
+ } else if (schema instanceof ZodObject) {
234
+ return schema.strict().parse(data);
235
+ } else {
236
+ return schema.parse(data);
237
+ }
238
+ } catch (error) {
239
+ if (error instanceof ZodError2) {
240
+ if (!partial) {
241
+ console.warn(formatError(error, schema, data));
242
+ return parseSchema(schema, data, true);
243
+ }
244
+ throw new ParseError(error, schema, data);
245
+ }
246
+ throw error;
247
+ }
248
+ }
249
+
250
+ // src/runtime/date-schemas.ts
251
+ import { format, parseISO } from "date-fns";
252
+ import { z as z2 } from "zod";
253
+ var stringToDateSchema = z2.string().transform((val) => parseISO(val));
254
+ var stringToDaySchema = z2.string().transform((val) => /* @__PURE__ */ new Date(`${val}T00:00:00`));
255
+ var dateToStringSchema = z2.coerce.date().transform((val) => val.toISOString());
256
+ var dayToStringSchema = z2.coerce.date().transform((val) => format(val, "yyyy-MM-dd"));
257
+ export {
258
+ Client,
259
+ ClientError,
260
+ ParseError,
261
+ Resource,
262
+ dateToStringSchema,
263
+ dayToStringSchema,
264
+ formatError,
265
+ parseSchema,
266
+ stringToDateSchema,
267
+ stringToDaySchema
268
+ };
269
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/errors.ts","../../src/runtime/Client.ts","../../src/runtime/Resource.ts","../../src/runtime/parseSchema.ts","../../src/runtime/date-schemas.ts"],"sourcesContent":["import {\n ZodError,\n ZodInvalidLiteralIssue,\n ZodInvalidTypeIssue,\n ZodIssueCode,\n ZodIssueOptionalMessage,\n ZodTypeAny,\n ZodUnrecognizedKeysIssue,\n} from 'zod';\n\nexport class ClientError extends Error {\n constructor(\n public readonly message: string,\n public readonly status: number,\n public readonly requestId?: string,\n ) {\n super(message);\n this.name = 'ClientError';\n }\n}\n\nfunction isInvalidIssue(issue: ZodIssueOptionalMessage): issue is ZodInvalidTypeIssue {\n return issue.code === ZodIssueCode.invalid_type;\n}\nfunction isLiteralIssue(issue: ZodIssueOptionalMessage): issue is ZodInvalidLiteralIssue {\n return issue.code === ZodIssueCode.invalid_literal;\n}\nfunction isUnrecognizedKeysIssue(issue: ZodIssueOptionalMessage): issue is ZodUnrecognizedKeysIssue {\n return issue.code === ZodIssueCode.unrecognized_keys;\n}\n\nfunction getNestedValue(data: Record<string, any>, path: string): any {\n return path.split('.').reduce((obj, key) => obj?.[key], data);\n}\n\nexport function formatError(error: ZodError, schema: ZodTypeAny, data?: Record<string, any>) {\n const schemaName = (schema._def as any)?.description ?? 'unknown';\n\n const issues = error.issues\n .map((issue) => {\n let formattedMessage = '\\n-';\n const field = `${issue.path.join('.').replace(/\\.(\\d+)/g, '[$1]')}`.trim();\n formattedMessage += ` ${field !== '' ? field : 'Unknown field'}: ${issue.code}`;\n if (isInvalidIssue(issue) || isLiteralIssue(issue)) {\n formattedMessage += ` (Expected: ${issue.expected} / Received: ${issue.received})`;\n }\n if (isUnrecognizedKeysIssue(issue)) {\n formattedMessage += ` (${issue.keys.join(', ')})`;\n }\n if (data) {\n formattedMessage += ` (Value: ${JSON.stringify(getNestedValue(data, issue.path.join('.')))})`;\n }\n return formattedMessage;\n })\n .join('');\n\n return `Error in schema ${schemaName}:${issues}`;\n}\n\nexport class ParseError extends Error {\n constructor(\n public readonly error: ZodError,\n schema: ZodTypeAny,\n data?: Record<string, any>,\n ) {\n super(formatError(error, schema, data));\n this.name = 'ParseError';\n }\n}\n","import { ClientError } from './errors';\nimport type { ClientOptions, ClientRequestInit, DownloadDTO, Logger } from './types';\n\nasync function defaultResponseHandler(response: Response): Promise<Response> {\n if (!response.ok) {\n let body, json, text;\n try {\n body = await response.text();\n json = JSON.parse(body);\n } catch {\n text = body;\n }\n throw new ClientError(json?.message ?? json?.detail ?? text ?? response.statusText, response.status);\n }\n return response;\n}\n\nexport class Client {\n protected baseUrl: string;\n protected getAccessToken: () => Promise<string | undefined>;\n protected responseHandler: (response: Response, debugInfo?: object) => Promise<Response>;\n protected logger: Logger;\n protected retries: number;\n protected debug: boolean;\n\n public constructor(baseUrl: string = '', options?: ClientOptions) {\n this.baseUrl = baseUrl;\n this.getAccessToken = options?.getAccessToken ?? (() => Promise.resolve(undefined));\n this.responseHandler = options?.responseHandler ?? defaultResponseHandler;\n this.logger = options?.logger ?? console;\n this.retries = options?.retries ?? 0;\n this.debug = options?.debug ?? false;\n }\n\n protected async initRequest(options: ClientRequestInit = {}): Promise<ClientRequestInit> {\n options.headers = new Headers(options.headers);\n if (!options.headers.has('Accept')) {\n options.headers.append('Accept', 'application/json; version=1.0');\n }\n if (options.accessToken) {\n options.headers.append('Authorization', `Bearer ${options.accessToken}`);\n } else {\n const accessToken = await this.getAccessToken();\n if (accessToken) {\n options.headers.append('Authorization', `Bearer ${accessToken}`);\n }\n }\n if (!options?.method) {\n options.method = 'GET';\n }\n return options;\n }\n\n protected setJsonContentType(options: ClientRequestInit = {}): ClientRequestInit {\n options.headers = new Headers(options.headers);\n if (!options.headers.has('Content-Type')) {\n options.headers.append('Content-Type', 'application/json; charset=utf-8');\n }\n return options;\n }\n\n public async fetch(path: string, options?: ClientRequestInit): Promise<Response> {\n try {\n const init = await this.initRequest(options);\n\n if (path.startsWith('/')) {\n path = `${this.baseUrl}${path}`;\n }\n\n let retryCounter: number = this.retries;\n let response = await fetch(path, init);\n\n while (init.method === 'GET' && response.status >= 500 && response.status <= 504 && retryCounter > 0) {\n this.logger.warn(`Server response ${response.status}, try again (${this.retries - retryCounter + 1})`);\n response = await fetch(path, init);\n retryCounter--;\n }\n\n return this.responseHandler(response);\n } catch (error) {\n this.logger.error(error);\n throw error;\n }\n }\n\n public async get<T = any>(path: string, options: ClientRequestInit = {}): Promise<T> {\n const response = await this.fetch(path, options);\n return response.json() as Promise<T>;\n }\n\n public async post(path: string, body?: object, options?: ClientRequestInit): Promise<void>;\n public async post<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;\n public async post<T = void>(path: string, body?: object, options: ClientRequestInit = {}): Promise<T | void> {\n options = this.setJsonContentType(options);\n options.method = 'POST';\n options.body = JSON.stringify(body);\n const response = await this.fetch(path, options);\n if (response.status !== 204) {\n return response.json() as Promise<T>;\n }\n }\n\n public async put(path: string, body?: object, options?: ClientRequestInit): Promise<void>;\n public async put<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;\n public async put<T = void>(path: string, body = {}, options: ClientRequestInit = {}): Promise<T | void> {\n options = this.setJsonContentType(options);\n options.method = 'PUT';\n options.body = JSON.stringify(body);\n const response = await this.fetch(path, options);\n if (response.status !== 204) {\n return response.json() as Promise<T>;\n }\n }\n\n public async patch(path: string, body?: object, options?: ClientRequestInit): Promise<void>;\n public async patch<T>(path: string, body?: object, options?: ClientRequestInit): Promise<T>;\n public async patch<T = void>(path: string, body = {}, options: ClientRequestInit = {}): Promise<T | void> {\n options = this.setJsonContentType(options);\n options.method = 'PATCH';\n options.body = JSON.stringify(body);\n const response = await this.fetch(path, options);\n if (response.status !== 204) {\n return response.json() as Promise<T>;\n }\n }\n\n public async delete(path: string, options?: ClientRequestInit): Promise<void>;\n public async delete<T>(path: string, options?: ClientRequestInit): Promise<T>;\n public async delete<T = void>(path: string, options: ClientRequestInit = {}): Promise<T | void> {\n options.method = 'DELETE';\n const response = await this.fetch(path, options);\n if (response.status !== 204) {\n return response.json() as Promise<T>;\n }\n }\n\n public async upload(path: string, file: Blob, field?: string, options?: ClientRequestInit): Promise<void>;\n public async upload<T>(path: string, file: Blob, field?: string, options?: ClientRequestInit): Promise<T>;\n public async upload<T = void>(\n path: string,\n file: Blob,\n field = 'file',\n options: ClientRequestInit = {},\n ): Promise<T | void> {\n const payload = new FormData();\n payload.append(field, file);\n if (!options.method) {\n options.method = 'POST';\n }\n options.body = payload;\n const response = await this.fetch(path, options);\n\n if (response.status !== 204) {\n return response.json() as Promise<T>;\n }\n }\n\n public async download(path: string, filename?: string, options: ClientRequestInit = {}): Promise<DownloadDTO> {\n options.method = 'GET';\n const response = await this.fetch(path, options);\n const data = await response.blob();\n\n if (!filename) {\n const fileNameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\n const matches = fileNameRegex.exec(response.headers.get('content-disposition') ?? '');\n filename = matches?.[1]?.replace(/['\"]/g, '') ?? undefined;\n }\n\n return { data, filename };\n }\n}\n","import { Client } from './Client';\n\nexport class Resource<T extends Client = Client> {\n protected client: T;\n\n constructor(client: T) {\n this.client = client;\n }\n}\n","import { z, ZodDiscriminatedUnion, ZodError, ZodObject, ZodTypeAny } from 'zod';\nimport { formatError, ParseError } from './errors';\n\nfunction applyPartial(schema: ZodTypeAny, discriminator?: string): ZodTypeAny {\n if (schema instanceof ZodObject) {\n const shape = schema._def.shape();\n const partialShape: Record<string, ZodTypeAny> = {};\n\n for (const [key, value] of Object.entries(shape)) {\n const transformedValue = applyPartial(value as ZodTypeAny, discriminator);\n partialShape[key] = key === discriminator ? transformedValue : transformedValue.optional();\n }\n\n return z.object(partialShape);\n }\n\n if (schema instanceof ZodDiscriminatedUnion) {\n const partialOptions = schema.options.map((option: unknown) => {\n if (option instanceof ZodObject) {\n return applyPartial(option, schema.discriminator);\n }\n return option;\n });\n return z.discriminatedUnion(schema.discriminator, partialOptions);\n }\n\n if (schema instanceof z.ZodArray) {\n return z.array(applyPartial(schema.element, discriminator));\n }\n\n if (schema instanceof z.ZodNullable) {\n return applyPartial(schema.unwrap(), discriminator).nullable();\n }\n\n if (schema instanceof z.ZodOptional) {\n return applyPartial(schema.unwrap(), discriminator).optional();\n }\n\n return schema;\n}\n\nexport function parseSchema<S extends ZodTypeAny>(schema: S, data: any, partial = false): z.infer<S> {\n try {\n if (partial) {\n return applyPartial(schema).parse(data);\n } else if (schema instanceof ZodObject) {\n return schema.strict().parse(data);\n } else {\n return schema.parse(data);\n }\n } catch (error) {\n if (error instanceof ZodError) {\n if (!partial) {\n console.warn(formatError(error, schema, data));\n return parseSchema(schema, data, true);\n }\n throw new ParseError(error, schema, data);\n }\n throw error;\n }\n}\n","import { format, parseISO } from 'date-fns';\nimport { z } from 'zod';\n\n// String to Date transformations (for parsing API responses)\n\nexport const stringToDateSchema = z.string().transform((val) => parseISO(val));\n\nexport const stringToDaySchema = z.string().transform((val) => new Date(`${val}T00:00:00`));\n\n// Date to String transformations (for request bodies)\n\nexport const dateToStringSchema = z.coerce.date().transform((val) => val.toISOString());\n\nexport const dayToStringSchema = z.coerce.date().transform((val) => format(val, 'yyyy-MM-dd'));\n\nexport type DateString = string;\nexport type DayString = string;\n"],"mappings":"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","names":["ZodError","ZodError","z"]}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@moinax/orc",
3
+ "version": "0.1.0",
4
+ "description": "OpenAPI Rest Client generator - generates typed TypeScript API clients with Zod validation from OpenAPI specs",
5
+ "type": "module",
6
+ "main": "./dist/runtime/index.cjs",
7
+ "module": "./dist/runtime/index.js",
8
+ "types": "./dist/runtime/index.d.ts",
9
+ "typesVersions": {
10
+ "*": {
11
+ "config": ["./dist/generator/config.d.ts"]
12
+ }
13
+ },
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/runtime/index.d.ts",
17
+ "import": "./dist/runtime/index.js",
18
+ "require": "./dist/runtime/index.cjs"
19
+ },
20
+ "./config": {
21
+ "types": "./dist/generator/config.d.ts",
22
+ "import": "./dist/generator/config.js",
23
+ "require": "./dist/generator/config.cjs"
24
+ }
25
+ },
26
+ "bin": {
27
+ "orc": "./dist/cli.js"
28
+ },
29
+ "files": [
30
+ "dist"
31
+ ],
32
+ "scripts": {
33
+ "build": "tsup",
34
+ "dev": "tsup --watch",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest",
37
+ "typecheck": "tsc --noEmit",
38
+ "prepublishOnly": "npm run build"
39
+ },
40
+ "dependencies": {
41
+ "commander": "^13.1.0",
42
+ "date-fns": "^4.1.0",
43
+ "jiti": "^2.4.2",
44
+ "pluralize": "^8.0.0",
45
+ "prettier": "^3.5.3"
46
+ },
47
+ "peerDependencies": {
48
+ "zod": "^3.23.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^22.13.0",
52
+ "@types/pluralize": "^0.0.33",
53
+ "tsup": "^8.4.0",
54
+ "typescript": "^5.7.3",
55
+ "vitest": "^3.0.0",
56
+ "zod": "^3.24.0"
57
+ },
58
+ "keywords": [
59
+ "openapi",
60
+ "rest",
61
+ "client",
62
+ "generator",
63
+ "zod",
64
+ "typescript"
65
+ ],
66
+ "license": "MIT",
67
+ "author": "moinax",
68
+ "repository": {
69
+ "type": "git",
70
+ "url": "https://github.com/moinax/orc.git"
71
+ }
72
+ }