@apollo-deploy/tesseract 0.4.4 → 0.5.1
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
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tesseract Fastify integration.
|
|
3
|
+
*
|
|
4
|
+
* Provides a Fastify plugin that collects annotated routes at runtime and
|
|
5
|
+
* generates an SDK when triggered by `TESSERACT_GENERATE=1`.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* // app.ts
|
|
9
|
+
* import { tesseractPlugin } from '@apollo-deploy/tesseract/fastify';
|
|
10
|
+
*
|
|
11
|
+
* app.register(tesseractPlugin, {
|
|
12
|
+
* info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
13
|
+
* output: './packages/api-sdk',
|
|
14
|
+
* });
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* Then run: `TESSERACT_GENERATE=1 node dist/app.js`
|
|
18
|
+
* Or via CLI: `tesseract run dist/app.js`
|
|
19
|
+
*/
|
|
20
|
+
import type { FastifyInstance, FastifyPluginAsync } from 'fastify';
|
|
21
|
+
import type { SDKModuleConfig, SDKRouteConfig } from './types/sdk-module.js';
|
|
22
|
+
declare module 'fastify' {
|
|
23
|
+
interface RouteOptions {
|
|
24
|
+
/** SDK generation configuration for this route. Sibling to `schema`. */
|
|
25
|
+
sdk?: SDKRouteConfig;
|
|
26
|
+
}
|
|
27
|
+
interface RouteShorthandOptions {
|
|
28
|
+
/** SDK generation configuration for this route. Sibling to `schema`. */
|
|
29
|
+
sdk?: SDKRouteConfig;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export interface TesseractPluginOptions {
|
|
33
|
+
/** API metadata written into the generated SDK's package.json and README. */
|
|
34
|
+
info: {
|
|
35
|
+
title: string;
|
|
36
|
+
version: string;
|
|
37
|
+
baseUrl?: string;
|
|
38
|
+
description?: string;
|
|
39
|
+
};
|
|
40
|
+
/** Output directory for the generated SDK. */
|
|
41
|
+
output: string;
|
|
42
|
+
/**
|
|
43
|
+
* Shared type package used across your backend and generated SDK.
|
|
44
|
+
*
|
|
45
|
+
* When set, bare `$ref` values in route schemas (e.g. `{ $ref: 'Deployment' }`)
|
|
46
|
+
* are treated as type names from this package. Tesseract emits
|
|
47
|
+
* `import type { Deployment } from '<name>'` instead of regenerating types.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* app.register(tesseractPlugin, {
|
|
52
|
+
* info: { ... },
|
|
53
|
+
* output: './packages/api-sdk',
|
|
54
|
+
* schemaPackage: { name: '@apollo-deploy/schemas', version: '^2.1.0' },
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
schemaPackage?: {
|
|
59
|
+
name: string;
|
|
60
|
+
version?: string;
|
|
61
|
+
importPath?: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Function to convert framework-specific schema objects to JSON Schema at generation time.
|
|
65
|
+
*
|
|
66
|
+
* Required when using `fastify-type-provider-zod` (or similar): Fastify exposes raw Zod
|
|
67
|
+
* schema objects in the `onRoute` hook, not compiled JSON Schema. Pass `toJSONSchema` from
|
|
68
|
+
* `zod` here so Tesseract can read parameter and response types correctly.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* import { toJSONSchema } from 'zod';
|
|
73
|
+
* app.register(tesseractPlugin, { ..., schemaConverter: toJSONSchema });
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
schemaConverter?: (schema: unknown) => unknown;
|
|
77
|
+
/**
|
|
78
|
+
* `'public'` strips routes marked `internal: true` from the SDK.
|
|
79
|
+
* `'internal'` includes all routes. Defaults to `'internal'`.
|
|
80
|
+
*/
|
|
81
|
+
clientType?: 'public' | 'internal';
|
|
82
|
+
/** Override the generated npm package name. */
|
|
83
|
+
packageName?: string;
|
|
84
|
+
/** Override the generated package version. */
|
|
85
|
+
packageVersion?: string;
|
|
86
|
+
/** `'functional'` (default) or `'class'` (Resend-style `new MySDK('key')`). */
|
|
87
|
+
sdkStyle?: 'functional' | 'class';
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Declare SDK domain metadata for the current Fastify plugin scope.
|
|
91
|
+
*
|
|
92
|
+
* Call at the top of a plugin function to name the domain and set a
|
|
93
|
+
* description. The prefix is read automatically from `fastify.prefix`.
|
|
94
|
+
*
|
|
95
|
+
* ```ts
|
|
96
|
+
* import fp from 'fastify-plugin';
|
|
97
|
+
* import { sdkDomain } from '@apollo-deploy/tesseract/fastify';
|
|
98
|
+
*
|
|
99
|
+
* export default fp(async (fastify) => {
|
|
100
|
+
* sdkDomain(fastify, { domain: 'users', description: 'User management' });
|
|
101
|
+
*
|
|
102
|
+
* fastify.get('/:id', {
|
|
103
|
+
* schema: { response: { 200: UserSchema } },
|
|
104
|
+
* config: { sdk: { methodName: 'get' } },
|
|
105
|
+
* }, handler);
|
|
106
|
+
* });
|
|
107
|
+
* ```
|
|
108
|
+
*
|
|
109
|
+
* Not needed when using the `@SDKModule()` class decorator — it registers
|
|
110
|
+
* domain metadata automatically.
|
|
111
|
+
*/
|
|
112
|
+
export declare function sdkDomain(fastify: FastifyInstance, config: Omit<SDKModuleConfig, 'prefix'> & {
|
|
113
|
+
prefix?: string;
|
|
114
|
+
}): void;
|
|
115
|
+
/**
|
|
116
|
+
* Fastify plugin that collects SDK-annotated routes and generates an SDK
|
|
117
|
+
* when `TESSERACT_GENERATE=1` is set in the environment.
|
|
118
|
+
*
|
|
119
|
+
* Wrapped with `fastify-plugin` so the `onRoute` hook is registered at the
|
|
120
|
+
* root scope and captures routes from all sibling plugins.
|
|
121
|
+
*
|
|
122
|
+
* Register once at the application root — it is a complete no-op unless the
|
|
123
|
+
* env var is set, so it is safe to register unconditionally.
|
|
124
|
+
*
|
|
125
|
+
* ```ts
|
|
126
|
+
* import { tesseractPlugin } from '@apollo-deploy/tesseract/fastify';
|
|
127
|
+
*
|
|
128
|
+
* app.register(tesseractPlugin, {
|
|
129
|
+
* info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
130
|
+
* output: './packages/api-sdk',
|
|
131
|
+
* });
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export declare const tesseractPlugin: FastifyPluginAsync<TesseractPluginOptions>;
|
|
135
|
+
//# sourceMappingURL=fastify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAS7E,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,YAAY;QACpB,wEAAwE;QACxE,GAAG,CAAC,EAAE,cAAc,CAAC;KACtB;IACD,UAAU,qBAAqB;QAC7B,wEAAwE;QACxE,GAAG,CAAC,EAAE,cAAc,CAAC;KACtB;CACF;AAYD,MAAM,WAAW,sBAAsB;IACrC,6EAA6E;IAC7E,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;;;;;;;OAeG;IACH,aAAa,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IAC/C;;;OAGG;IACH,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACnC,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;CACnC;AAID;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,IAAI,CAGN;AA6HD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,4CAG1B,CAAC"}
|
package/dist/fastify.js
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tesseract Fastify integration.
|
|
3
|
+
*
|
|
4
|
+
* Provides a Fastify plugin that collects annotated routes at runtime and
|
|
5
|
+
* generates an SDK when triggered by `TESSERACT_GENERATE=1`.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* // app.ts
|
|
9
|
+
* import { tesseractPlugin } from '@apollo-deploy/tesseract/fastify';
|
|
10
|
+
*
|
|
11
|
+
* app.register(tesseractPlugin, {
|
|
12
|
+
* info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
13
|
+
* output: './packages/api-sdk',
|
|
14
|
+
* });
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* Then run: `TESSERACT_GENERATE=1 node dist/app.js`
|
|
18
|
+
* Or via CLI: `tesseract run dist/app.js`
|
|
19
|
+
*/
|
|
20
|
+
import fp from 'fastify-plugin';
|
|
21
|
+
import { _domainRegistry } from './types/sdk-module.js';
|
|
22
|
+
import { buildManifestFromRoutes } from './collector.js';
|
|
23
|
+
// ── Domain registration helper ────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Declare SDK domain metadata for the current Fastify plugin scope.
|
|
26
|
+
*
|
|
27
|
+
* Call at the top of a plugin function to name the domain and set a
|
|
28
|
+
* description. The prefix is read automatically from `fastify.prefix`.
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* import fp from 'fastify-plugin';
|
|
32
|
+
* import { sdkDomain } from '@apollo-deploy/tesseract/fastify';
|
|
33
|
+
*
|
|
34
|
+
* export default fp(async (fastify) => {
|
|
35
|
+
* sdkDomain(fastify, { domain: 'users', description: 'User management' });
|
|
36
|
+
*
|
|
37
|
+
* fastify.get('/:id', {
|
|
38
|
+
* schema: { response: { 200: UserSchema } },
|
|
39
|
+
* config: { sdk: { methodName: 'get' } },
|
|
40
|
+
* }, handler);
|
|
41
|
+
* });
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* Not needed when using the `@SDKModule()` class decorator — it registers
|
|
45
|
+
* domain metadata automatically.
|
|
46
|
+
*/
|
|
47
|
+
export function sdkDomain(fastify, config) {
|
|
48
|
+
const prefix = config.prefix ?? fastify.prefix ?? '/';
|
|
49
|
+
_domainRegistry.set(prefix, { prefix, ...config });
|
|
50
|
+
}
|
|
51
|
+
// ── Plugin ────────────────────────────────────────────────────────────────────
|
|
52
|
+
/** Returns true if `value` is a Zod v4 schema instance. */
|
|
53
|
+
function isZodSchema(value) {
|
|
54
|
+
return !!value && typeof value === 'object' && '_zod' in value;
|
|
55
|
+
}
|
|
56
|
+
function convertSchemaValue(value, toJSONSchema) {
|
|
57
|
+
if (isZodSchema(value)) {
|
|
58
|
+
try {
|
|
59
|
+
return toJSONSchema(value);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
function convertRouteSchema(schema, toJSONSchema) {
|
|
68
|
+
if (!schema)
|
|
69
|
+
return schema;
|
|
70
|
+
const result = {};
|
|
71
|
+
for (const [key, val] of Object.entries(schema)) {
|
|
72
|
+
if (key === 'response' && val && typeof val === 'object') {
|
|
73
|
+
const serialized = {};
|
|
74
|
+
for (const [status, responseSchema] of Object.entries(val)) {
|
|
75
|
+
serialized[status] = convertSchemaValue(responseSchema, toJSONSchema);
|
|
76
|
+
}
|
|
77
|
+
result[key] = serialized;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
result[key] = convertSchemaValue(val, toJSONSchema);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
const _tesseractPlugin = async (fastify, opts) => {
|
|
86
|
+
if (!process.env.TESSERACT_GENERATE)
|
|
87
|
+
return;
|
|
88
|
+
const collectedRoutes = [];
|
|
89
|
+
fastify.addHook('onRoute', (routeOptions) => {
|
|
90
|
+
const sdk = routeOptions.sdk;
|
|
91
|
+
if (!sdk || sdk.exclude)
|
|
92
|
+
return;
|
|
93
|
+
// Fastify auto-generates HEAD for every GET; skip to avoid duplicates.
|
|
94
|
+
const method = Array.isArray(routeOptions.method)
|
|
95
|
+
? routeOptions.method[0]
|
|
96
|
+
: routeOptions.method;
|
|
97
|
+
if (method === 'HEAD')
|
|
98
|
+
return;
|
|
99
|
+
collectedRoutes.push({
|
|
100
|
+
url: routeOptions.url,
|
|
101
|
+
method,
|
|
102
|
+
schema: routeOptions.schema,
|
|
103
|
+
sdk,
|
|
104
|
+
sse: routeOptions.sse,
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
fastify.addHook('onReady', async () => {
|
|
108
|
+
if (collectedRoutes.length === 0) {
|
|
109
|
+
console.error('\n[tesseract] No SDK routes found. Add `sdk: { ... }` to routes or use `@SDKModule` + `sdkDomain()`.');
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
// Convert Zod v4 schemas to JSON Schema (dynamic import so Tesseract doesn't
|
|
113
|
+
// need zod as a hard dependency — it resolves via the host app's node_modules).
|
|
114
|
+
let resolvedRoutes = collectedRoutes;
|
|
115
|
+
const toJSONSchema = opts.schemaConverter;
|
|
116
|
+
if (typeof toJSONSchema === 'function') {
|
|
117
|
+
resolvedRoutes = collectedRoutes.map((r) => ({
|
|
118
|
+
...r,
|
|
119
|
+
schema: convertRouteSchema(r.schema, toJSONSchema),
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// Attempt automatic detection via dynamic import as fallback.
|
|
124
|
+
try {
|
|
125
|
+
const zodPkg = 'zod';
|
|
126
|
+
const zodModule = await import(zodPkg);
|
|
127
|
+
const zodConverter = zodModule.toJSONSchema;
|
|
128
|
+
if (typeof zodConverter === 'function') {
|
|
129
|
+
resolvedRoutes = collectedRoutes.map((r) => ({
|
|
130
|
+
...r,
|
|
131
|
+
schema: convertRouteSchema(r.schema, zodConverter),
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// zod not available — schemas stay as-is (JSON Schema passed directly)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const manifest = buildManifestFromRoutes(resolvedRoutes, _domainRegistry, opts.info, opts.schemaPackage);
|
|
140
|
+
console.log(`\n[tesseract] ${manifest.domains.length} domain(s), ${collectedRoutes.length} route(s) → ${opts.output}`);
|
|
141
|
+
// Dynamic import keeps the generation pipeline out of the user's app bundle
|
|
142
|
+
// when TESSERACT_GENERATE is not set (the plugin returns early above).
|
|
143
|
+
try {
|
|
144
|
+
const { generate } = await import('./index.js');
|
|
145
|
+
const result = await generate({
|
|
146
|
+
manifest,
|
|
147
|
+
output: opts.output,
|
|
148
|
+
clientType: opts.clientType,
|
|
149
|
+
packageName: opts.packageName,
|
|
150
|
+
packageVersion: opts.packageVersion,
|
|
151
|
+
sdkStyle: opts.sdkStyle,
|
|
152
|
+
});
|
|
153
|
+
for (const w of result.warnings) {
|
|
154
|
+
console.warn(` ⚠ ${w}`);
|
|
155
|
+
}
|
|
156
|
+
console.log(`[tesseract] ✓ ${result.filesWritten} files written\n`);
|
|
157
|
+
process.exit(0);
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
console.error('[tesseract] Generation failed:', err);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Fastify plugin that collects SDK-annotated routes and generates an SDK
|
|
167
|
+
* when `TESSERACT_GENERATE=1` is set in the environment.
|
|
168
|
+
*
|
|
169
|
+
* Wrapped with `fastify-plugin` so the `onRoute` hook is registered at the
|
|
170
|
+
* root scope and captures routes from all sibling plugins.
|
|
171
|
+
*
|
|
172
|
+
* Register once at the application root — it is a complete no-op unless the
|
|
173
|
+
* env var is set, so it is safe to register unconditionally.
|
|
174
|
+
*
|
|
175
|
+
* ```ts
|
|
176
|
+
* import { tesseractPlugin } from '@apollo-deploy/tesseract/fastify';
|
|
177
|
+
*
|
|
178
|
+
* app.register(tesseractPlugin, {
|
|
179
|
+
* info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
180
|
+
* output: './packages/api-sdk',
|
|
181
|
+
* });
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
export const tesseractPlugin = fp(_tesseractPlugin, {
|
|
185
|
+
name: 'tesseract',
|
|
186
|
+
fastify: '>=4',
|
|
187
|
+
});
|
|
188
|
+
//# sourceMappingURL=fastify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"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"}
|
package/dist/hono.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tesseract Hono integration.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports `SDKCollector` and adds a `HonoSDKCollector` subclass with a
|
|
5
|
+
* `.honoMiddleware()` helper that registers a route with the collector and
|
|
6
|
+
* returns a no-op Hono middleware handler for inline placement.
|
|
7
|
+
*
|
|
8
|
+
* Because Hono has no route-registration hook, routes are registered with the
|
|
9
|
+
* collector explicitly. Generation is triggered by calling
|
|
10
|
+
* `collector.tryGenerate()` after all routes are set up.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { Hono } from 'hono';
|
|
14
|
+
* import { HonoSDKCollector } from '@apollo-deploy/tesseract/hono';
|
|
15
|
+
*
|
|
16
|
+
* const app = new Hono();
|
|
17
|
+
* const collector = new HonoSDKCollector({
|
|
18
|
+
* info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
19
|
+
* output: './packages/api-sdk',
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* collector.domain('/users', { domain: 'users', description: 'User management' });
|
|
23
|
+
*
|
|
24
|
+
* app.get('/users/:id',
|
|
25
|
+
* collector.honoMiddleware('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
26
|
+
* (c) => c.json(getUser(c.req.param('id'))),
|
|
27
|
+
* );
|
|
28
|
+
*
|
|
29
|
+
* // After all routes are registered:
|
|
30
|
+
* if (await collector.tryGenerate()) process.exit(0);
|
|
31
|
+
*
|
|
32
|
+
* export default app;
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* **Triggering generation:**
|
|
36
|
+
* ```bash
|
|
37
|
+
* TESSERACT_GENERATE=1 node dist/app.js
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
import { SDKCollector } from './collector.js';
|
|
41
|
+
import type { CollectorRouteConfig } from './collector.js';
|
|
42
|
+
export { SDKCollector } from './collector.js';
|
|
43
|
+
export type { CollectorOptions, CollectorRouteConfig } from './collector.js';
|
|
44
|
+
/** Minimal Hono middleware type — avoids a hard import of the `hono` package. */
|
|
45
|
+
type HonoMiddleware = (c: unknown, next: () => Promise<void>) => Promise<void> | void;
|
|
46
|
+
/**
|
|
47
|
+
* `SDKCollector` subclass with a Hono-specific `.honoMiddleware()` helper.
|
|
48
|
+
*
|
|
49
|
+
* `.honoMiddleware()` registers a route with the collector **and** returns a
|
|
50
|
+
* no-op Hono middleware for inline placement in `app.get()` / `app.post()` etc.
|
|
51
|
+
*/
|
|
52
|
+
export declare class HonoSDKCollector extends SDKCollector {
|
|
53
|
+
/**
|
|
54
|
+
* Register a route with the collector and return a no-op Hono middleware.
|
|
55
|
+
*
|
|
56
|
+
* ```ts
|
|
57
|
+
* app.get('/users/:id',
|
|
58
|
+
* collector.honoMiddleware('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
59
|
+
* (c) => c.json(getUser(c.req.param('id'))),
|
|
60
|
+
* );
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
honoMiddleware(url: string, method: string, config: CollectorRouteConfig): HonoMiddleware;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=hono.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../src/hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,iFAAiF;AACjF,KAAK,cAAc,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEtF;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD;;;;;;;;;OASG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,cAAc;CAI1F"}
|
package/dist/hono.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tesseract Hono integration.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports `SDKCollector` and adds a `HonoSDKCollector` subclass with a
|
|
5
|
+
* `.honoMiddleware()` helper that registers a route with the collector and
|
|
6
|
+
* returns a no-op Hono middleware handler for inline placement.
|
|
7
|
+
*
|
|
8
|
+
* Because Hono has no route-registration hook, routes are registered with the
|
|
9
|
+
* collector explicitly. Generation is triggered by calling
|
|
10
|
+
* `collector.tryGenerate()` after all routes are set up.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { Hono } from 'hono';
|
|
14
|
+
* import { HonoSDKCollector } from '@apollo-deploy/tesseract/hono';
|
|
15
|
+
*
|
|
16
|
+
* const app = new Hono();
|
|
17
|
+
* const collector = new HonoSDKCollector({
|
|
18
|
+
* info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
19
|
+
* output: './packages/api-sdk',
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* collector.domain('/users', { domain: 'users', description: 'User management' });
|
|
23
|
+
*
|
|
24
|
+
* app.get('/users/:id',
|
|
25
|
+
* collector.honoMiddleware('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
26
|
+
* (c) => c.json(getUser(c.req.param('id'))),
|
|
27
|
+
* );
|
|
28
|
+
*
|
|
29
|
+
* // After all routes are registered:
|
|
30
|
+
* if (await collector.tryGenerate()) process.exit(0);
|
|
31
|
+
*
|
|
32
|
+
* export default app;
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* **Triggering generation:**
|
|
36
|
+
* ```bash
|
|
37
|
+
* TESSERACT_GENERATE=1 node dist/app.js
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
import { SDKCollector } from './collector.js';
|
|
41
|
+
export { SDKCollector } from './collector.js';
|
|
42
|
+
/**
|
|
43
|
+
* `SDKCollector` subclass with a Hono-specific `.honoMiddleware()` helper.
|
|
44
|
+
*
|
|
45
|
+
* `.honoMiddleware()` registers a route with the collector **and** returns a
|
|
46
|
+
* no-op Hono middleware for inline placement in `app.get()` / `app.post()` etc.
|
|
47
|
+
*/
|
|
48
|
+
export class HonoSDKCollector extends SDKCollector {
|
|
49
|
+
/**
|
|
50
|
+
* Register a route with the collector and return a no-op Hono middleware.
|
|
51
|
+
*
|
|
52
|
+
* ```ts
|
|
53
|
+
* app.get('/users/:id',
|
|
54
|
+
* collector.honoMiddleware('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
55
|
+
* (c) => c.json(getUser(c.req.param('id'))),
|
|
56
|
+
* );
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
honoMiddleware(url, method, config) {
|
|
60
|
+
this.route(url, method, config);
|
|
61
|
+
return (_c, next) => next();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=hono.js.map
|
package/dist/hono.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.js","sourceRoot":"","sources":["../src/hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM9C;;;;;GAKG;AACH,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAChD;;;;;;;;;OASG;IACH,cAAc,CAAC,GAAW,EAAE,MAAc,EAAE,MAA4B;QACtE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,5 +15,10 @@ export declare function generate(config: TesseractConfig): Promise<GenerateResul
|
|
|
15
15
|
export type { TesseractConfig } from './types/config.js';
|
|
16
16
|
export type { SDKIR, EnrichedSDKIR } from './types/ir.js';
|
|
17
17
|
export type { LanguageAdapter, EmitResult } from './adapters/types.js';
|
|
18
|
+
export type { SDKModuleConfig, SDKRouteConfig } from './types/sdk-module.js';
|
|
19
|
+
export { SDKModule, SDK_MODULE_CONFIG } from './types/sdk-module.js';
|
|
20
|
+
export type { BackendManifest } from './types/manifest.js';
|
|
18
21
|
export type { EmittedFile } from './pipeline/write.js';
|
|
22
|
+
export { SDKCollector } from './collector.js';
|
|
23
|
+
export type { CollectorOptions, CollectorRouteConfig } from './collector.js';
|
|
19
24
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IACpC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAMD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA0C/E;AAGD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IACpC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAMD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA0C/E;AAGD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -24,7 +24,7 @@ export async function generate(config) {
|
|
|
24
24
|
}
|
|
25
25
|
const adapter = adapterFactory();
|
|
26
26
|
const outputDir = resolve(resolved.output);
|
|
27
|
-
const emitResult = await adapter.emit(enriched, outputDir);
|
|
27
|
+
const emitResult = await adapter.emit(enriched, outputDir, resolved);
|
|
28
28
|
if (resolved.dryRun || resolved.check) {
|
|
29
29
|
const compareResult = compare(emitResult.files, outputDir);
|
|
30
30
|
return {
|
|
@@ -47,4 +47,7 @@ export async function generate(config) {
|
|
|
47
47
|
changedFiles: writeResult.written,
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
|
+
export { SDKModule, SDK_MODULE_CONFIG } from './types/sdk-module.js';
|
|
51
|
+
// Framework-agnostic collector
|
|
52
|
+
export { SDKCollector } from './collector.js';
|
|
50
53
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAanE,MAAM,QAAQ,GAA0C;IACtD,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;CAC1C,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAuB;IACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEvC,8BAA8B;IAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE5B,mCAAmC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAE5B,iCAAiC;IACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,QAAQ,iBAAiB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAanE,MAAM,QAAQ,GAA0C;IACtD,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE;CAC1C,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAuB;IACpD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEvC,8BAA8B;IAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE5B,mCAAmC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAE5B,iCAAiC;IACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,QAAQ,iBAAiB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAErE,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAE3D,OAAO;YACL,YAAY,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM;YAC1C,YAAY,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM;YAC1C,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,UAAU,EAAE,aAAa,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAC5C,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YAC1C,YAAY,EAAE,aAAa,CAAC,OAAO;SACpC,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAEvD,OAAO;QACL,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM;QACxC,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM;QACxC,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QAC1C,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,WAAW,CAAC,OAAO;KAClC,CAAC;AACJ,CAAC;AAOD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAIrE,+BAA+B;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/koa.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tesseract Koa integration.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports `SDKCollector` and adds a `KoaSDKCollector` subclass with a
|
|
5
|
+
* `.koaMiddleware()` helper that registers a route with the collector and
|
|
6
|
+
* returns a no-op Koa middleware for inline placement with `@koa/router`.
|
|
7
|
+
*
|
|
8
|
+
* Because Koa has no route-registration hook, routes are registered with the
|
|
9
|
+
* collector explicitly. Generation is triggered by calling
|
|
10
|
+
* `collector.tryGenerate()` after all routes are set up.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* import Koa from 'koa';
|
|
14
|
+
* import Router from '@koa/router';
|
|
15
|
+
* import { KoaSDKCollector } from '@apollo-deploy/tesseract/koa';
|
|
16
|
+
*
|
|
17
|
+
* const app = new Koa();
|
|
18
|
+
* const router = new Router();
|
|
19
|
+
* const collector = new KoaSDKCollector({
|
|
20
|
+
* info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
21
|
+
* output: './packages/api-sdk',
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* collector.domain('/users', { domain: 'users', description: 'User management' });
|
|
25
|
+
*
|
|
26
|
+
* router.get('/users/:id',
|
|
27
|
+
* collector.koaMiddleware('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
28
|
+
* getUserHandler,
|
|
29
|
+
* );
|
|
30
|
+
*
|
|
31
|
+
* app.use(router.routes());
|
|
32
|
+
*
|
|
33
|
+
* // After all routes are registered:
|
|
34
|
+
* if (await collector.tryGenerate()) process.exit(0);
|
|
35
|
+
*
|
|
36
|
+
* app.listen(3000);
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* **Triggering generation:**
|
|
40
|
+
* ```bash
|
|
41
|
+
* TESSERACT_GENERATE=1 node dist/app.js
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
import { SDKCollector } from './collector.js';
|
|
45
|
+
import type { CollectorRouteConfig } from './collector.js';
|
|
46
|
+
export { SDKCollector } from './collector.js';
|
|
47
|
+
export type { CollectorOptions, CollectorRouteConfig } from './collector.js';
|
|
48
|
+
/** Minimal Koa middleware type — avoids a hard import of the `koa` package. */
|
|
49
|
+
type KoaMiddleware = (ctx: unknown, next: () => Promise<void>) => Promise<void> | void;
|
|
50
|
+
/**
|
|
51
|
+
* `SDKCollector` subclass with a Koa-specific `.koaMiddleware()` helper.
|
|
52
|
+
*
|
|
53
|
+
* `.koaMiddleware()` registers a route with the collector **and** returns a
|
|
54
|
+
* no-op Koa middleware for inline placement with `@koa/router`.
|
|
55
|
+
*/
|
|
56
|
+
export declare class KoaSDKCollector extends SDKCollector {
|
|
57
|
+
/**
|
|
58
|
+
* Register a route with the collector and return a no-op Koa middleware.
|
|
59
|
+
*
|
|
60
|
+
* ```ts
|
|
61
|
+
* router.get('/users/:id',
|
|
62
|
+
* collector.koaMiddleware('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
63
|
+
* getUserHandler,
|
|
64
|
+
* );
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
koaMiddleware(url: string, method: string, config: CollectorRouteConfig): KoaMiddleware;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=koa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koa.d.ts","sourceRoot":"","sources":["../src/koa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,+EAA+E;AAC/E,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEvF;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C;;;;;;;;;OASG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,aAAa;CAIxF"}
|
package/dist/koa.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tesseract Koa integration.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports `SDKCollector` and adds a `KoaSDKCollector` subclass with a
|
|
5
|
+
* `.koaMiddleware()` helper that registers a route with the collector and
|
|
6
|
+
* returns a no-op Koa middleware for inline placement with `@koa/router`.
|
|
7
|
+
*
|
|
8
|
+
* Because Koa has no route-registration hook, routes are registered with the
|
|
9
|
+
* collector explicitly. Generation is triggered by calling
|
|
10
|
+
* `collector.tryGenerate()` after all routes are set up.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* import Koa from 'koa';
|
|
14
|
+
* import Router from '@koa/router';
|
|
15
|
+
* import { KoaSDKCollector } from '@apollo-deploy/tesseract/koa';
|
|
16
|
+
*
|
|
17
|
+
* const app = new Koa();
|
|
18
|
+
* const router = new Router();
|
|
19
|
+
* const collector = new KoaSDKCollector({
|
|
20
|
+
* info: { title: 'My API', version: '1.0.0', baseUrl: 'https://api.example.com' },
|
|
21
|
+
* output: './packages/api-sdk',
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* collector.domain('/users', { domain: 'users', description: 'User management' });
|
|
25
|
+
*
|
|
26
|
+
* router.get('/users/:id',
|
|
27
|
+
* collector.koaMiddleware('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
28
|
+
* getUserHandler,
|
|
29
|
+
* );
|
|
30
|
+
*
|
|
31
|
+
* app.use(router.routes());
|
|
32
|
+
*
|
|
33
|
+
* // After all routes are registered:
|
|
34
|
+
* if (await collector.tryGenerate()) process.exit(0);
|
|
35
|
+
*
|
|
36
|
+
* app.listen(3000);
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* **Triggering generation:**
|
|
40
|
+
* ```bash
|
|
41
|
+
* TESSERACT_GENERATE=1 node dist/app.js
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
import { SDKCollector } from './collector.js';
|
|
45
|
+
export { SDKCollector } from './collector.js';
|
|
46
|
+
/**
|
|
47
|
+
* `SDKCollector` subclass with a Koa-specific `.koaMiddleware()` helper.
|
|
48
|
+
*
|
|
49
|
+
* `.koaMiddleware()` registers a route with the collector **and** returns a
|
|
50
|
+
* no-op Koa middleware for inline placement with `@koa/router`.
|
|
51
|
+
*/
|
|
52
|
+
export class KoaSDKCollector extends SDKCollector {
|
|
53
|
+
/**
|
|
54
|
+
* Register a route with the collector and return a no-op Koa middleware.
|
|
55
|
+
*
|
|
56
|
+
* ```ts
|
|
57
|
+
* router.get('/users/:id',
|
|
58
|
+
* collector.koaMiddleware('/users/:id', 'GET', { sdk: { methodName: 'getUser' } }),
|
|
59
|
+
* getUserHandler,
|
|
60
|
+
* );
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
koaMiddleware(url, method, config) {
|
|
64
|
+
this.route(url, method, config);
|
|
65
|
+
return (_ctx, next) => next();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=koa.js.map
|
package/dist/koa.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"koa.js","sourceRoot":"","sources":["../src/koa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM9C;;;;;GAKG;AACH,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC/C;;;;;;;;;OASG;IACH,aAAa,CAAC,GAAW,EAAE,MAAc,EAAE,MAA4B;QACrE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;CACF"}
|