@apollo-deploy/tesseract 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.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +235 -0
  3. package/dist/adapters/types.d.ts +15 -0
  4. package/dist/adapters/types.d.ts.map +1 -0
  5. package/dist/adapters/types.js +6 -0
  6. package/dist/adapters/types.js.map +1 -0
  7. package/dist/adapters/typescript/index.d.ts +11 -0
  8. package/dist/adapters/typescript/index.d.ts.map +1 -0
  9. package/dist/adapters/typescript/index.js +112 -0
  10. package/dist/adapters/typescript/index.js.map +1 -0
  11. package/dist/adapters/typescript/model-emitter.d.ts +13 -0
  12. package/dist/adapters/typescript/model-emitter.d.ts.map +1 -0
  13. package/dist/adapters/typescript/model-emitter.js +415 -0
  14. package/dist/adapters/typescript/model-emitter.js.map +1 -0
  15. package/dist/adapters/typescript/shared.d.ts +26 -0
  16. package/dist/adapters/typescript/shared.d.ts.map +1 -0
  17. package/dist/adapters/typescript/shared.js +65 -0
  18. package/dist/adapters/typescript/shared.js.map +1 -0
  19. package/dist/cli.d.ts +6 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +53 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/helpers/handlebars.d.ts +15 -0
  24. package/dist/helpers/handlebars.d.ts.map +1 -0
  25. package/dist/helpers/handlebars.js +172 -0
  26. package/dist/helpers/handlebars.js.map +1 -0
  27. package/dist/index.d.ts +16 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +36 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/pipeline/enrich.d.ts +7 -0
  32. package/dist/pipeline/enrich.d.ts.map +1 -0
  33. package/dist/pipeline/enrich.js +277 -0
  34. package/dist/pipeline/enrich.js.map +1 -0
  35. package/dist/pipeline/intake.d.ts +11 -0
  36. package/dist/pipeline/intake.d.ts.map +1 -0
  37. package/dist/pipeline/intake.js +508 -0
  38. package/dist/pipeline/intake.js.map +1 -0
  39. package/dist/pipeline/write.d.ts +15 -0
  40. package/dist/pipeline/write.d.ts.map +1 -0
  41. package/dist/pipeline/write.js +33 -0
  42. package/dist/pipeline/write.js.map +1 -0
  43. package/dist/types/config.d.ts +47 -0
  44. package/dist/types/config.d.ts.map +1 -0
  45. package/dist/types/config.js +24 -0
  46. package/dist/types/config.js.map +1 -0
  47. package/dist/types/ir.d.ts +172 -0
  48. package/dist/types/ir.d.ts.map +1 -0
  49. package/dist/types/ir.js +7 -0
  50. package/dist/types/ir.js.map +1 -0
  51. package/dist/types/manifest.d.ts +112 -0
  52. package/dist/types/manifest.d.ts.map +1 -0
  53. package/dist/types/manifest.js +32 -0
  54. package/dist/types/manifest.js.map +1 -0
  55. package/dist/utils/format.d.ts +5 -0
  56. package/dist/utils/format.d.ts.map +1 -0
  57. package/dist/utils/format.js +21 -0
  58. package/dist/utils/format.js.map +1 -0
  59. package/dist/utils/naming.d.ts +26 -0
  60. package/dist/utils/naming.d.ts.map +1 -0
  61. package/dist/utils/naming.js +270 -0
  62. package/dist/utils/naming.js.map +1 -0
  63. package/package.json +58 -0
  64. package/templates/typescript/client.hbs +145 -0
  65. package/templates/typescript/domain-index.hbs +10 -0
  66. package/templates/typescript/domain.hbs +127 -0
  67. package/templates/typescript/index.hbs +64 -0
  68. package/templates/typescript/package-json.hbs +29 -0
  69. package/templates/typescript/readme.hbs +78 -0
  70. package/templates/typescript/transport-sse.hbs +377 -0
  71. package/templates/typescript/transport.hbs +662 -0
  72. package/templates/typescript/tsconfig.hbs +18 -0
  73. package/templates/typescript/types-common.hbs +98 -0
  74. package/templates/typescript/types-errors.hbs +191 -0
  75. package/templates/typescript/types.hbs +33 -0
  76. package/templates/typescript/utils-index.hbs +7 -0
  77. package/templates/typescript/utils-query.hbs +29 -0
  78. package/templates/typescript/webhook-handler.hbs +447 -0
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Name transformation utilities.
3
+ * Ported from SDK Forge — single source of truth for method naming.
4
+ */
5
+ import { camelCase, pascalCase, kebabCase } from 'change-case';
6
+ // ── Public name helpers ───────────────────────────────
7
+ export function toMethodName(operationId) {
8
+ return camelCase(operationId);
9
+ }
10
+ export function toInterfaceName(tag) {
11
+ return `${pascalCase(tag)}API`;
12
+ }
13
+ export function toFactoryName(tag) {
14
+ return `create${pascalCase(tag)}API`;
15
+ }
16
+ export function toFileName(tag) {
17
+ return kebabCase(tag);
18
+ }
19
+ export function toTypeName(name) {
20
+ return pascalCase(name);
21
+ }
22
+ export function toPropertyName(name) {
23
+ return camelCase(name);
24
+ }
25
+ export function toClientName(title) {
26
+ return pascalCase(title);
27
+ }
28
+ export function deriveOperationId(method, path) {
29
+ const cleaned = path
30
+ .replace(/\{([^}]+)\}/g, 'By_$1')
31
+ .replace(/[^a-zA-Z0-9_]/g, '_')
32
+ .replace(/_+/g, '_')
33
+ .replace(/^_|_$/g, '');
34
+ return camelCase(`${method.toLowerCase()}_${cleaned}`);
35
+ }
36
+ // ── Verb registry — single source of truth ────────────
37
+ const VERB_SYNONYMS = {
38
+ get: 'get', retrieve: 'get', fetch: 'get', find: 'get', show: 'get',
39
+ read: 'get', load: 'get', lookup: 'get', view: 'get',
40
+ list: 'list', search: 'list', browse: 'list', index: 'list', query: 'list',
41
+ create: 'create', add: 'create', insert: 'create', make: 'create', register: 'register',
42
+ update: 'update', modify: 'update', edit: 'update', change: 'update', patch: 'update', set: 'set',
43
+ delete: 'delete', remove: 'remove', destroy: 'delete', purge: 'delete', erase: 'delete',
44
+ authenticate: 'authenticate', login: 'login', logout: 'logout',
45
+ authorize: 'authorize', impersonate: 'impersonate', revoke: 'revoke',
46
+ activate: 'activate', deactivate: 'deactivate', enable: 'enable', disable: 'disable',
47
+ start: 'start', stop: 'stop',
48
+ trigger: 'trigger', force: 'force', schedule: 'schedule', submit: 'submit',
49
+ resubmit: 'resubmit', cancel: 'cancel', approve: 'approve', reject: 'reject',
50
+ complete: 'complete', revalidate: 'revalidate', reconcile: 'reconcile',
51
+ export: 'export', import: 'import', download: 'download', upload: 'upload',
52
+ presign: 'presign', generate: 'generate', batch: 'batch', rotate: 'rotate',
53
+ check: 'check', verify: 'verify', validate: 'validate',
54
+ invite: 'invite', accept: 'accept', join: 'join', leave: 'leave', ban: 'ban', unban: 'unban',
55
+ sync: 'sync', refresh: 'refresh', reset: 'reset', send: 'send', request: 'request',
56
+ mark: 'mark', compare: 'compare', switch: 'switch', evaluate: 'evaluate',
57
+ };
58
+ const ACTION_VERBS = new Set(Object.values(VERB_SYNONYMS));
59
+ const ABBREVIATION_REGISTRY = {
60
+ app: ['application', 'applications'],
61
+ auth: ['authentication', 'authorization'],
62
+ org: ['organization', 'organizations'],
63
+ repo: ['repository', 'repositories'],
64
+ env: ['environment', 'environments'],
65
+ config: ['configuration', 'configurations'],
66
+ admin: ['administrator', 'administrators'],
67
+ msg: ['message', 'messages'],
68
+ notif: ['notification', 'notifications'],
69
+ sub: ['subscription', 'subscriptions'],
70
+ perm: ['permission', 'permissions'],
71
+ dept: ['department', 'departments'],
72
+ acct: ['account', 'accounts'],
73
+ usr: ['user', 'users'],
74
+ doc: ['document', 'documents'],
75
+ txn: ['transaction', 'transactions'],
76
+ };
77
+ const FILLER_WORDS = new Set([
78
+ 'a', 'an', 'the', 'for', 'of', 'to', 'by', 'in', 'on', 'at', 'from',
79
+ 'with', 'within', 'between', 'after', 'before', 'into', 'as', 'all',
80
+ 'new', 'current', 'currently', 'active', 'specific', 'existing', 'given',
81
+ 'individual', 'particular', 'and', 'or', 'this', 'that', 'its',
82
+ ]);
83
+ // ── Tag helpers ───────────────────────────────────────
84
+ function getTagForms(tagName) {
85
+ const pc = pascalCase(tagName);
86
+ return pc.endsWith('s') ? [pc, pc.slice(0, -1)] : [pc, `${pc}s`];
87
+ }
88
+ function getTagWordsLower(tagName) {
89
+ const words = new Set();
90
+ for (const part of tagName.toLowerCase().split(/[\s\-_]+/)) {
91
+ words.add(part);
92
+ addPluralForms(words, part);
93
+ const formsToExpand = new Set([part]);
94
+ if (part.endsWith('ies'))
95
+ formsToExpand.add(`${part.slice(0, -3)}y`);
96
+ else if (part.endsWith('s') && part.length > 1)
97
+ formsToExpand.add(part.slice(0, -1));
98
+ else
99
+ formsToExpand.add(`${part}s`);
100
+ for (const form of formsToExpand) {
101
+ for (const expansion of ABBREVIATION_REGISTRY[form] ?? []) {
102
+ words.add(expansion);
103
+ addPluralForms(words, expansion);
104
+ }
105
+ }
106
+ }
107
+ return words;
108
+ }
109
+ function addPluralForms(set, word) {
110
+ if (word.endsWith('ies'))
111
+ set.add(`${word.slice(0, -3)}y`);
112
+ else if (word.endsWith('s'))
113
+ set.add(word.slice(0, -1));
114
+ else if (word.endsWith('y'))
115
+ set.add(`${word.slice(0, -1)}ies`);
116
+ else
117
+ set.add(`${word}s`);
118
+ }
119
+ // ── HTTP verb mapping ─────────────────────────────────
120
+ function mapHttpMethodToVerb(httpMethod, isCollection) {
121
+ switch (httpMethod.toLowerCase()) {
122
+ case 'get': return isCollection ? 'list' : 'get';
123
+ case 'post': return 'create';
124
+ case 'put':
125
+ case 'patch': return 'update';
126
+ case 'delete': return 'delete';
127
+ default: return httpMethod.toLowerCase();
128
+ }
129
+ }
130
+ function isCollectionEndpoint(path) {
131
+ const segments = path.split('/').filter(Boolean);
132
+ return segments.length === 0 || !segments[segments.length - 1].startsWith('{');
133
+ }
134
+ // ── Strategy helpers ──────────────────────────────────
135
+ function stripTagPrefix(remainder, tagForms) {
136
+ for (const form of tagForms) {
137
+ if (!remainder.startsWith(form))
138
+ continue;
139
+ const after = remainder.slice(form.length);
140
+ if (!after)
141
+ return '';
142
+ if (after[0] >= 'A' && after[0] <= 'Z')
143
+ return after;
144
+ if (after[0] === 's') {
145
+ const afterS = after.slice(1);
146
+ if (!afterS || (afterS[0] >= 'A' && afterS[0] <= 'Z'))
147
+ return afterS;
148
+ }
149
+ }
150
+ return remainder;
151
+ }
152
+ function stripTagSuffix(remainder, tagForms) {
153
+ const candidates = [...tagForms, ...tagForms.map((f) => `${f}s`)];
154
+ for (const form of candidates) {
155
+ if (remainder.endsWith(form)) {
156
+ const before = remainder.slice(0, -form.length);
157
+ if (before)
158
+ return before;
159
+ }
160
+ }
161
+ return remainder;
162
+ }
163
+ function isActionVerbWord(pcWord) {
164
+ return ACTION_VERBS.has(VERB_SYNONYMS[pcWord.toLowerCase()] ?? pcWord.toLowerCase());
165
+ }
166
+ function isCleanName(name) {
167
+ if (/By[A-Z]/.test(name))
168
+ return false;
169
+ return (name.match(/[A-Z]/g)?.length ?? 0) <= 3;
170
+ }
171
+ // ── Strategy 1: clean operationId ────────────────────
172
+ function cleanOperationId(opId, tagName) {
173
+ const pcOp = pascalCase(opId);
174
+ const tagForms = getTagForms(tagName);
175
+ const verbMatch = pcOp.match(/^(Get|Post|Put|Patch|Delete|List|Create|Update|Remove)/);
176
+ const verb = verbMatch?.[1] ?? '';
177
+ let remainder = verb ? pcOp.slice(verb.length) : pcOp;
178
+ remainder = stripTagPrefix(remainder, tagForms);
179
+ remainder = stripTagSuffix(remainder, tagForms);
180
+ remainder = remainder.replace(/By[A-Z][a-zA-Z]*/g, '');
181
+ if (!remainder)
182
+ return verb ? verb.toLowerCase() : camelCase(opId);
183
+ if (verb && isActionVerbWord(remainder))
184
+ return camelCase(remainder);
185
+ if (!verb)
186
+ return camelCase(remainder);
187
+ return camelCase(`${verb}${remainder}`);
188
+ }
189
+ // ── Strategy 2: clean summary ─────────────────────────
190
+ function cleanSummary(summary, tagName) {
191
+ const cleaned = summary.trim()
192
+ .replace(/\([^)]*\)/g, '')
193
+ .replace(/'s\b/g, '')
194
+ .replace(/\bby\s+\w+$/i, '')
195
+ .replace(/\s+/g, ' ')
196
+ .trim();
197
+ const words = cleaned.split(/\s+/);
198
+ if (!words.length)
199
+ return null;
200
+ let verb;
201
+ let objectStartIdx;
202
+ const first = words[0].toLowerCase();
203
+ const second = words[1]?.toLowerCase();
204
+ if (first === 'log' && second === 'out') {
205
+ verb = 'logOut';
206
+ objectStartIdx = 2;
207
+ }
208
+ else {
209
+ verb = VERB_SYNONYMS[first] ?? camelCase(first);
210
+ objectStartIdx = 1;
211
+ }
212
+ const tagWords = getTagWordsLower(tagName);
213
+ const objectWords = words.slice(objectStartIdx)
214
+ .map((w) => w.toLowerCase())
215
+ .filter((w) => !FILLER_WORDS.has(w) && !tagWords.has(w))
216
+ .slice(0, 3);
217
+ return objectWords.length ? camelCase(`${verb} ${objectWords.join(' ')}`) : verb;
218
+ }
219
+ // ── Strategy 3: path-derived ──────────────────────────
220
+ function cleanPathDerived(path, httpMethod, tagName) {
221
+ const tagWords = getTagWordsLower(tagName);
222
+ const meaningful = path.split('/').filter((s) => s && !s.startsWith('{') && !tagWords.has(s.toLowerCase()));
223
+ if (meaningful.length > 0) {
224
+ const last = meaningful[meaningful.length - 1];
225
+ if (isActionVerbWord(pascalCase(last))) {
226
+ const action = meaningful.pop();
227
+ return meaningful.length ? camelCase(`${action} ${meaningful.join(' ')}`) : camelCase(action);
228
+ }
229
+ }
230
+ const verb = mapHttpMethodToVerb(httpMethod, isCollectionEndpoint(path));
231
+ return meaningful.length ? camelCase(`${verb} ${meaningful.join(' ')}`) : verb;
232
+ }
233
+ export function deriveCleanMethodName(params) {
234
+ const { operationId, summary, path, httpMethod, tagName } = params;
235
+ if (operationId) {
236
+ const candidate = cleanOperationId(operationId, tagName);
237
+ if (isCleanName(candidate))
238
+ return candidate;
239
+ }
240
+ if (summary) {
241
+ const candidate = cleanSummary(summary, tagName);
242
+ if (candidate)
243
+ return candidate;
244
+ }
245
+ return cleanPathDerived(path, httpMethod, tagName);
246
+ }
247
+ // ── Deduplication ─────────────────────────────────────
248
+ /**
249
+ * Deduplicate method names within a group.
250
+ * Takes an array of names, returns a deduplicated array of the same length.
251
+ */
252
+ export function deduplicateMethodNames(names) {
253
+ const counts = new Map();
254
+ for (const n of names)
255
+ counts.set(n, (counts.get(n) ?? 0) + 1);
256
+ const result = [...names];
257
+ const seen = new Map();
258
+ for (let i = 0; i < result.length; i++) {
259
+ const name = result[i];
260
+ if ((counts.get(name) ?? 0) <= 1)
261
+ continue;
262
+ const idx = (seen.get(name) ?? 0) + 1;
263
+ seen.set(name, idx);
264
+ if (idx > 1) {
265
+ result[i] = `${name}${idx}`;
266
+ }
267
+ }
268
+ return result;
269
+ }
270
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@apollo-deploy/tesseract",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "Manifest-first SDK generator — turns sdk-manifold/v1 manifests into production-ready TypeScript SDKs",
6
+ "bin": {
7
+ "tesseract": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist/",
19
+ "templates/"
20
+ ],
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/Apollo-Deploy/sdk-generator.git"
28
+ },
29
+ "keywords": [
30
+ "sdk",
31
+ "codegen",
32
+ "manifest",
33
+ "typescript",
34
+ "cli",
35
+ "api",
36
+ "tesseract"
37
+ ],
38
+ "engines": {
39
+ "node": ">=18",
40
+ "bun": ">=1.0"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc",
44
+ "dev": "bun src/cli.ts",
45
+ "prepublishOnly": "bun run build"
46
+ },
47
+ "dependencies": {
48
+ "change-case": "^5.4.4",
49
+ "commander": "^12.1.0",
50
+ "handlebars": "^4.7.8",
51
+ "prettier": "^3.3.0",
52
+ "ts-morph": "^27.0.2"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^20.14.0",
56
+ "typescript": "^5.5.0"
57
+ }
58
+ }
@@ -0,0 +1,145 @@
1
+ /**
2
+ * @generated
3
+ * This file was automatically generated by sdk-forge.
4
+ * DO NOT MODIFY THIS FILE DIRECTLY.
5
+ */
6
+
7
+ import type { AxiosInstance, AxiosRequestConfig } from 'axios';
8
+ import { createTransport, type SDKTransport, type SDKPlugin, type RequestMeta, type ResponseMeta, type ErrorMeta } from './transport/axios.js';
9
+ {{#each groups}}
10
+ import { {{factoryName}}, type {{interfaceName}} } from './domain/{{fileName}}.js';
11
+ {{/each}}
12
+ {{#if hasWebhooks}}
13
+ import { createWebhookRegistry, type WebhookRegistry } from './webhooks/handler.js';
14
+ {{/if}}
15
+
16
+ /**
17
+ * Client configuration for {{meta.title}}
18
+ */
19
+ export interface {{meta.clientName}}ClientConfig {
20
+ /** Base URL for the API */
21
+ baseUrl?: string;
22
+ {{#if securitySchemes.length}}
23
+ {{#each securitySchemes}}
24
+ {{#if (eq type "apiKey")}}
25
+ /** API key value for the {{name}} security scheme */
26
+ {{configKey}}?: string;
27
+ {{/if}}
28
+ {{#if (and (eq type "http") (eq scheme "bearer"))}}
29
+ /** Bearer token for the {{name}} security scheme */
30
+ {{configKey}}?: string;
31
+ {{/if}}
32
+ {{#if (eq type "oauth2")}}
33
+ /** OAuth2 access token for the {{name}} security scheme */
34
+ {{configKey}}?: string;
35
+ {{/if}}
36
+ {{#if (eq type "openIdConnect")}}
37
+ /** OpenID Connect access token for the {{name}} security scheme */
38
+ {{configKey}}?: string;
39
+ {{/if}}
40
+ {{/each}}
41
+ {{/if}}
42
+ /** Request timeout in milliseconds (default: 15000) */
43
+ timeoutMs?: number;
44
+ /** Retry configuration */
45
+ retries?: { attempts: number; backoffMs: number; jitter: boolean; maxBackoffMs?: number };
46
+ /** Custom idempotency key generator */
47
+ getIdempotencyKey?: () => string;
48
+ /** Request telemetry hook */
49
+ onRequest?: (meta: RequestMeta) => void;
50
+ /** Response telemetry hook */
51
+ onResponse?: (meta: ResponseMeta) => void;
52
+ /** Error telemetry hook */
53
+ onError?: (meta: ErrorMeta) => void;
54
+ /** Send credentials (cookies, HTTP auth) on cross-origin requests */
55
+ withCredentials?: boolean;
56
+ /** Static cookie key/value pairs sent with every request */
57
+ cookies?: Record<string, string>;
58
+ /** Ordered list of plugins applied to every request and response */
59
+ plugins?: SDKPlugin[];
60
+ /** Default headers sent with every request */
61
+ defaultHeaders?: Record<string, string>;
62
+ /** Custom Axios configuration (proxy, httpsAgent, etc.) */
63
+ axiosConfig?: Omit<AxiosRequestConfig, 'baseURL' | 'timeout' | 'withCredentials' | 'headers'>;
64
+ /** Custom function to map raw errors to SDKError */
65
+ mapError?: (error: unknown) => import('./types/errors.js').SDKError;
66
+ /** HTTP methods that should receive an idempotency key */
67
+ idempotentMethods?: string[];
68
+ }
69
+
70
+ /**
71
+ * {{meta.title}} SDK Client
72
+ */
73
+ export interface {{meta.clientName}}Client {
74
+ /** Client configuration */
75
+ config: {{meta.clientName}}ClientConfig;
76
+ /** Transport runtime for advanced use */
77
+ transport: SDKTransport;
78
+ /** Raw Axios instance (advanced use) */
79
+ _axios: AxiosInstance;
80
+ {{#each groups}}
81
+ /** {{#if description}}{{description}}{{else}}{{interfaceName}} operations{{/if}} */
82
+ {{name}}: {{interfaceName}};
83
+ {{/each}}
84
+ {{#if hasWebhooks}}
85
+ /** Typed webhook event handler registry */
86
+ webhooks: WebhookRegistry;
87
+ {{/if}}
88
+ }
89
+
90
+ /**
91
+ * Create a new {{meta.title}} SDK client
92
+ */
93
+ export function create{{meta.clientName}}Client(cfg: {{meta.clientName}}ClientConfig = {}): {{meta.clientName}}Client {
94
+ const config: {{meta.clientName}}ClientConfig = {
95
+ baseUrl: cfg.baseUrl ?? '{{meta.baseUrl}}',
96
+ {{#each securitySchemes}}
97
+ {{configKey}}: cfg.{{configKey}},
98
+ {{/each}}
99
+ timeoutMs: cfg.timeoutMs ?? 15000,
100
+ retries: cfg.retries ?? { attempts: 3, backoffMs: 400, jitter: true },
101
+ getIdempotencyKey: cfg.getIdempotencyKey,
102
+ onRequest: cfg.onRequest,
103
+ onResponse: cfg.onResponse,
104
+ onError: cfg.onError,
105
+ withCredentials: cfg.withCredentials,
106
+ cookies: cfg.cookies,
107
+ plugins: cfg.plugins,
108
+ defaultHeaders: cfg.defaultHeaders,
109
+ axiosConfig: cfg.axiosConfig,
110
+ mapError: cfg.mapError,
111
+ idempotentMethods: cfg.idempotentMethods,
112
+ };
113
+
114
+ const transport = createTransport({
115
+ baseUrl: config.baseUrl!,
116
+ {{#each securitySchemes}}
117
+ {{configKey}}: config.{{configKey}},
118
+ {{/each}}
119
+ timeoutMs: config.timeoutMs,
120
+ retries: config.retries,
121
+ getIdempotencyKey: config.getIdempotencyKey,
122
+ onRequest: config.onRequest,
123
+ onResponse: config.onResponse,
124
+ onError: config.onError,
125
+ withCredentials: config.withCredentials,
126
+ cookies: config.cookies,
127
+ plugins: config.plugins,
128
+ defaultHeaders: config.defaultHeaders,
129
+ axiosConfig: config.axiosConfig,
130
+ mapError: config.mapError,
131
+ idempotentMethods: config.idempotentMethods,
132
+ });
133
+
134
+ return {
135
+ config,
136
+ transport,
137
+ _axios: transport.axios,
138
+ {{#each groups}}
139
+ {{name}}: {{factoryName}}(transport),
140
+ {{/each}}
141
+ {{#if hasWebhooks}}
142
+ webhooks: createWebhookRegistry(),
143
+ {{/if}}
144
+ };
145
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @generated
3
+ * This file was automatically generated by sdk-forge.
4
+ * DO NOT MODIFY THIS FILE DIRECTLY.
5
+ */
6
+
7
+ {{#each groups}}
8
+ export { {{factoryName}} } from './{{fileName}}.js';
9
+ export type { {{interfaceName}} } from './{{fileName}}.js';
10
+ {{/each}}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * @generated
3
+ * This file was automatically generated by sdk-forge.
4
+ * DO NOT MODIFY THIS FILE DIRECTLY.
5
+ */
6
+
7
+ import type { SDKTransport, RequestOptions } from '../transport/axios.js';
8
+ {{#if hasSSE}}
9
+ import { createSSEStream, type SSEEvent, type SSEOptions } from '../transport/sse.js';
10
+ {{/if}}
11
+ {{#if imports.length}}
12
+ import type {
13
+ {{#each imports}}
14
+ {{this}},
15
+ {{/each}}
16
+ } from '../types/index.js';
17
+ {{/if}}
18
+
19
+ export interface {{interfaceName}} {
20
+ {{#each operations}}
21
+ {{#if (isEventStream this)}}
22
+ {{#if summary}}
23
+ /** {{summary}}{{#if description}} — {{description}}{{/if}} (SSE stream) */
24
+ {{else if description}}
25
+ /** {{description}} (SSE stream) */
26
+ {{/if}}
27
+ {{name}}{{{sseMethodSignature this}}};
28
+ {{else}}
29
+ {{#if summary}}
30
+ {{#if deprecated}}
31
+ /** @deprecated {{summary}}{{#if description}} — {{description}}{{/if}} */
32
+ {{else}}
33
+ /** {{summary}}{{#if description}} — {{description}}{{/if}} */
34
+ {{/if}}
35
+ {{else if description}}
36
+ {{#if deprecated}}
37
+ /** @deprecated {{description}} */
38
+ {{else}}
39
+ /** {{description}} */
40
+ {{/if}}
41
+ {{else}}
42
+ {{#if deprecated}}
43
+ /** @deprecated */
44
+ {{/if}}
45
+ {{/if}}
46
+ {{name}}{{{methodSignature this}}};
47
+ {{/if}}
48
+
49
+ {{/each}}
50
+ }
51
+
52
+ export function {{factoryName}}(transport: SDKTransport): {{interfaceName}} {
53
+ {{#each operations}}
54
+ {{#unless (isEventStream this)}}
55
+ const {{name}}Request = {{{requestBuilderParams this}}} => {
56
+ {{#if (hasQueryParams this)}}
57
+ const params = query
58
+ ? {
59
+ {{#each queryParams}}
60
+ '{{originalName}}': query.{{name}},
61
+ {{/each}}
62
+ }
63
+ : undefined;
64
+ {{else if queryType}}
65
+ const params = query;
66
+ {{/if}}
67
+ const requestHeaders: Record<string, string> = {};
68
+ {{#if (hasRequestBody this)}}
69
+ {{#if (and (neq requestBody.contentType "application/json") (neq requestBody.contentType "multipart/form-data"))}}
70
+ requestHeaders['Content-Type'] = '{{requestBody.contentType}}';
71
+ {{/if}}
72
+ {{/if}}
73
+ {{#if headerParams.length}}
74
+ if (headers) {
75
+ {{#each headerParams}}
76
+ if (headers.{{name}} !== undefined && headers.{{name}} !== null) {
77
+ requestHeaders['{{originalName}}'] = String(headers.{{name}});
78
+ }
79
+ {{/each}}
80
+ }
81
+ {{/if}}
82
+ {{#if cookieParams}}
83
+ if (cookies) {
84
+ const cookiePairs: string[] = [];
85
+ {{#each cookieParams}}
86
+ if (cookies.{{name}} !== undefined && cookies.{{name}} !== null) {
87
+ cookiePairs.push(`{{originalName}}=${encodeURIComponent(String(cookies.{{name}}))}`);
88
+ }
89
+ {{/each}}
90
+ if (cookiePairs.length > 0) {
91
+ requestHeaders.Cookie = cookiePairs.join('; ');
92
+ }
93
+ }
94
+ {{/if}}
95
+
96
+ return {
97
+ method: '{{httpMethod}}',
98
+ url: `{{path}}`,
99
+ {{#if (hasRequestBody this)}}
100
+ data: input,
101
+ {{/if}}
102
+ {{#if (or (hasQueryParams this) queryType)}}
103
+ params,
104
+ {{/if}}
105
+ headers: Object.keys(requestHeaders).length > 0 ? requestHeaders : undefined,
106
+ };
107
+ };
108
+ {{/unless}}
109
+
110
+ {{/each}}
111
+ return {
112
+ {{#each operations}}
113
+ {{#if (isEventStream this)}}
114
+ {{name}}{{{sseMethodParams this}}}: AsyncIterable<SSEEvent<{{#if eventSchema}}{{eventSchema}}{{else}}Record<string, unknown>{{/if}}>> {
115
+ const url = new URL(`{{path}}`, transport.config.baseUrl).toString();
116
+ return createSSEStream<{{#if eventSchema}}{{eventSchema}}{{else}}Record<string, unknown>{{/if}}>(url, { method: '{{httpMethod}}' }, undefined, options);
117
+ },
118
+
119
+ {{else}}
120
+ {{name}}{{{methodParams this}}}: Promise<{{responseType}}> {
121
+ return transport.executeRequest<{{responseType}}>({{name}}Request({{{methodArgs this}}}), options);
122
+ },
123
+
124
+ {{/if}}
125
+ {{/each}}
126
+ };
127
+ }