@danielfgray/pg-sourcerer 0.2.0 → 0.2.2
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/dist/cli.js +25 -19
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +14 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -1
- package/dist/generate.d.ts +31 -21
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +53 -43
- package/dist/generate.js.map +1 -1
- package/dist/index.d.ts +20 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -13
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +0 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +90 -35
- package/dist/init.js.map +1 -1
- package/dist/ir/extensions/queries.d.ts +264 -0
- package/dist/ir/extensions/queries.d.ts.map +1 -0
- package/dist/ir/extensions/queries.js +153 -0
- package/dist/ir/extensions/queries.js.map +1 -0
- package/dist/ir/extensions/schema-builder.d.ts +61 -0
- package/dist/ir/extensions/schema-builder.d.ts.map +1 -0
- package/dist/ir/extensions/schema-builder.js +5 -0
- package/dist/ir/extensions/schema-builder.js.map +1 -0
- package/dist/lib/conjure.d.ts +101 -0
- package/dist/lib/conjure.d.ts.map +1 -1
- package/dist/lib/conjure.js +204 -26
- package/dist/lib/conjure.js.map +1 -1
- package/dist/lib/hex.d.ts +10 -8
- package/dist/lib/hex.d.ts.map +1 -1
- package/dist/lib/hex.js +18 -15
- package/dist/lib/hex.js.map +1 -1
- package/dist/plugins/arktype.d.ts +27 -14
- package/dist/plugins/arktype.d.ts.map +1 -1
- package/dist/plugins/arktype.js +166 -130
- package/dist/plugins/arktype.js.map +1 -1
- package/dist/plugins/effect.d.ts +53 -0
- package/dist/plugins/effect.d.ts.map +1 -0
- package/dist/plugins/effect.js +1074 -0
- package/dist/plugins/effect.js.map +1 -0
- package/dist/plugins/http-elysia.d.ts +32 -0
- package/dist/plugins/http-elysia.d.ts.map +1 -0
- package/dist/plugins/http-elysia.js +613 -0
- package/dist/plugins/http-elysia.js.map +1 -0
- package/dist/plugins/http-express.d.ts +36 -0
- package/dist/plugins/http-express.d.ts.map +1 -0
- package/dist/plugins/http-express.js +388 -0
- package/dist/plugins/http-express.js.map +1 -0
- package/dist/plugins/http-hono.d.ts +36 -0
- package/dist/plugins/http-hono.d.ts.map +1 -0
- package/dist/plugins/http-hono.js +453 -0
- package/dist/plugins/http-hono.js.map +1 -0
- package/dist/plugins/http-orpc.d.ts +55 -0
- package/dist/plugins/http-orpc.d.ts.map +1 -0
- package/dist/plugins/http-orpc.js +370 -0
- package/dist/plugins/http-orpc.js.map +1 -0
- package/dist/plugins/http-trpc.d.ts +59 -0
- package/dist/plugins/http-trpc.d.ts.map +1 -0
- package/dist/plugins/http-trpc.js +392 -0
- package/dist/plugins/http-trpc.js.map +1 -0
- package/dist/plugins/kysely/queries.d.ts +92 -0
- package/dist/plugins/kysely/queries.d.ts.map +1 -0
- package/dist/plugins/kysely/queries.js +1169 -0
- package/dist/plugins/kysely/queries.js.map +1 -0
- package/dist/plugins/kysely/shared.d.ts +59 -0
- package/dist/plugins/kysely/shared.d.ts.map +1 -0
- package/dist/plugins/kysely/shared.js +247 -0
- package/dist/plugins/kysely/shared.js.map +1 -0
- package/dist/plugins/kysely/types.d.ts +22 -0
- package/dist/plugins/kysely/types.d.ts.map +1 -0
- package/dist/plugins/kysely/types.js +428 -0
- package/dist/plugins/kysely/types.js.map +1 -0
- package/dist/plugins/kysely.d.ts +72 -0
- package/dist/plugins/kysely.d.ts.map +1 -0
- package/dist/plugins/kysely.js +906 -0
- package/dist/plugins/kysely.js.map +1 -0
- package/dist/plugins/sql-queries.d.ts +55 -7
- package/dist/plugins/sql-queries.d.ts.map +1 -1
- package/dist/plugins/sql-queries.js +747 -121
- package/dist/plugins/sql-queries.js.map +1 -1
- package/dist/plugins/types.d.ts +20 -14
- package/dist/plugins/types.d.ts.map +1 -1
- package/dist/plugins/types.js +90 -112
- package/dist/plugins/types.js.map +1 -1
- package/dist/plugins/valibot.d.ts +45 -0
- package/dist/plugins/valibot.d.ts.map +1 -0
- package/dist/plugins/valibot.js +422 -0
- package/dist/plugins/valibot.js.map +1 -0
- package/dist/plugins/zod.d.ts +27 -14
- package/dist/plugins/zod.d.ts.map +1 -1
- package/dist/plugins/zod.js +231 -166
- package/dist/plugins/zod.js.map +1 -1
- package/dist/services/artifact-store.d.ts +11 -1
- package/dist/services/artifact-store.d.ts.map +1 -1
- package/dist/services/artifact-store.js +9 -0
- package/dist/services/artifact-store.js.map +1 -1
- package/dist/services/config-loader.d.ts +4 -0
- package/dist/services/config-loader.d.ts.map +1 -1
- package/dist/services/config-loader.js +1 -1
- package/dist/services/config-loader.js.map +1 -1
- package/dist/services/config.d.ts +57 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +66 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/core-providers.d.ts +15 -0
- package/dist/services/core-providers.d.ts.map +1 -0
- package/dist/services/core-providers.js +23 -0
- package/dist/services/core-providers.js.map +1 -0
- package/dist/services/emissions.d.ts +14 -0
- package/dist/services/emissions.d.ts.map +1 -1
- package/dist/services/emissions.js +86 -47
- package/dist/services/emissions.js.map +1 -1
- package/dist/services/execution.d.ts +35 -0
- package/dist/services/execution.d.ts.map +1 -0
- package/dist/services/execution.js +86 -0
- package/dist/services/execution.js.map +1 -0
- package/dist/services/file-builder.d.ts +4 -0
- package/dist/services/file-builder.d.ts.map +1 -1
- package/dist/services/file-builder.js.map +1 -1
- package/dist/services/inflection.d.ts +2 -2
- package/dist/services/inflection.d.ts.map +1 -1
- package/dist/services/inflection.js +4 -4
- package/dist/services/inflection.js.map +1 -1
- package/dist/services/ir-builder.d.ts.map +1 -1
- package/dist/services/ir-builder.js +10 -3
- package/dist/services/ir-builder.js.map +1 -1
- package/dist/services/pg-types.d.ts +31 -0
- package/dist/services/pg-types.d.ts.map +1 -1
- package/dist/services/pg-types.js +24 -0
- package/dist/services/pg-types.js.map +1 -1
- package/dist/services/plugin-runner.d.ts +27 -37
- package/dist/services/plugin-runner.d.ts.map +1 -1
- package/dist/services/plugin-runner.js +73 -171
- package/dist/services/plugin-runner.js.map +1 -1
- package/dist/services/plugin.d.ts +350 -215
- package/dist/services/plugin.d.ts.map +1 -1
- package/dist/services/plugin.js +182 -130
- package/dist/services/plugin.js.map +1 -1
- package/dist/services/resolution.d.ts +38 -0
- package/dist/services/resolution.d.ts.map +1 -0
- package/dist/services/resolution.js +242 -0
- package/dist/services/resolution.js.map +1 -0
- package/dist/services/service-registry.d.ts +74 -0
- package/dist/services/service-registry.d.ts.map +1 -0
- package/dist/services/service-registry.js +61 -0
- package/dist/services/service-registry.js.map +1 -0
- package/dist/services/symbols.d.ts +59 -0
- package/dist/services/symbols.d.ts.map +1 -1
- package/dist/services/symbols.js +16 -0
- package/dist/services/symbols.js.map +1 -1
- package/dist/testing.d.ts +4 -25
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +2 -23
- package/dist/testing.js.map +1 -1
- package/package.json +1 -1
- package/dist/plugins/effect-model.d.ts +0 -17
- package/dist/plugins/effect-model.d.ts.map +0 -1
- package/dist/plugins/effect-model.js +0 -409
- package/dist/plugins/effect-model.js.map +0 -1
- package/dist/plugins/kysely-queries.d.ts +0 -66
- package/dist/plugins/kysely-queries.d.ts.map +0 -1
- package/dist/plugins/kysely-queries.js +0 -960
- package/dist/plugins/kysely-queries.js.map +0 -1
- package/dist/plugins/kysely-types.d.ts +0 -35
- package/dist/plugins/kysely-types.d.ts.map +0 -1
- package/dist/plugins/kysely-types.js +0 -601
- package/dist/plugins/kysely-types.js.map +0 -1
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Elysia Plugin - Generate Elysia route handlers from query plugins
|
|
3
|
+
*
|
|
4
|
+
* Consumes method symbols from sql-queries or kysely-queries via the symbol registry
|
|
5
|
+
* and generates type-safe Elysia HTTP route handlers.
|
|
6
|
+
*/
|
|
7
|
+
import { Option, pipe, Schema as S } from "effect";
|
|
8
|
+
import { definePlugin } from "../services/plugin.js";
|
|
9
|
+
import { conjure, cast } from "../lib/conjure.js";
|
|
10
|
+
import { inflect } from "../services/inflection.js";
|
|
11
|
+
import { SCHEMA_BUILDER_KIND, } from "../ir/extensions/schema-builder.js";
|
|
12
|
+
import { getTableEntities, getEnumEntities, } from "../ir/semantic-ir.js";
|
|
13
|
+
import { resolveFieldType, isUuidType, isDateType, isEnumType, getPgTypeName, } from "../lib/field-utils.js";
|
|
14
|
+
import { findEnumByPgName, TsType } from "../services/pg-types.js";
|
|
15
|
+
const { b, stmt } = conjure;
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Configuration
|
|
18
|
+
// ============================================================================
|
|
19
|
+
const HttpElysiaConfigSchema = S.Struct({
|
|
20
|
+
/** Output directory for generated route files. Default: "routes" */
|
|
21
|
+
outputDir: S.optionalWith(S.String, { default: () => "routes" }),
|
|
22
|
+
/** Base path for all routes. Default: "/api" */
|
|
23
|
+
basePath: S.optionalWith(S.String, { default: () => "/api" }),
|
|
24
|
+
/** Header content to prepend to each generated file */
|
|
25
|
+
header: S.optional(S.String),
|
|
26
|
+
/**
|
|
27
|
+
* Name of the aggregated router export.
|
|
28
|
+
* Default: "api"
|
|
29
|
+
*/
|
|
30
|
+
aggregatorName: S.optionalWith(S.String, { default: () => "api" }),
|
|
31
|
+
});
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// String Helpers
|
|
34
|
+
// ============================================================================
|
|
35
|
+
/** Convert PascalCase/camelCase to kebab-case */
|
|
36
|
+
const toKebabCase = (str) => str
|
|
37
|
+
.replace(/([a-z])([A-Z])/g, "$1-$2")
|
|
38
|
+
.replace(/_/g, "-")
|
|
39
|
+
.toLowerCase();
|
|
40
|
+
/** Convert entity name to URL path segment (kebab-case plural) */
|
|
41
|
+
const entityToPathSegment = (entityName) => inflect.pluralize(toKebabCase(entityName));
|
|
42
|
+
// ============================================================================
|
|
43
|
+
// Route Generation Helpers
|
|
44
|
+
// ============================================================================
|
|
45
|
+
/** Map query method kind to HTTP method */
|
|
46
|
+
const kindToHttpMethod = (kind) => {
|
|
47
|
+
switch (kind) {
|
|
48
|
+
case "read":
|
|
49
|
+
case "list":
|
|
50
|
+
case "lookup":
|
|
51
|
+
return "get";
|
|
52
|
+
case "create":
|
|
53
|
+
return "post";
|
|
54
|
+
case "update":
|
|
55
|
+
return "put";
|
|
56
|
+
case "delete":
|
|
57
|
+
return "delete";
|
|
58
|
+
case "function":
|
|
59
|
+
return "post";
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
/** Get the route path for a method */
|
|
63
|
+
const getRoutePath = (method) => {
|
|
64
|
+
switch (method.kind) {
|
|
65
|
+
case "read":
|
|
66
|
+
case "update":
|
|
67
|
+
case "delete": {
|
|
68
|
+
const pkParam = method.params.find((p) => p.source === "pk");
|
|
69
|
+
const paramName = pkParam?.name ?? "id";
|
|
70
|
+
return `/:${paramName}`;
|
|
71
|
+
}
|
|
72
|
+
case "list":
|
|
73
|
+
case "create":
|
|
74
|
+
return "/";
|
|
75
|
+
case "lookup": {
|
|
76
|
+
const field = method.lookupField ?? "field";
|
|
77
|
+
const fieldKebab = toKebabCase(field);
|
|
78
|
+
const lookupParam = method.params.find((p) => p.source === "lookup" || p.source === "fk");
|
|
79
|
+
const paramName = lookupParam?.name ?? field;
|
|
80
|
+
return `/by-${fieldKebab}/:${paramName}`;
|
|
81
|
+
}
|
|
82
|
+
case "function": {
|
|
83
|
+
return `/${toKebabCase(method.name)}`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Build a TypeBox type call: t.String(), t.Number(), etc.
|
|
89
|
+
*/
|
|
90
|
+
const buildTypeBoxCall = (methodName, args = []) => b.callExpression(b.memberExpression(b.identifier("t"), b.identifier(methodName)), args.map(cast.toExpr));
|
|
91
|
+
/**
|
|
92
|
+
* Map TypeScript type string to TypeBox method name.
|
|
93
|
+
* For path params (strings from URL), numeric types use t.Numeric() for coercion.
|
|
94
|
+
*/
|
|
95
|
+
const tsTypeToTypeBoxMethod = (tsType, forPathParam) => {
|
|
96
|
+
switch (tsType) {
|
|
97
|
+
case TsType.String:
|
|
98
|
+
return "String";
|
|
99
|
+
case TsType.Number:
|
|
100
|
+
// t.Numeric() coerces string to number (for path/query params)
|
|
101
|
+
return forPathParam ? "Numeric" : "Number";
|
|
102
|
+
case TsType.Boolean:
|
|
103
|
+
return "Boolean";
|
|
104
|
+
case TsType.BigInt:
|
|
105
|
+
// BigInt comes as string from URL params
|
|
106
|
+
return forPathParam ? "String" : "BigInt";
|
|
107
|
+
case TsType.Date:
|
|
108
|
+
// Dates come as strings, need string schema
|
|
109
|
+
return "String";
|
|
110
|
+
case TsType.Buffer:
|
|
111
|
+
case TsType.Unknown:
|
|
112
|
+
default:
|
|
113
|
+
return "Unknown";
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Build TypeBox enum schema: t.Union([t.Literal('a'), t.Literal('b'), ...])
|
|
118
|
+
*/
|
|
119
|
+
const buildTypeBoxEnum = (values) => {
|
|
120
|
+
const literals = values.map((v) => buildTypeBoxCall("Literal", [b.stringLiteral(v)]));
|
|
121
|
+
return buildTypeBoxCall("Union", [b.arrayExpression(literals.map(cast.toExpr))]);
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Build TypeBox array schema: t.Array(<inner>)
|
|
125
|
+
*/
|
|
126
|
+
const buildTypeBoxArray = (inner) => buildTypeBoxCall("Array", [cast.toExpr(inner)]);
|
|
127
|
+
/**
|
|
128
|
+
* Build TypeBox optional schema: t.Optional(<inner>)
|
|
129
|
+
*/
|
|
130
|
+
const buildTypeBoxOptional = (inner) => buildTypeBoxCall("Optional", [cast.toExpr(inner)]);
|
|
131
|
+
/**
|
|
132
|
+
* Build TypeBox union with null: t.Union([<inner>, t.Null()])
|
|
133
|
+
*/
|
|
134
|
+
const buildTypeBoxNullable = (inner) => buildTypeBoxCall("Union", [
|
|
135
|
+
b.arrayExpression([cast.toExpr(inner), cast.toExpr(buildTypeBoxCall("Null"))]),
|
|
136
|
+
]);
|
|
137
|
+
/**
|
|
138
|
+
* Resolve a Field to its TypeBox schema expression.
|
|
139
|
+
*
|
|
140
|
+
* @param field - The IR field to resolve
|
|
141
|
+
* @param ctx - Context with enums and extensions
|
|
142
|
+
* @param forInsert - True if generating for insert shape (fields with defaults are optional)
|
|
143
|
+
*/
|
|
144
|
+
const resolveFieldTypeBoxSchema = (field, ctx, forInsert) => {
|
|
145
|
+
let baseSchema;
|
|
146
|
+
// 1. UUID types - still strings
|
|
147
|
+
if (isUuidType(field)) {
|
|
148
|
+
baseSchema = buildTypeBoxCall("String");
|
|
149
|
+
}
|
|
150
|
+
// 2. Date types - accept string or Date
|
|
151
|
+
else if (isDateType(field)) {
|
|
152
|
+
baseSchema = buildTypeBoxCall("Union", [
|
|
153
|
+
b.arrayExpression([
|
|
154
|
+
cast.toExpr(buildTypeBoxCall("String")),
|
|
155
|
+
cast.toExpr(buildTypeBoxCall("Date")),
|
|
156
|
+
]),
|
|
157
|
+
]);
|
|
158
|
+
}
|
|
159
|
+
// 3. Enum types - union of literals
|
|
160
|
+
else if (isEnumType(field)) {
|
|
161
|
+
const pgTypeName = getPgTypeName(field);
|
|
162
|
+
const enumDef = pgTypeName
|
|
163
|
+
? pipe(findEnumByPgName(ctx.enums, pgTypeName), Option.getOrUndefined)
|
|
164
|
+
: undefined;
|
|
165
|
+
if (enumDef) {
|
|
166
|
+
baseSchema = buildTypeBoxEnum(enumDef.values);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
baseSchema = buildTypeBoxCall("Unknown");
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// 4. Fallback to resolved TypeScript type
|
|
173
|
+
else {
|
|
174
|
+
const resolved = resolveFieldType(field, ctx.enums, ctx.extensions);
|
|
175
|
+
const typeBoxMethod = tsTypeToTypeBoxMethod(resolved.tsType, false);
|
|
176
|
+
baseSchema = buildTypeBoxCall(typeBoxMethod);
|
|
177
|
+
}
|
|
178
|
+
// Wrap with array if needed
|
|
179
|
+
if (field.isArray) {
|
|
180
|
+
baseSchema = buildTypeBoxArray(baseSchema);
|
|
181
|
+
}
|
|
182
|
+
// Apply nullable
|
|
183
|
+
if (field.nullable) {
|
|
184
|
+
baseSchema = buildTypeBoxNullable(baseSchema);
|
|
185
|
+
}
|
|
186
|
+
// Apply optional (for insert shapes: fields with defaults are optional)
|
|
187
|
+
if (forInsert && field.optional) {
|
|
188
|
+
baseSchema = buildTypeBoxOptional(baseSchema);
|
|
189
|
+
}
|
|
190
|
+
return baseSchema;
|
|
191
|
+
};
|
|
192
|
+
/**
|
|
193
|
+
* Build TypeBox object schema for an entity shape.
|
|
194
|
+
*
|
|
195
|
+
* @param entity - The entity to build schema for
|
|
196
|
+
* @param shapeKind - Which shape to use (insert or update)
|
|
197
|
+
* @param ctx - Context with enums and extensions
|
|
198
|
+
*/
|
|
199
|
+
const buildEntityTypeBoxSchema = (entity, shapeKind, ctx) => {
|
|
200
|
+
const shape = shapeKind === "insert" ? entity.shapes.insert : entity.shapes.update;
|
|
201
|
+
if (!shape) {
|
|
202
|
+
// Fallback to row shape if specific shape doesn't exist
|
|
203
|
+
return buildTypeBoxCall("Unknown");
|
|
204
|
+
}
|
|
205
|
+
let objBuilder = conjure.obj();
|
|
206
|
+
for (const field of shape.fields) {
|
|
207
|
+
// For update shapes, ALL fields are optional (patch semantics)
|
|
208
|
+
// For insert shapes, only fields with defaults/nullable are optional (already marked in IR)
|
|
209
|
+
const applyOptional = shapeKind === "update" || (shapeKind === "insert" && field.optional);
|
|
210
|
+
let fieldSchema = resolveFieldTypeBoxSchema(field, ctx, false); // Don't apply optional inside
|
|
211
|
+
if (applyOptional) {
|
|
212
|
+
fieldSchema = buildTypeBoxOptional(fieldSchema);
|
|
213
|
+
}
|
|
214
|
+
objBuilder = objBuilder.prop(field.name, fieldSchema);
|
|
215
|
+
}
|
|
216
|
+
return buildTypeBoxCall("Object", [objBuilder.build()]);
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* Build TypeBox schema for a path/query parameter based on its type string.
|
|
220
|
+
*
|
|
221
|
+
* @param param - The query method param
|
|
222
|
+
*/
|
|
223
|
+
const buildParamTypeBoxSchema = (param) => {
|
|
224
|
+
const typeBoxMethod = tsTypeToTypeBoxMethod(param.type, true);
|
|
225
|
+
return buildTypeBoxCall(typeBoxMethod);
|
|
226
|
+
};
|
|
227
|
+
/**
|
|
228
|
+
* Build the handler function body for a query method.
|
|
229
|
+
* Params/query are destructured in the handler signature, so we reference them directly.
|
|
230
|
+
*/
|
|
231
|
+
const buildHandlerBody = (method) => {
|
|
232
|
+
const callSig = method.callSignature ?? { style: "named" };
|
|
233
|
+
// Build the function call arguments based on callSignature
|
|
234
|
+
const args = [];
|
|
235
|
+
if (callSig.style === "positional") {
|
|
236
|
+
// Positional: fn(a, b, c) - params are already destructured
|
|
237
|
+
for (const param of method.params) {
|
|
238
|
+
if (param.source === "pk" || param.source === "fk" || param.source === "lookup" || param.source === "pagination") {
|
|
239
|
+
args.push(b.identifier(param.name));
|
|
240
|
+
}
|
|
241
|
+
else if (param.source === "body") {
|
|
242
|
+
args.push(b.identifier("body"));
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
// No source specified - get from body (body is not destructured)
|
|
246
|
+
args.push(b.memberExpression(b.identifier("body"), b.identifier(param.name)));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
// Named: fn({ a, b, c }) or fn({ id, data: body })
|
|
252
|
+
const bodyParam = method.params.find((p) => p.source === "body");
|
|
253
|
+
if (bodyParam && callSig.bodyStyle === "spread") {
|
|
254
|
+
// Body fields spread directly: fn(body)
|
|
255
|
+
args.push(b.identifier("body"));
|
|
256
|
+
}
|
|
257
|
+
else if (bodyParam && callSig.bodyStyle === "property") {
|
|
258
|
+
// Body wrapped in property: fn({ id, data: body })
|
|
259
|
+
let objBuilder = conjure.obj();
|
|
260
|
+
for (const param of method.params) {
|
|
261
|
+
if (param.source === "pk" || param.source === "fk" || param.source === "lookup" || param.source === "pagination") {
|
|
262
|
+
// Params are destructured, use shorthand: { id }
|
|
263
|
+
objBuilder = objBuilder.shorthand(param.name);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
objBuilder = objBuilder.prop(bodyParam.name, b.identifier("body"));
|
|
267
|
+
args.push(objBuilder.build());
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
// Build object from path/pagination params using shorthand
|
|
271
|
+
let objBuilder = conjure.obj();
|
|
272
|
+
for (const param of method.params) {
|
|
273
|
+
if (param.source === "pk" || param.source === "fk" || param.source === "lookup" || param.source === "pagination") {
|
|
274
|
+
objBuilder = objBuilder.shorthand(param.name);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (method.params.length > 0) {
|
|
278
|
+
args.push(objBuilder.build());
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Build: const result = await Queries.queryFn(args)
|
|
283
|
+
const queryCall = b.callExpression(b.memberExpression(b.identifier("Queries"), b.identifier(method.name)), args.map(cast.toExpr));
|
|
284
|
+
const awaitExpr = b.awaitExpression(queryCall);
|
|
285
|
+
const resultDecl = stmt.const("result", awaitExpr);
|
|
286
|
+
// Handle 404 for read/lookup that returns null
|
|
287
|
+
if (method.kind === "read" || (method.kind === "lookup" && method.isUniqueLookup)) {
|
|
288
|
+
// if (!result) return status(404, 'Not found');
|
|
289
|
+
const statusCall = b.callExpression(b.identifier("status"), [b.numericLiteral(404), b.stringLiteral("Not found")]);
|
|
290
|
+
const notFoundCheck = b.ifStatement(b.unaryExpression("!", b.identifier("result")), b.returnStatement(statusCall));
|
|
291
|
+
return [resultDecl, notFoundCheck, b.returnStatement(b.identifier("result"))];
|
|
292
|
+
}
|
|
293
|
+
return [resultDecl, b.returnStatement(b.identifier("result"))];
|
|
294
|
+
};
|
|
295
|
+
/**
|
|
296
|
+
* Determine if a method needs body validation and which schema to use.
|
|
297
|
+
* Returns the schema import info or null if no body validation needed.
|
|
298
|
+
*/
|
|
299
|
+
const getBodySchemaImport = (method, entityName) => {
|
|
300
|
+
if (method.kind === "create") {
|
|
301
|
+
return { entity: entityName, shape: "insert", schemaName: `${entityName}Insert` };
|
|
302
|
+
}
|
|
303
|
+
if (method.kind === "update") {
|
|
304
|
+
return { entity: entityName, shape: "update", schemaName: `${entityName}Update` };
|
|
305
|
+
}
|
|
306
|
+
return null;
|
|
307
|
+
};
|
|
308
|
+
/**
|
|
309
|
+
* Build the route options object (params/body/query validation schemas).
|
|
310
|
+
* Returns the options object expression, whether it needs 't' import, body schema info,
|
|
311
|
+
* and any schema builder imports needed.
|
|
312
|
+
*
|
|
313
|
+
* @param hasSchemaProvider - Whether a schema provider is registered for body validation
|
|
314
|
+
* @param entity - The entity for inline TypeBox body schema generation (when no schema provider)
|
|
315
|
+
* @param typeBoxCtx - Context for TypeBox field resolution
|
|
316
|
+
*/
|
|
317
|
+
const buildRouteOptions = (method, entityName, requestSchema, hasSchemaProvider, entity, typeBoxCtx) => {
|
|
318
|
+
let objBuilder = conjure.obj();
|
|
319
|
+
let hasOptions = false;
|
|
320
|
+
let needsElysiaT = false;
|
|
321
|
+
let schemaBuilderImport = null;
|
|
322
|
+
let inlineBodySchema = null;
|
|
323
|
+
// Build params schema for path parameters
|
|
324
|
+
const pathParams = method.params.filter((p) => p.source === "pk" || p.source === "fk" || p.source === "lookup");
|
|
325
|
+
if (pathParams.length > 0) {
|
|
326
|
+
const schemaResult = requestSchema(pathParams);
|
|
327
|
+
if (schemaResult) {
|
|
328
|
+
objBuilder = objBuilder.prop("params", schemaResult.ast);
|
|
329
|
+
schemaBuilderImport = schemaResult.importSpec;
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
// Fallback to TypeBox t.Object({ ... }) with proper type coercion
|
|
333
|
+
needsElysiaT = true;
|
|
334
|
+
let paramsBuilder = conjure.obj();
|
|
335
|
+
for (const param of pathParams) {
|
|
336
|
+
// Use buildParamTypeBoxSchema to get correct type (t.Numeric for numbers)
|
|
337
|
+
paramsBuilder = paramsBuilder.prop(param.name, buildParamTypeBoxSchema(param));
|
|
338
|
+
}
|
|
339
|
+
const paramsSchema = b.callExpression(b.memberExpression(b.identifier("t"), b.identifier("Object")), [paramsBuilder.build()]);
|
|
340
|
+
objBuilder = objBuilder.prop("params", paramsSchema);
|
|
341
|
+
}
|
|
342
|
+
hasOptions = true;
|
|
343
|
+
}
|
|
344
|
+
// Build query schema for pagination params
|
|
345
|
+
const queryParams = method.params.filter((p) => p.source === "pagination");
|
|
346
|
+
if (queryParams.length > 0) {
|
|
347
|
+
const schemaResult = requestSchema(queryParams);
|
|
348
|
+
if (schemaResult) {
|
|
349
|
+
objBuilder = objBuilder.prop("query", schemaResult.ast);
|
|
350
|
+
schemaBuilderImport = schemaResult.importSpec;
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
// Fallback to TypeBox t.Object({ ... })
|
|
354
|
+
needsElysiaT = true;
|
|
355
|
+
let queryBuilder = conjure.obj();
|
|
356
|
+
for (const param of queryParams) {
|
|
357
|
+
const tNumeric = b.callExpression(b.memberExpression(b.identifier("t"), b.identifier("Numeric")), []);
|
|
358
|
+
const tOptional = b.callExpression(b.memberExpression(b.identifier("t"), b.identifier("Optional")), [tNumeric]);
|
|
359
|
+
queryBuilder = queryBuilder.prop(param.name, tOptional);
|
|
360
|
+
}
|
|
361
|
+
const querySchema = b.callExpression(b.memberExpression(b.identifier("t"), b.identifier("Object")), [queryBuilder.build()]);
|
|
362
|
+
objBuilder = objBuilder.prop("query", querySchema);
|
|
363
|
+
}
|
|
364
|
+
hasOptions = true;
|
|
365
|
+
}
|
|
366
|
+
// Body validation
|
|
367
|
+
const bodySchemaInfo = getBodySchemaImport(method, entityName);
|
|
368
|
+
let bodySchema = null;
|
|
369
|
+
if (bodySchemaInfo) {
|
|
370
|
+
if (hasSchemaProvider) {
|
|
371
|
+
// Use imported schema from schema provider (Zod, Valibot, etc.)
|
|
372
|
+
bodySchema = bodySchemaInfo;
|
|
373
|
+
objBuilder = objBuilder.prop("body", b.identifier(bodySchema.schemaName));
|
|
374
|
+
hasOptions = true;
|
|
375
|
+
}
|
|
376
|
+
else if (entity) {
|
|
377
|
+
// Generate inline TypeBox schema from IR
|
|
378
|
+
needsElysiaT = true;
|
|
379
|
+
inlineBodySchema = buildEntityTypeBoxSchema(entity, bodySchemaInfo.shape, typeBoxCtx);
|
|
380
|
+
objBuilder = objBuilder.prop("body", inlineBodySchema);
|
|
381
|
+
hasOptions = true;
|
|
382
|
+
}
|
|
383
|
+
// If neither schema provider nor entity, skip body validation (body will be unknown)
|
|
384
|
+
}
|
|
385
|
+
return {
|
|
386
|
+
options: hasOptions ? objBuilder.build() : null,
|
|
387
|
+
needsElysiaT,
|
|
388
|
+
bodySchema,
|
|
389
|
+
schemaBuilderImport,
|
|
390
|
+
inlineBodySchema,
|
|
391
|
+
};
|
|
392
|
+
};
|
|
393
|
+
/**
|
|
394
|
+
* Build a single route method call: .get('/path', handler, options)
|
|
395
|
+
*/
|
|
396
|
+
const buildRouteCall = (method, entityName, requestSchema, hasSchemaProvider, entity, typeBoxCtx) => {
|
|
397
|
+
const httpMethod = kindToHttpMethod(method.kind);
|
|
398
|
+
const path = getRoutePath(method);
|
|
399
|
+
// Build handler: async ({ params: { id }, body, query: { limit }, status }) => { ... }
|
|
400
|
+
const handlerProps = [];
|
|
401
|
+
// Collect path params (pk, fk, lookup) for destructuring
|
|
402
|
+
const pathParams = method.params.filter((p) => p.source === "pk" || p.source === "fk" || p.source === "lookup");
|
|
403
|
+
if (pathParams.length > 0) {
|
|
404
|
+
// params: { id, slug, ... }
|
|
405
|
+
const paramsPattern = b.objectPattern(pathParams.map((p) => {
|
|
406
|
+
const prop = b.property("init", b.identifier(p.name), b.identifier(p.name));
|
|
407
|
+
prop.shorthand = true;
|
|
408
|
+
return prop;
|
|
409
|
+
}));
|
|
410
|
+
handlerProps.push(b.property("init", b.identifier("params"), paramsPattern));
|
|
411
|
+
}
|
|
412
|
+
// Add body if: explicit body param, create/update method, or function with params (no source = from body)
|
|
413
|
+
const needsBody = method.params.some((p) => p.source === "body") ||
|
|
414
|
+
method.kind === "create" ||
|
|
415
|
+
method.kind === "update" ||
|
|
416
|
+
(method.kind === "function" && method.params.some((p) => !p.source));
|
|
417
|
+
if (needsBody) {
|
|
418
|
+
const prop = b.property("init", b.identifier("body"), b.identifier("body"));
|
|
419
|
+
prop.shorthand = true;
|
|
420
|
+
handlerProps.push(prop);
|
|
421
|
+
}
|
|
422
|
+
// Collect pagination params for destructuring
|
|
423
|
+
const paginationParams = method.params.filter((p) => p.source === "pagination");
|
|
424
|
+
if (paginationParams.length > 0) {
|
|
425
|
+
// query: { limit, offset, ... }
|
|
426
|
+
const queryPattern = b.objectPattern(paginationParams.map((p) => {
|
|
427
|
+
const prop = b.property("init", b.identifier(p.name), b.identifier(p.name));
|
|
428
|
+
prop.shorthand = true;
|
|
429
|
+
return prop;
|
|
430
|
+
}));
|
|
431
|
+
handlerProps.push(b.property("init", b.identifier("query"), queryPattern));
|
|
432
|
+
}
|
|
433
|
+
if (method.kind === "read" || (method.kind === "lookup" && method.isUniqueLookup)) {
|
|
434
|
+
const prop = b.property("init", b.identifier("status"), b.identifier("status"));
|
|
435
|
+
prop.shorthand = true;
|
|
436
|
+
handlerProps.push(prop);
|
|
437
|
+
}
|
|
438
|
+
const handlerParamPattern = b.objectPattern(handlerProps);
|
|
439
|
+
const handlerBody = buildHandlerBody(method);
|
|
440
|
+
const handler = b.arrowFunctionExpression([handlerParamPattern], b.blockStatement(handlerBody.map(cast.toStmt)));
|
|
441
|
+
handler.async = true;
|
|
442
|
+
const { options, needsElysiaT, bodySchema, schemaBuilderImport } = buildRouteOptions(method, entityName, requestSchema, hasSchemaProvider, entity, typeBoxCtx);
|
|
443
|
+
return { httpMethod, path, handler, options, needsElysiaT, bodySchema, schemaBuilderImport };
|
|
444
|
+
};
|
|
445
|
+
// ============================================================================
|
|
446
|
+
// Plugin Definition
|
|
447
|
+
// ============================================================================
|
|
448
|
+
export function httpElysia(config) {
|
|
449
|
+
const parsed = S.decodeUnknownSync(HttpElysiaConfigSchema)(config);
|
|
450
|
+
return definePlugin({
|
|
451
|
+
name: "http-elysia",
|
|
452
|
+
kind: "http-routes",
|
|
453
|
+
singleton: true,
|
|
454
|
+
canProvide: () => true,
|
|
455
|
+
// Declare dependencies: queries required, schemas optional (falls back to TypeBox)
|
|
456
|
+
requires: () => [
|
|
457
|
+
{ kind: "queries", params: {} },
|
|
458
|
+
],
|
|
459
|
+
optionalRequires: () => [
|
|
460
|
+
{ kind: "schemas", params: {} },
|
|
461
|
+
],
|
|
462
|
+
provide: (_params, _deps, ctx) => {
|
|
463
|
+
const { outputDir, basePath, header, aggregatorName } = parsed;
|
|
464
|
+
// Get all entities with registered query methods
|
|
465
|
+
const entityNames = ctx.symbols.getEntitiesWithMethods();
|
|
466
|
+
if (entityNames.length === 0) {
|
|
467
|
+
// No query methods registered - nothing to generate
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
// Track generated routes for aggregator index
|
|
471
|
+
const generatedRoutes = [];
|
|
472
|
+
// Build TypeBox context for inline schema generation (when no schema plugin)
|
|
473
|
+
const enumEntities = getEnumEntities(ctx.ir);
|
|
474
|
+
const tableEntities = getTableEntities(ctx.ir);
|
|
475
|
+
const typeBoxCtx = {
|
|
476
|
+
enums: enumEntities,
|
|
477
|
+
extensions: ctx.ir.extensions,
|
|
478
|
+
};
|
|
479
|
+
// Generate routes for each entity
|
|
480
|
+
for (const entityName of entityNames) {
|
|
481
|
+
const entityMethods = ctx.symbols.getEntityMethods(entityName);
|
|
482
|
+
if (!entityMethods || entityMethods.methods.length === 0)
|
|
483
|
+
continue;
|
|
484
|
+
// Find the entity in the IR for inline TypeBox body schema generation
|
|
485
|
+
const entity = tableEntities.find((e) => e.name === entityName);
|
|
486
|
+
const pathSegment = entityToPathSegment(entityName);
|
|
487
|
+
const filePath = `${outputDir}/${inflect.uncapitalize(entityName)}.ts`;
|
|
488
|
+
const routesVarName = `${inflect.uncapitalize(entityName)}Routes`;
|
|
489
|
+
const file = ctx.file(filePath);
|
|
490
|
+
if (header) {
|
|
491
|
+
file.header(header);
|
|
492
|
+
}
|
|
493
|
+
// Import Elysia
|
|
494
|
+
file.import({ kind: "package", names: ["Elysia"], from: "elysia" });
|
|
495
|
+
// Import queries as namespace
|
|
496
|
+
const queriesImportPath = `../${entityMethods.importPath.replace(/\.ts$/, ".js")}`;
|
|
497
|
+
file.import({
|
|
498
|
+
kind: "relative",
|
|
499
|
+
namespace: "Queries",
|
|
500
|
+
from: queriesImportPath,
|
|
501
|
+
});
|
|
502
|
+
// Build the Elysia route chain
|
|
503
|
+
// new Elysia({ prefix: '/api/users' }).get(...).post(...)
|
|
504
|
+
const prefixPath = `${basePath}/${pathSegment}`;
|
|
505
|
+
const elysiaConfig = conjure.obj().prop("prefix", b.stringLiteral(prefixPath)).build();
|
|
506
|
+
let chainExpr = b.newExpression(b.identifier("Elysia"), [elysiaConfig]);
|
|
507
|
+
let fileNeedsElysiaT = false;
|
|
508
|
+
const bodySchemaImports = [];
|
|
509
|
+
let schemaLibraryImport = null;
|
|
510
|
+
// Create a schema builder function that requests from the service registry
|
|
511
|
+
const requestSchema = (params) => {
|
|
512
|
+
if (params.length === 0)
|
|
513
|
+
return undefined;
|
|
514
|
+
try {
|
|
515
|
+
const request = { variant: "params", params };
|
|
516
|
+
return ctx.request(SCHEMA_BUILDER_KIND, request);
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
// No schema-builder registered, will fall back to TypeBox
|
|
520
|
+
return undefined;
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
// Check if a schema provider is available for body validation
|
|
524
|
+
// We probe by checking if the schema-builder service exists
|
|
525
|
+
let hasSchemaProvider = false;
|
|
526
|
+
try {
|
|
527
|
+
// Try to request an entity schema - if it succeeds, we have a provider
|
|
528
|
+
ctx.request(SCHEMA_BUILDER_KIND, { variant: "entity", entity: entityName, shape: "insert" });
|
|
529
|
+
hasSchemaProvider = true;
|
|
530
|
+
}
|
|
531
|
+
catch {
|
|
532
|
+
// No schema provider registered
|
|
533
|
+
}
|
|
534
|
+
for (const method of entityMethods.methods) {
|
|
535
|
+
const { httpMethod, path, handler, options, needsElysiaT, bodySchema, schemaBuilderImport } = buildRouteCall(method, entityName, requestSchema, hasSchemaProvider, entity, typeBoxCtx);
|
|
536
|
+
if (needsElysiaT)
|
|
537
|
+
fileNeedsElysiaT = true;
|
|
538
|
+
if (bodySchema)
|
|
539
|
+
bodySchemaImports.push(bodySchema);
|
|
540
|
+
if (schemaBuilderImport)
|
|
541
|
+
schemaLibraryImport = schemaBuilderImport;
|
|
542
|
+
const callArgs = [b.stringLiteral(path), handler];
|
|
543
|
+
if (options) {
|
|
544
|
+
callArgs.push(options);
|
|
545
|
+
}
|
|
546
|
+
chainExpr = b.callExpression(b.memberExpression(cast.toExpr(chainExpr), b.identifier(httpMethod)), callArgs.map(cast.toExpr));
|
|
547
|
+
}
|
|
548
|
+
if (fileNeedsElysiaT) {
|
|
549
|
+
file.import({ kind: "package", names: ["t"], from: "elysia" });
|
|
550
|
+
}
|
|
551
|
+
// Import schema library (e.g., Zod) if using schema-builder for params
|
|
552
|
+
if (schemaLibraryImport) {
|
|
553
|
+
if (schemaLibraryImport.names) {
|
|
554
|
+
file.import({
|
|
555
|
+
kind: "package",
|
|
556
|
+
names: [...schemaLibraryImport.names],
|
|
557
|
+
from: schemaLibraryImport.from,
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
else if (schemaLibraryImport.namespace) {
|
|
561
|
+
file.import({
|
|
562
|
+
kind: "package",
|
|
563
|
+
namespace: schemaLibraryImport.namespace,
|
|
564
|
+
from: schemaLibraryImport.from,
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
// Import body schemas from schema plugins (Zod, Valibot, etc.)
|
|
569
|
+
// These are resolved via the symbol registry's "schemas" capability
|
|
570
|
+
for (const schemaImport of bodySchemaImports) {
|
|
571
|
+
file.import({
|
|
572
|
+
kind: "symbol",
|
|
573
|
+
ref: {
|
|
574
|
+
capability: "schemas",
|
|
575
|
+
entity: schemaImport.entity,
|
|
576
|
+
shape: schemaImport.shape,
|
|
577
|
+
},
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
const exportStmt = conjure.export.const(routesVarName, chainExpr);
|
|
581
|
+
file.ast(conjure.program(exportStmt)).emit();
|
|
582
|
+
generatedRoutes.push({
|
|
583
|
+
fileName: `${inflect.uncapitalize(entityName)}.js`,
|
|
584
|
+
exportName: routesVarName,
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
// Generate aggregator index.ts
|
|
588
|
+
if (generatedRoutes.length > 0) {
|
|
589
|
+
const indexPath = `${outputDir}/index.ts`;
|
|
590
|
+
const indexFile = ctx.file(indexPath);
|
|
591
|
+
if (header) {
|
|
592
|
+
indexFile.header(header);
|
|
593
|
+
}
|
|
594
|
+
indexFile.import({ kind: "package", names: ["Elysia"], from: "elysia" });
|
|
595
|
+
for (const route of generatedRoutes) {
|
|
596
|
+
indexFile.import({
|
|
597
|
+
kind: "relative",
|
|
598
|
+
names: [route.exportName],
|
|
599
|
+
from: `./${route.fileName}`,
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
// Build: new Elysia().use(userRoutes).use(postRoutes)...
|
|
603
|
+
let chainExpr = b.newExpression(b.identifier("Elysia"), []);
|
|
604
|
+
for (const route of generatedRoutes) {
|
|
605
|
+
chainExpr = b.callExpression(b.memberExpression(cast.toExpr(chainExpr), b.identifier("use")), [b.identifier(route.exportName)]);
|
|
606
|
+
}
|
|
607
|
+
const exportStmt = conjure.export.const(aggregatorName, chainExpr);
|
|
608
|
+
indexFile.ast(conjure.program(exportStmt)).emit();
|
|
609
|
+
}
|
|
610
|
+
},
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
//# sourceMappingURL=http-elysia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-elysia.js","sourceRoot":"","sources":["../../src/plugins/http-elysia.ts"],"names":[],"mappings":"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"}
|