@apollo-deploy/tesseract 0.4.4 → 0.5.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.
- package/README.md +330 -11
- package/dist/adapters/types.d.ts +2 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/typescript/index.d.ts +2 -1
- package/dist/adapters/typescript/index.d.ts.map +1 -1
- package/dist/adapters/typescript/index.js +27 -10
- package/dist/adapters/typescript/index.js.map +1 -1
- package/dist/cli.js +19 -1
- package/dist/cli.js.map +1 -1
- package/dist/collector.d.ts +135 -0
- package/dist/collector.d.ts.map +1 -0
- package/dist/collector.js +159 -0
- package/dist/collector.js.map +1 -0
- package/dist/elysia.d.ts +65 -0
- package/dist/elysia.d.ts.map +1 -0
- package/dist/elysia.js +70 -0
- package/dist/elysia.js.map +1 -0
- package/dist/express.d.ts +74 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +73 -0
- package/dist/express.js.map +1 -0
- package/dist/fastify.d.ts +135 -0
- package/dist/fastify.d.ts.map +1 -0
- package/dist/fastify.js +188 -0
- package/dist/fastify.js.map +1 -0
- package/dist/hono.d.ts +65 -0
- package/dist/hono.d.ts.map +1 -0
- package/dist/hono.js +64 -0
- package/dist/hono.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/koa.d.ts +69 -0
- package/dist/koa.d.ts.map +1 -0
- package/dist/koa.js +68 -0
- package/dist/koa.js.map +1 -0
- package/dist/nestjs.d.ts +107 -0
- package/dist/nestjs.d.ts.map +1 -0
- package/dist/nestjs.js +143 -0
- package/dist/nestjs.js.map +1 -0
- package/dist/pipeline/intake.d.ts.map +1 -1
- package/dist/pipeline/intake.js +35 -21
- package/dist/pipeline/intake.js.map +1 -1
- package/dist/pipeline/write.d.ts +1 -0
- package/dist/pipeline/write.d.ts.map +1 -1
- package/dist/pipeline/write.js +21 -3
- package/dist/pipeline/write.js.map +1 -1
- package/dist/types/config.d.ts +13 -3
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +5 -2
- package/dist/types/config.js.map +1 -1
- package/dist/types/ir.d.ts +8 -0
- package/dist/types/ir.d.ts.map +1 -1
- package/dist/types/manifest.d.ts +5 -30
- package/dist/types/manifest.d.ts.map +1 -1
- package/dist/types/manifest.js.map +1 -1
- package/dist/types/sdk-module.d.ts +128 -0
- package/dist/types/sdk-module.d.ts.map +1 -0
- package/dist/types/sdk-module.js +50 -0
- package/dist/types/sdk-module.js.map +1 -0
- package/package.json +63 -1
- package/templates/typescript/client-class.hbs +136 -0
- package/templates/typescript/domain-class.hbs +188 -0
- package/templates/typescript/domain.hbs +5 -1
- package/templates/typescript/index-class.hbs +68 -0
package/README.md
CHANGED
|
@@ -22,9 +22,9 @@ This reads your manifest and produces a complete npm-ready SDK in `./sdk/`.
|
|
|
22
22
|
|
|
23
23
|
## CLI
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
### `tesseract generate`
|
|
26
|
+
|
|
27
|
+
Generate an SDK from a static manifest file.
|
|
28
28
|
|
|
29
29
|
| Flag | Required | Description |
|
|
30
30
|
|------|----------|-------------|
|
|
@@ -34,16 +34,30 @@ tesseract generate [options]
|
|
|
34
34
|
| `--package-version <version>` | No | Override the generated package version |
|
|
35
35
|
| `--client-name <name>` | No | Override the generated client class name |
|
|
36
36
|
| `--base-url <url>` | No | Override the default base URL |
|
|
37
|
+
| `--sdk-style <style>` | No | `functional` (default) or `class` (Resend-style `new MySDK('key')`) |
|
|
38
|
+
| `--client-type <type>` | No | `internal` (full options, default) or `public` (auth key only, baseUrl baked in) |
|
|
37
39
|
| `--dry-run` | No | Preview changes without writing files |
|
|
38
40
|
| `--check` | No | Exit non-zero if generated output is out of date |
|
|
39
41
|
|
|
42
|
+
`--dry-run` and `--check` are mutually exclusive.
|
|
43
|
+
|
|
44
|
+
### `tesseract run`
|
|
45
|
+
|
|
46
|
+
Boot an instrumented Fastify app with `TESSERACT_GENERATE=1` to collect annotated routes at runtime and generate an SDK without a static manifest file.
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
tesseract run dist/app.js
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The app must register `tesseractPlugin` from `@apollo-deploy/tesseract/fastify`. See [Fastify Integration](#fastify-integration) below.
|
|
53
|
+
|
|
40
54
|
## Input: The Manifest
|
|
41
55
|
|
|
42
|
-
Tesseract consumes a `BackendManifest` JSON file with schema
|
|
56
|
+
Tesseract consumes a `BackendManifest` JSON file with `$schema: "sdk-manifold/v1"`:
|
|
43
57
|
|
|
44
58
|
```json
|
|
45
59
|
{
|
|
46
|
-
"schema": "sdk-manifold/v1",
|
|
60
|
+
"$schema": "sdk-manifold/v1",
|
|
47
61
|
"info": {
|
|
48
62
|
"title": "My API",
|
|
49
63
|
"version": "1.0.0",
|
|
@@ -52,7 +66,7 @@ Tesseract consumes a `BackendManifest` JSON file with schema `"sdk-manifold/v1"`
|
|
|
52
66
|
},
|
|
53
67
|
"domains": [
|
|
54
68
|
{
|
|
55
|
-
"
|
|
69
|
+
"domain": "users",
|
|
56
70
|
"prefix": "/users",
|
|
57
71
|
"stability": "stable",
|
|
58
72
|
"routes": [
|
|
@@ -83,7 +97,7 @@ Tesseract consumes a `BackendManifest` JSON file with schema `"sdk-manifold/v1"`
|
|
|
83
97
|
### Key Manifest Fields
|
|
84
98
|
|
|
85
99
|
- **`info`** — Title, version, description, and base URL for the API
|
|
86
|
-
- **`domains`** — Groups of routes organized by domain, each with a prefix, stability level (`stable` / `experimental` / `internal`), and route definitions
|
|
100
|
+
- **`domains`** — Groups of routes organized by domain, each with a prefix, stability level (`stable` / `experimental` / `internal`), and route definitions. `internal`-stability domains are excluded from public SDK builds.
|
|
87
101
|
- **`definitions`** — JSON Schema definitions for shared types
|
|
88
102
|
- **`schemaPackage`** _(optional)_ — An external npm package to import types from instead of generating them
|
|
89
103
|
|
|
@@ -92,13 +106,300 @@ Tesseract consumes a `BackendManifest` JSON file with schema `"sdk-manifold/v1"`
|
|
|
92
106
|
Each route in a domain can specify:
|
|
93
107
|
|
|
94
108
|
- **`method`** / **`url`** — HTTP method and Fastify-style URL pattern (`:param`)
|
|
95
|
-
- **`schema`** — JSON Schemas for params
|
|
96
|
-
- **`sdk`** — SDK-specific config:
|
|
109
|
+
- **`schema`** — JSON Schemas for `params`, `querystring`, `body`, `headers`, and `response`
|
|
110
|
+
- **`sdk`** — SDK-specific config: `methodName`, `transport` (`json` | `multipart` | `binary` | `stream`), `exclude`, `deprecated`, `internal`, `timeout`, `requiredHeaders`
|
|
97
111
|
- **`sse: true`** — Marks the route as a Server-Sent Events stream
|
|
98
112
|
|
|
113
|
+
## Framework Integration
|
|
114
|
+
|
|
115
|
+
Tesseract ships adapters for every major Node.js API framework. Each adapter is a separate subpath export so you only pull in what you use.
|
|
116
|
+
|
|
117
|
+
| Framework | Import |
|
|
118
|
+
|-----------|--------|
|
|
119
|
+
| **Fastify** | `@apollo-deploy/tesseract/fastify` |
|
|
120
|
+
| **Express** | `@apollo-deploy/tesseract/express` |
|
|
121
|
+
| **Hono** | `@apollo-deploy/tesseract/hono` |
|
|
122
|
+
| **Koa** | `@apollo-deploy/tesseract/koa` |
|
|
123
|
+
| **Elysia** | `@apollo-deploy/tesseract/elysia` |
|
|
124
|
+
| **NestJS** | `@apollo-deploy/tesseract/nestjs` |
|
|
125
|
+
| **Generic / any framework** | `import { SDKCollector } from '@apollo-deploy/tesseract'` |
|
|
126
|
+
|
|
127
|
+
All non-Fastify adapters follow the same pattern:
|
|
128
|
+
|
|
129
|
+
1. Create an `SDKCollector` (or framework-specific subclass) with your API metadata.
|
|
130
|
+
2. Register domains and routes with the collector alongside your framework route definitions.
|
|
131
|
+
3. Call `collector.tryGenerate()` (or let a plugin do it) — it only runs when `TESSERACT_GENERATE=1`.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
### Fastify
|
|
136
|
+
|
|
137
|
+
The Fastify adapter hooks into `onRoute` to collect routes automatically at boot time — no manual registration needed.
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
// app.ts
|
|
141
|
+
import { tesseractPlugin } from '@apollo-deploy/tesseract/fastify';
|
|
142
|
+
|
|
143
|
+
app.register(tesseractPlugin, {
|
|
144
|
+
info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
145
|
+
output: './packages/api-sdk',
|
|
146
|
+
// Optional: import types from a shared package instead of regenerating them
|
|
147
|
+
schemaPackage: { name: '@my-org/schemas', version: '^2.0.0' },
|
|
148
|
+
sdkStyle: 'functional', // or 'class'
|
|
149
|
+
clientType: 'internal', // or 'public'
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
The plugin is a complete no-op unless `TESSERACT_GENERATE=1` is set, so it is safe to register unconditionally.
|
|
154
|
+
|
|
155
|
+
Add `sdk` as a top-level option on each route (sibling to `schema`):
|
|
156
|
+
|
|
157
|
+
```ts
|
|
158
|
+
fastify.get('/:id', {
|
|
159
|
+
schema: { response: { 200: UserSchema } },
|
|
160
|
+
sdk: { methodName: 'getUser' },
|
|
161
|
+
}, handler);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Use `sdkDomain()` to name the domain and set a description:
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
import fp from 'fastify-plugin';
|
|
168
|
+
import { sdkDomain } from '@apollo-deploy/tesseract/fastify';
|
|
169
|
+
|
|
170
|
+
export default fp(async (fastify) => {
|
|
171
|
+
sdkDomain(fastify, { domain: 'users', description: 'User management' });
|
|
172
|
+
|
|
173
|
+
fastify.get('/:id', {
|
|
174
|
+
schema: { response: { 200: UserSchema } },
|
|
175
|
+
sdk: { methodName: 'getUser' },
|
|
176
|
+
}, handler);
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Or use the `@SDKModule()` class decorator:
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
import { SDKModule } from '@apollo-deploy/tesseract';
|
|
184
|
+
|
|
185
|
+
@SDKModule({ prefix: '/users', domain: 'users', description: 'User management' })
|
|
186
|
+
export class UsersPlugin {
|
|
187
|
+
register(app: FastifyInstance) {
|
|
188
|
+
app.get('/:id', { schema: { ... }, sdk: { methodName: 'getUser' } }, handler);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Trigger:**
|
|
194
|
+
```bash
|
|
195
|
+
tesseract run dist/app.js
|
|
196
|
+
# or
|
|
197
|
+
TESSERACT_GENERATE=1 node dist/app.js
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
### Express
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
import express from 'express';
|
|
206
|
+
import { ExpressSDKCollector } from '@apollo-deploy/tesseract/express';
|
|
207
|
+
|
|
208
|
+
const app = express();
|
|
209
|
+
const collector = new ExpressSDKCollector({
|
|
210
|
+
info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
211
|
+
output: './packages/api-sdk',
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
collector.domain('/users', { domain: 'users', description: 'User management' });
|
|
215
|
+
|
|
216
|
+
app.get('/users/:id',
|
|
217
|
+
collector.expressRoute('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
218
|
+
getUserHandler,
|
|
219
|
+
);
|
|
220
|
+
app.post('/users',
|
|
221
|
+
collector.expressRoute('/users', 'POST', { sdk: { methodName: 'createUser' } }),
|
|
222
|
+
createUserHandler,
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
// After all routes are registered:
|
|
226
|
+
if (await collector.tryGenerate()) process.exit(0);
|
|
227
|
+
|
|
228
|
+
app.listen(3000);
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Trigger:** `TESSERACT_GENERATE=1 node dist/app.js`
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
### Hono
|
|
236
|
+
|
|
237
|
+
```ts
|
|
238
|
+
import { Hono } from 'hono';
|
|
239
|
+
import { HonoSDKCollector } from '@apollo-deploy/tesseract/hono';
|
|
240
|
+
|
|
241
|
+
const app = new Hono();
|
|
242
|
+
const collector = new HonoSDKCollector({
|
|
243
|
+
info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
244
|
+
output: './packages/api-sdk',
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
collector.domain('/users', { domain: 'users', description: 'User management' });
|
|
248
|
+
|
|
249
|
+
app.get('/users/:id',
|
|
250
|
+
collector.honoMiddleware('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
251
|
+
(c) => c.json(getUser(c.req.param('id'))),
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
if (await collector.tryGenerate()) process.exit(0);
|
|
255
|
+
|
|
256
|
+
export default app;
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**Trigger:** `TESSERACT_GENERATE=1 node dist/app.js`
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
### Koa
|
|
264
|
+
|
|
265
|
+
```ts
|
|
266
|
+
import Koa from 'koa';
|
|
267
|
+
import Router from '@koa/router';
|
|
268
|
+
import { KoaSDKCollector } from '@apollo-deploy/tesseract/koa';
|
|
269
|
+
|
|
270
|
+
const app = new Koa();
|
|
271
|
+
const router = new Router();
|
|
272
|
+
const collector = new KoaSDKCollector({
|
|
273
|
+
info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
274
|
+
output: './packages/api-sdk',
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
collector.domain('/users', { domain: 'users', description: 'User management' });
|
|
278
|
+
|
|
279
|
+
router.get('/users/:id',
|
|
280
|
+
collector.koaMiddleware('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
281
|
+
getUserHandler,
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
app.use(router.routes());
|
|
285
|
+
|
|
286
|
+
if (await collector.tryGenerate()) process.exit(0);
|
|
287
|
+
|
|
288
|
+
app.listen(3000);
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**Trigger:** `TESSERACT_GENERATE=1 node dist/app.js`
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
### Elysia
|
|
296
|
+
|
|
297
|
+
```ts
|
|
298
|
+
import { Elysia } from 'elysia';
|
|
299
|
+
import { tesseractPlugin } from '@apollo-deploy/tesseract/elysia';
|
|
300
|
+
|
|
301
|
+
const { plugin, collector } = tesseractPlugin({
|
|
302
|
+
info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
303
|
+
output: './packages/api-sdk',
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
collector.domain('/users', { domain: 'users', description: 'User management' });
|
|
307
|
+
collector.route('/users/:id', 'GET', { sdk: { methodName: 'getUser' } });
|
|
308
|
+
collector.route('/users', 'POST', { sdk: { methodName: 'createUser' } });
|
|
309
|
+
|
|
310
|
+
const app = new Elysia()
|
|
311
|
+
.use(plugin)
|
|
312
|
+
.get('/users/:id', ({ params }) => getUser(params.id))
|
|
313
|
+
.post('/users', ({ body }) => createUser(body))
|
|
314
|
+
.listen(3000);
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
The plugin triggers generation automatically in its `onStart` hook when `TESSERACT_GENERATE=1` is set.
|
|
318
|
+
|
|
319
|
+
**Trigger:** `TESSERACT_GENERATE=1 bun run dist/app.js`
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
### NestJS
|
|
324
|
+
|
|
325
|
+
Decorate controllers and methods, then call `collectFromNestControllers()` at bootstrap:
|
|
326
|
+
|
|
327
|
+
```ts
|
|
328
|
+
// users.controller.ts
|
|
329
|
+
import { Controller, Get, Post, Param, Body } from '@nestjs/common';
|
|
330
|
+
import { SDKMethod, SDKDomain } from '@apollo-deploy/tesseract/nestjs';
|
|
331
|
+
|
|
332
|
+
@Controller('users')
|
|
333
|
+
@SDKDomain({ domain: 'users', description: 'User management' })
|
|
334
|
+
export class UsersController {
|
|
335
|
+
@Get(':id')
|
|
336
|
+
@SDKMethod({ methodName: 'getUser', schema: { response: { 200: { $ref: 'User' } } } })
|
|
337
|
+
getUser(@Param('id') id: string) { ... }
|
|
338
|
+
|
|
339
|
+
@Post()
|
|
340
|
+
@SDKMethod({ methodName: 'createUser' })
|
|
341
|
+
createUser(@Body() body: CreateUserDto) { ... }
|
|
342
|
+
}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
```ts
|
|
346
|
+
// main.ts
|
|
347
|
+
import { NestFactory } from '@nestjs/core';
|
|
348
|
+
import { AppModule } from './app.module';
|
|
349
|
+
import { SDKCollector, collectFromNestControllers } from '@apollo-deploy/tesseract/nestjs';
|
|
350
|
+
import { UsersController } from './users/users.controller';
|
|
351
|
+
|
|
352
|
+
async function bootstrap() {
|
|
353
|
+
const app = await NestFactory.create(AppModule);
|
|
354
|
+
await app.init();
|
|
355
|
+
|
|
356
|
+
if (process.env.TESSERACT_GENERATE) {
|
|
357
|
+
const collector = new SDKCollector({
|
|
358
|
+
info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
359
|
+
output: './packages/api-sdk',
|
|
360
|
+
});
|
|
361
|
+
collectFromNestControllers([UsersController], collector);
|
|
362
|
+
await collector.generate();
|
|
363
|
+
await app.close();
|
|
364
|
+
process.exit(0);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
await app.listen(3000);
|
|
368
|
+
}
|
|
369
|
+
bootstrap();
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
Requires `reflect-metadata` (standard NestJS dep) and `"emitDecoratorMetadata": true` in `tsconfig.json`.
|
|
373
|
+
|
|
374
|
+
**Trigger:** `TESSERACT_GENERATE=1 node dist/main.js`
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
### Generic / any framework
|
|
379
|
+
|
|
380
|
+
Use `SDKCollector` directly from the main package with any HTTP framework:
|
|
381
|
+
|
|
382
|
+
```ts
|
|
383
|
+
import { SDKCollector } from '@apollo-deploy/tesseract';
|
|
384
|
+
|
|
385
|
+
const collector = new SDKCollector({
|
|
386
|
+
info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
387
|
+
output: './packages/api-sdk',
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
collector.domain('/users', { domain: 'users', description: 'User management' });
|
|
391
|
+
collector.route('/users/:id', 'GET', { sdk: { methodName: 'getUser' } });
|
|
392
|
+
collector.route('/users', 'POST', { sdk: { methodName: 'createUser' } });
|
|
393
|
+
|
|
394
|
+
// After all routes are declared:
|
|
395
|
+
if (await collector.tryGenerate()) process.exit(0);
|
|
396
|
+
```
|
|
397
|
+
|
|
99
398
|
## Output
|
|
100
399
|
|
|
101
|
-
Tesseract generates a complete, publishable npm package
|
|
400
|
+
Tesseract generates a complete, publishable npm package. The structure varies slightly by `sdkStyle`.
|
|
401
|
+
|
|
402
|
+
**Functional style** (default — `createMyClient(config)`):
|
|
102
403
|
|
|
103
404
|
```
|
|
104
405
|
sdk/
|
|
@@ -125,6 +426,8 @@ sdk/
|
|
|
125
426
|
└── handler.ts # Typed webhook registry (if needed)
|
|
126
427
|
```
|
|
127
428
|
|
|
429
|
+
**Class style** (`--sdk-style class` — `new MySDK('api_key', options?)`): generates `client-class.ts`, `domain-class/` files, and a matching `index.ts` using the class-based entry point.
|
|
430
|
+
|
|
128
431
|
### Generated SDK Features
|
|
129
432
|
|
|
130
433
|
- **Typed client** with grouped domain methods
|
|
@@ -215,17 +518,33 @@ await generate({
|
|
|
215
518
|
});
|
|
216
519
|
```
|
|
217
520
|
|
|
521
|
+
You can also pass a pre-parsed manifest object instead of a file path:
|
|
522
|
+
|
|
523
|
+
```typescript
|
|
524
|
+
import { generate } from '@apollo-deploy/tesseract';
|
|
525
|
+
import type { BackendManifest } from '@apollo-deploy/tesseract';
|
|
526
|
+
|
|
527
|
+
const manifest: BackendManifest = { /* ... */ };
|
|
528
|
+
|
|
529
|
+
await generate({ manifest, output: './sdk' });
|
|
530
|
+
```
|
|
531
|
+
|
|
218
532
|
### Configuration
|
|
219
533
|
|
|
534
|
+
Either `input` or `manifest` must be provided.
|
|
535
|
+
|
|
220
536
|
| Option | Type | Description |
|
|
221
537
|
|--------|------|-------------|
|
|
222
|
-
| `input` | `string
|
|
538
|
+
| `input` | `string?` | Path to the manifest file. Required if `manifest` is not provided. |
|
|
539
|
+
| `manifest` | `BackendManifest?` | Pre-parsed manifest object. Alternative to `input`. |
|
|
223
540
|
| `output` | `string` | Output directory |
|
|
224
541
|
| `language` | `'typescript'` | Target language |
|
|
225
542
|
| `packageName` | `string?` | Override npm package name |
|
|
226
543
|
| `packageVersion` | `string?` | Override generated package version; defaults to `info.version` from the manifest |
|
|
227
544
|
| `clientName` | `string?` | Override client class name |
|
|
228
545
|
| `baseUrl` | `string?` | Override default base URL |
|
|
546
|
+
| `sdkStyle` | `'functional' \| 'class'?` | `functional` (default) generates a `createMyClient(config)` factory; `class` generates a Resend-style `new MySDK('api_key', options?)` class |
|
|
547
|
+
| `clientType` | `'internal' \| 'public'?` | `internal` (default) exposes full config options; `public` accepts only an auth key with `baseUrl` baked in |
|
|
229
548
|
| `environments` | `{ name: string; baseUrl: string }[]?` | Named environment presets |
|
|
230
549
|
| `dryRun` | `boolean?` | Transform only, no file I/O |
|
|
231
550
|
| `check` | `boolean?` | Compare output without writing |
|
package/dist/adapters/types.d.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* Each supported language implements this contract.
|
|
4
4
|
*/
|
|
5
5
|
import type { EnrichedSDKIR } from '../types/ir.js';
|
|
6
|
+
import type { ResolvedConfig } from '../types/config.js';
|
|
6
7
|
import type { EmittedFile } from '../pipeline/write.js';
|
|
7
8
|
export interface EmitResult {
|
|
8
9
|
files: EmittedFile[];
|
|
@@ -10,6 +11,6 @@ export interface EmitResult {
|
|
|
10
11
|
}
|
|
11
12
|
export interface LanguageAdapter {
|
|
12
13
|
readonly language: string;
|
|
13
|
-
emit(enriched: EnrichedSDKIR, outputDir: string): Promise<EmitResult>;
|
|
14
|
+
emit(enriched: EnrichedSDKIR, outputDir: string, config?: ResolvedConfig): Promise<EmitResult>;
|
|
14
15
|
}
|
|
15
16
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAChG"}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { EnrichedSDKIR } from '../../types/ir.js';
|
|
6
6
|
import type { LanguageAdapter, EmitResult } from '../types.js';
|
|
7
|
+
import type { ResolvedConfig } from '../../types/config.js';
|
|
7
8
|
export declare class TypeScriptAdapter implements LanguageAdapter {
|
|
8
9
|
readonly language = "typescript";
|
|
9
|
-
emit(enriched: EnrichedSDKIR, outputDir: string): Promise<EmitResult>;
|
|
10
|
+
emit(enriched: EnrichedSDKIR, outputDir: string, config?: ResolvedConfig): Promise<EmitResult>;
|
|
10
11
|
}
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/typescript/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/typescript/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAO5D,qBAAa,iBAAkB,YAAW,eAAe;IACvD,QAAQ,CAAC,QAAQ,gBAAgB;IAE3B,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;CA6IrG"}
|
|
@@ -9,8 +9,9 @@ import { getTemplate, registerHelpers, collectImports } from '../../helpers/hand
|
|
|
9
9
|
import { formatTypeScript } from '../../utils/format.js';
|
|
10
10
|
export class TypeScriptAdapter {
|
|
11
11
|
language = 'typescript';
|
|
12
|
-
async emit(enriched, outputDir) {
|
|
12
|
+
async emit(enriched, outputDir, config) {
|
|
13
13
|
registerHelpers();
|
|
14
|
+
const sdkStyle = config?.sdkStyle ?? 'functional';
|
|
14
15
|
const files = [];
|
|
15
16
|
const warnings = [];
|
|
16
17
|
const { generatedSchemas, externalSchemas } = splitSchemasByOwnership(enriched.schemas);
|
|
@@ -19,7 +20,18 @@ export class TypeScriptAdapter {
|
|
|
19
20
|
const externalTypeNames = new Set(externalSchemas.map((s) => s.name));
|
|
20
21
|
const commonTypeExports = COMMON_TYPE_NAMES.filter((name) => !externalTypeNames.has(name));
|
|
21
22
|
const externalPackages = collectExternalPackages(enriched.schemas, enriched.meta.schemaPackage);
|
|
22
|
-
const
|
|
23
|
+
const clientType = config?.clientType ?? 'internal';
|
|
24
|
+
// For public SDKs, strip internal groups and internal operations from mixed groups.
|
|
25
|
+
const visibleGroups = clientType === 'public'
|
|
26
|
+
? enriched.groups
|
|
27
|
+
.filter((g) => g.visibility !== 'internal')
|
|
28
|
+
.map((g) => ({
|
|
29
|
+
...g,
|
|
30
|
+
operations: g.operations.filter((op) => op.visibility !== 'internal'),
|
|
31
|
+
}))
|
|
32
|
+
.filter((g) => g.operations.length > 0)
|
|
33
|
+
: enriched.groups;
|
|
34
|
+
const hasSSE = visibleGroups.some((g) => g.operations.some((op) => op.isEventStream));
|
|
23
35
|
// ── ts-morph: model type files ───────────────────────────────────────────
|
|
24
36
|
let domainTypeFiles = [];
|
|
25
37
|
try {
|
|
@@ -32,8 +44,9 @@ export class TypeScriptAdapter {
|
|
|
32
44
|
}
|
|
33
45
|
// ── Handlebars: all other TypeScript files ───────────────────────────────
|
|
34
46
|
// Domain files
|
|
35
|
-
const
|
|
36
|
-
|
|
47
|
+
const domainTemplateName = sdkStyle === 'class' ? 'domain-class' : 'domain';
|
|
48
|
+
const domainTemplate = getTemplate('typescript', domainTemplateName);
|
|
49
|
+
for (const group of visibleGroups) {
|
|
37
50
|
try {
|
|
38
51
|
const imports = collectImports(group.operations, schemaNames);
|
|
39
52
|
const groupHasSSE = group.operations.some((op) => op.isEventStream);
|
|
@@ -47,7 +60,7 @@ export class TypeScriptAdapter {
|
|
|
47
60
|
}
|
|
48
61
|
}
|
|
49
62
|
// Domain index barrel
|
|
50
|
-
tryEmit(files, warnings, join('src', 'domain', 'index.ts'), () => getTemplate('typescript', 'domain-index')({ groups:
|
|
63
|
+
tryEmit(files, warnings, join('src', 'domain', 'index.ts'), () => getTemplate('typescript', 'domain-index')({ groups: visibleGroups }));
|
|
51
64
|
// Types
|
|
52
65
|
tryEmit(files, warnings, join('src', 'types', 'common.ts'), () => getTemplate('typescript', 'types-common')({}));
|
|
53
66
|
tryEmit(files, warnings, join('src', 'types', 'errors.ts'), () => getTemplate('typescript', 'types-errors')({}));
|
|
@@ -67,17 +80,21 @@ export class TypeScriptAdapter {
|
|
|
67
80
|
tryEmit(files, warnings, join('src', 'utils', 'query.ts'), () => getTemplate('typescript', 'utils-query')({}));
|
|
68
81
|
tryEmit(files, warnings, join('src', 'utils', 'index.ts'), () => getTemplate('typescript', 'utils-index')({}));
|
|
69
82
|
// Client, index, package.json, tsconfig, README
|
|
70
|
-
|
|
83
|
+
const clientTemplateName = sdkStyle === 'class' ? 'client-class' : 'client';
|
|
84
|
+
tryEmit(files, warnings, join('src', 'client.ts'), () => getTemplate('typescript', clientTemplateName)({
|
|
71
85
|
meta: enriched.meta,
|
|
72
|
-
groups:
|
|
86
|
+
groups: visibleGroups,
|
|
73
87
|
securitySchemes: enriched.securitySchemes,
|
|
74
88
|
hasSSE,
|
|
89
|
+
clientType,
|
|
75
90
|
}));
|
|
76
|
-
|
|
91
|
+
const indexTemplateName = sdkStyle === 'class' ? 'index-class' : 'index';
|
|
92
|
+
tryEmit(files, warnings, 'index.ts', () => getTemplate('typescript', indexTemplateName)({
|
|
77
93
|
meta: enriched.meta,
|
|
78
|
-
groups:
|
|
94
|
+
groups: visibleGroups,
|
|
79
95
|
schemas: enriched.schemas,
|
|
80
96
|
hasSSE,
|
|
97
|
+
clientType,
|
|
81
98
|
}));
|
|
82
99
|
const resolvedPackageVersion = enriched.meta.packageVersion
|
|
83
100
|
? enriched.meta.packageVersion
|
|
@@ -90,7 +107,7 @@ export class TypeScriptAdapter {
|
|
|
90
107
|
tryEmit(files, warnings, 'tsconfig.json', () => getTemplate('typescript', 'tsconfig')({}));
|
|
91
108
|
tryEmit(files, warnings, 'README.md', () => getTemplate('typescript', 'readme')({
|
|
92
109
|
...enriched.meta,
|
|
93
|
-
groups:
|
|
110
|
+
groups: visibleGroups,
|
|
94
111
|
schemas: enriched.schemas,
|
|
95
112
|
securitySchemes: enriched.securitySchemes,
|
|
96
113
|
hasSSE,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/typescript/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/typescript/index.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -17,7 +17,7 @@ program
|
|
|
17
17
|
.version(pkg.version);
|
|
18
18
|
program
|
|
19
19
|
.command('generate')
|
|
20
|
-
.description('Generate an SDK from an sdk-manifold/v1 manifest')
|
|
20
|
+
.description('Generate an SDK from an sdk-manifold/v1 manifest file')
|
|
21
21
|
.requiredOption('-i, --input <path>', 'Path to the sdk-manifold/v1 manifest JSON file')
|
|
22
22
|
.requiredOption('-o, --output <dir>', 'Output directory for the generated SDK')
|
|
23
23
|
.option('-n, --name <name>', 'Override the SDK package name')
|
|
@@ -26,6 +26,8 @@ program
|
|
|
26
26
|
.option('--base-url <url>', 'Override the base URL')
|
|
27
27
|
.option('--dry-run', 'Preview output without writing files')
|
|
28
28
|
.option('--check', 'Exit non-zero if generated output is out of date')
|
|
29
|
+
.option('--sdk-style <style>', 'SDK style: functional (default) or class (Resend-style: new MySDK("key"))')
|
|
30
|
+
.option('--client-type <type>', 'Client type: internal (full options, default) or public (auth key only, baseUrl baked in)')
|
|
29
31
|
.action(async (opts) => {
|
|
30
32
|
if (opts.dryRun && opts.check) {
|
|
31
33
|
console.error('\n✗ --dry-run and --check are mutually exclusive');
|
|
@@ -41,6 +43,8 @@ program
|
|
|
41
43
|
baseUrl: opts.baseUrl,
|
|
42
44
|
dryRun: opts.dryRun,
|
|
43
45
|
check: opts.check,
|
|
46
|
+
sdkStyle: opts.sdkStyle,
|
|
47
|
+
clientType: opts.clientType,
|
|
44
48
|
};
|
|
45
49
|
try {
|
|
46
50
|
const result = await generate(config);
|
|
@@ -82,5 +86,19 @@ program
|
|
|
82
86
|
process.exit(1);
|
|
83
87
|
}
|
|
84
88
|
});
|
|
89
|
+
program
|
|
90
|
+
.command('run')
|
|
91
|
+
.description('Boot an instrumented Fastify app with TESSERACT_GENERATE=1 to collect routes and generate an SDK.\n' +
|
|
92
|
+
'The app must register `tesseractPlugin` from `@apollo-deploy/tesseract/fastify`.')
|
|
93
|
+
.argument('<app>', 'Path to the compiled app entry-point (e.g. dist/app.js)')
|
|
94
|
+
.action(async (appPath) => {
|
|
95
|
+
const { spawnSync } = await import('node:child_process');
|
|
96
|
+
const resolved = resolve(appPath);
|
|
97
|
+
const result = spawnSync(process.execPath, [resolved], {
|
|
98
|
+
env: { ...process.env, TESSERACT_GENERATE: '1' },
|
|
99
|
+
stdio: 'inherit',
|
|
100
|
+
});
|
|
101
|
+
process.exit(result.status ?? 0);
|
|
102
|
+
});
|
|
85
103
|
program.parse();
|
|
86
104
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAErF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,sGAAsG,CAAC;KACnH,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|