@danielfgray/pg-sourcerer 0.2.1 → 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 +3 -4
- 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 +5 -9
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +27 -29
- package/dist/generate.js.map +1 -1
- package/dist/index.d.ts +19 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -13
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +39 -9
- 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 +66 -0
- package/dist/lib/conjure.d.ts.map +1 -1
- package/dist/lib/conjure.js +127 -29
- package/dist/lib/conjure.js.map +1 -1
- package/dist/lib/hex.d.ts +10 -3
- package/dist/lib/hex.d.ts.map +1 -1
- package/dist/lib/hex.js +18 -8
- 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 -11
- package/dist/plugins/sql-queries.d.ts.map +1 -1
- package/dist/plugins/sql-queries.js +467 -218
- 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/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 +349 -217
- 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 -951
- 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,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Express Plugin - Generate Express 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 Express HTTP route handlers.
|
|
6
|
+
*
|
|
7
|
+
* Supports validation via schema plugins (zod, valibot, arktype):
|
|
8
|
+
* - Body validation: imports entity schemas (UserInsert, UserUpdate) and uses .parse(req.body)
|
|
9
|
+
* - Path/query param validation: uses schema builder for type coercion
|
|
10
|
+
*/
|
|
11
|
+
import { Schema as S } from "effect";
|
|
12
|
+
import { definePlugin } from "../services/plugin.js";
|
|
13
|
+
declare const HttpExpressConfigSchema: S.Struct<{
|
|
14
|
+
/** Output directory for generated route files. Default: "routes" */
|
|
15
|
+
outputDir: S.optionalWith<typeof S.String, {
|
|
16
|
+
default: () => string;
|
|
17
|
+
}>;
|
|
18
|
+
/** Base path for all routes. Default: "/api" */
|
|
19
|
+
basePath: S.optionalWith<typeof S.String, {
|
|
20
|
+
default: () => string;
|
|
21
|
+
}>;
|
|
22
|
+
/** Header content to prepend to each generated file */
|
|
23
|
+
header: S.optional<typeof S.String>;
|
|
24
|
+
/**
|
|
25
|
+
* Name of the aggregated router export.
|
|
26
|
+
* Default: "api"
|
|
27
|
+
*/
|
|
28
|
+
aggregatorName: S.optionalWith<typeof S.String, {
|
|
29
|
+
default: () => string;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
32
|
+
/** Input config type (with optional fields) */
|
|
33
|
+
export type HttpExpressConfig = S.Schema.Encoded<typeof HttpExpressConfigSchema>;
|
|
34
|
+
export declare function httpExpress(config?: HttpExpressConfig): ReturnType<typeof definePlugin>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=http-express.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-express.d.ts","sourceRoot":"","sources":["../../src/plugins/http-express.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,YAAY,EAAsB,MAAM,uBAAuB,CAAC;AAyCzE,QAAA,MAAM,uBAAuB;IAC3B,oEAAoE;;;;IAGpE,gDAAgD;;;;IAGhD,uDAAuD;;IAGvD;;;OAGG;;;;EAEH,CAAC;AAEH,+CAA+C;AAC/C,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAuXjF,wBAAgB,WAAW,CAAC,MAAM,GAAE,iBAAsB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CA6I3F"}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Express Plugin - Generate Express 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 Express HTTP route handlers.
|
|
6
|
+
*
|
|
7
|
+
* Supports validation via schema plugins (zod, valibot, arktype):
|
|
8
|
+
* - Body validation: imports entity schemas (UserInsert, UserUpdate) and uses .parse(req.body)
|
|
9
|
+
* - Path/query param validation: uses schema builder for type coercion
|
|
10
|
+
*/
|
|
11
|
+
import { Schema as S } from "effect";
|
|
12
|
+
import { definePlugin } from "../services/plugin.js";
|
|
13
|
+
import { conjure, cast } from "../lib/conjure.js";
|
|
14
|
+
import { inflect } from "../services/inflection.js";
|
|
15
|
+
const { b, stmt } = conjure;
|
|
16
|
+
const getBodySchemaImport = (method, entityName) => {
|
|
17
|
+
if (method.kind === "create") {
|
|
18
|
+
return { entity: entityName, shape: "insert", schemaName: `${entityName}Insert` };
|
|
19
|
+
}
|
|
20
|
+
if (method.kind === "update") {
|
|
21
|
+
return { entity: entityName, shape: "update", schemaName: `${entityName}Update` };
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
};
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Configuration
|
|
27
|
+
// ============================================================================
|
|
28
|
+
const HttpExpressConfigSchema = S.Struct({
|
|
29
|
+
/** Output directory for generated route files. Default: "routes" */
|
|
30
|
+
outputDir: S.optionalWith(S.String, { default: () => "routes" }),
|
|
31
|
+
/** Base path for all routes. Default: "/api" */
|
|
32
|
+
basePath: S.optionalWith(S.String, { default: () => "/api" }),
|
|
33
|
+
/** Header content to prepend to each generated file */
|
|
34
|
+
header: S.optional(S.String),
|
|
35
|
+
/**
|
|
36
|
+
* Name of the aggregated router export.
|
|
37
|
+
* Default: "api"
|
|
38
|
+
*/
|
|
39
|
+
aggregatorName: S.optionalWith(S.String, { default: () => "api" }),
|
|
40
|
+
});
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// String Helpers
|
|
43
|
+
// ============================================================================
|
|
44
|
+
/** Convert PascalCase/camelCase to kebab-case */
|
|
45
|
+
const toKebabCase = (str) => str
|
|
46
|
+
.replace(/([a-z])([A-Z])/g, "$1-$2")
|
|
47
|
+
.replace(/_/g, "-")
|
|
48
|
+
.toLowerCase();
|
|
49
|
+
/** Convert entity name to URL path segment (kebab-case plural) */
|
|
50
|
+
const entityToPathSegment = (entityName) => inflect.pluralize(toKebabCase(entityName));
|
|
51
|
+
// ============================================================================
|
|
52
|
+
// Route Generation Helpers
|
|
53
|
+
// ============================================================================
|
|
54
|
+
/** Map query method kind to HTTP method */
|
|
55
|
+
const kindToHttpMethod = (kind) => {
|
|
56
|
+
switch (kind) {
|
|
57
|
+
case "read":
|
|
58
|
+
case "list":
|
|
59
|
+
case "lookup":
|
|
60
|
+
return "get";
|
|
61
|
+
case "create":
|
|
62
|
+
return "post";
|
|
63
|
+
case "update":
|
|
64
|
+
return "put";
|
|
65
|
+
case "delete":
|
|
66
|
+
return "delete";
|
|
67
|
+
case "function":
|
|
68
|
+
return "post";
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
/** Get the route path for a method */
|
|
72
|
+
const getRoutePath = (method) => {
|
|
73
|
+
switch (method.kind) {
|
|
74
|
+
case "read":
|
|
75
|
+
case "update":
|
|
76
|
+
case "delete": {
|
|
77
|
+
const pkParam = method.params.find(p => p.source === "pk");
|
|
78
|
+
const paramName = pkParam?.name ?? "id";
|
|
79
|
+
return `/:${paramName}`;
|
|
80
|
+
}
|
|
81
|
+
case "list":
|
|
82
|
+
case "create":
|
|
83
|
+
return "/";
|
|
84
|
+
case "lookup": {
|
|
85
|
+
const field = method.lookupField ?? "field";
|
|
86
|
+
const fieldKebab = toKebabCase(field);
|
|
87
|
+
const lookupParam = method.params.find(p => p.source === "lookup" || p.source === "fk");
|
|
88
|
+
const paramName = lookupParam?.name ?? field;
|
|
89
|
+
return `/by-${fieldKebab}/:${paramName}`;
|
|
90
|
+
}
|
|
91
|
+
case "function": {
|
|
92
|
+
return `/${toKebabCase(method.name)}`;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Build the handler function body for a query method.
|
|
98
|
+
* In Express, we use req.params, req.query, req.body, res.json()
|
|
99
|
+
*
|
|
100
|
+
* When validation is enabled, uses schema.parse() for body and converts path params.
|
|
101
|
+
*/
|
|
102
|
+
const buildHandlerBody = (method, entityName, options) => {
|
|
103
|
+
const statements = [];
|
|
104
|
+
const callSig = method.callSignature ?? { style: "named" };
|
|
105
|
+
const { hasSchemaProvider, bodySchema, pathParams } = options;
|
|
106
|
+
// Extract path params with validation if schema provider available
|
|
107
|
+
if (pathParams.length > 0 && hasSchemaProvider) {
|
|
108
|
+
const firstParam = pathParams[0];
|
|
109
|
+
// Use schema builder to validate and coerce path params
|
|
110
|
+
// const _params = UserIdParams["~standard"].validate({ id: req.params.id });
|
|
111
|
+
// if (_params.issues) return res.status(400).json({ error: _params.issues });
|
|
112
|
+
// const { id } = _params.value;
|
|
113
|
+
const paramsObject = b.objectExpression([
|
|
114
|
+
b.property("init", b.stringLiteral(firstParam.name), b.memberExpression(b.memberExpression(b.identifier("req"), b.identifier("params")), b.identifier(firstParam.name))),
|
|
115
|
+
]);
|
|
116
|
+
const paramsSchemaName = `${entityName}${firstParam.name.charAt(0).toUpperCase() + firstParam.name.slice(1)}Params`;
|
|
117
|
+
const standardMember = b.memberExpression(b.identifier(paramsSchemaName), b.stringLiteral("~standard"), true);
|
|
118
|
+
const validateCall = b.memberExpression(cast.toExpr(standardMember), b.identifier("validate"));
|
|
119
|
+
const validationExpr = b.callExpression(validateCall, [paramsObject]);
|
|
120
|
+
const validationVar = b.variableDeclarator(b.identifier("_params"), b.awaitExpression(validationExpr));
|
|
121
|
+
statements.push(b.variableDeclaration("const", [validationVar]));
|
|
122
|
+
// if (_params.issues) return res.status(400).json({ error: _params.issues });
|
|
123
|
+
const errorResponse = b.callExpression(b.memberExpression(b.callExpression(b.memberExpression(b.identifier("res"), b.identifier("status")), [b.numericLiteral(400)]), b.identifier("json")), [b.objectExpression([b.property("init", b.stringLiteral("error"), b.memberExpression(b.identifier("_params"), b.identifier("issues")))])]);
|
|
124
|
+
const ifStatement = b.ifStatement(b.memberExpression(b.identifier("_params"), b.identifier("issues")), b.blockStatement([b.returnStatement(errorResponse)]));
|
|
125
|
+
statements.push(ifStatement);
|
|
126
|
+
// Destructure validated params: const { id } = _params.value;
|
|
127
|
+
const pattern = b.objectPattern(pathParams.map(p => {
|
|
128
|
+
const prop = b.property("init", b.identifier(p.name), b.identifier(p.name));
|
|
129
|
+
prop.shorthand = true;
|
|
130
|
+
return prop;
|
|
131
|
+
}));
|
|
132
|
+
statements.push(b.variableDeclaration("const", [
|
|
133
|
+
b.variableDeclarator(pattern, b.memberExpression(b.identifier("_params"), b.identifier("value"))),
|
|
134
|
+
]));
|
|
135
|
+
}
|
|
136
|
+
else if (pathParams.length > 0) {
|
|
137
|
+
// No schema provider - just extract without validation
|
|
138
|
+
const pattern = b.objectPattern(pathParams.map(p => {
|
|
139
|
+
const prop = b.property("init", b.identifier(p.name), b.identifier(p.name));
|
|
140
|
+
prop.shorthand = true;
|
|
141
|
+
return prop;
|
|
142
|
+
}));
|
|
143
|
+
statements.push(b.variableDeclaration("const", [
|
|
144
|
+
b.variableDeclarator(pattern, b.memberExpression(b.identifier("req"), b.identifier("params"))),
|
|
145
|
+
]));
|
|
146
|
+
}
|
|
147
|
+
// Extract query params: const { limit, offset } = req.query
|
|
148
|
+
const queryParams = method.params.filter(p => p.source === "pagination");
|
|
149
|
+
if (queryParams.length > 0) {
|
|
150
|
+
const pattern = b.objectPattern(queryParams.map(p => {
|
|
151
|
+
const prop = b.property("init", b.identifier(p.name), b.identifier(p.name));
|
|
152
|
+
prop.shorthand = true;
|
|
153
|
+
return prop;
|
|
154
|
+
}));
|
|
155
|
+
statements.push(b.variableDeclaration("const", [
|
|
156
|
+
b.variableDeclarator(pattern, b.memberExpression(b.identifier("req"), b.identifier("query"))),
|
|
157
|
+
]));
|
|
158
|
+
}
|
|
159
|
+
// Extract body with optional validation
|
|
160
|
+
const needsBody = method.params.some(p => p.source === "body") ||
|
|
161
|
+
method.kind === "create" ||
|
|
162
|
+
method.kind === "update" ||
|
|
163
|
+
(method.kind === "function" && method.params.some(p => !p.source));
|
|
164
|
+
if (needsBody) {
|
|
165
|
+
if (bodySchema && hasSchemaProvider) {
|
|
166
|
+
// Validation handled below using Standard Schema interface
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// const body = req.body
|
|
170
|
+
statements.push(stmt.const("body", b.memberExpression(b.identifier("req"), b.identifier("body"))));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Validate body using Standard Schema interface (works with zod, valibot, arktype)
|
|
174
|
+
if (bodySchema && hasSchemaProvider) {
|
|
175
|
+
// const validation = UserInsert["~standard"].validate(req.body);
|
|
176
|
+
// if (validation.issues) throw new Error("Validation failed");
|
|
177
|
+
// const body = validation.value;
|
|
178
|
+
const standardMember = b.memberExpression(b.identifier(bodySchema.schemaName), b.stringLiteral("~standard"), true);
|
|
179
|
+
const validateCall = b.memberExpression(cast.toExpr(standardMember), b.identifier("validate"));
|
|
180
|
+
const validationExpr = b.callExpression(validateCall, [
|
|
181
|
+
b.memberExpression(b.identifier("req"), b.identifier("body")),
|
|
182
|
+
]);
|
|
183
|
+
const validationVar = b.variableDeclarator(b.identifier("validation"), b.awaitExpression(validationExpr));
|
|
184
|
+
statements.push(b.variableDeclaration("const", [validationVar]));
|
|
185
|
+
// if (validation.issues) return res.status(400).json({ error: validation.issues });
|
|
186
|
+
const errorResponse = b.callExpression(b.memberExpression(b.callExpression(b.memberExpression(b.identifier("res"), b.identifier("status")), [b.numericLiteral(400)]), b.identifier("json")), [b.objectExpression([b.property("init", b.stringLiteral("error"), b.memberExpression(b.identifier("validation"), b.identifier("issues")))])]);
|
|
187
|
+
const ifStatement = b.ifStatement(b.memberExpression(b.identifier("validation"), b.identifier("issues")), b.blockStatement([b.returnStatement(errorResponse)]));
|
|
188
|
+
statements.push(ifStatement);
|
|
189
|
+
// const body = validation.value;
|
|
190
|
+
statements.push(stmt.const("body", b.memberExpression(b.identifier("validation"), b.identifier("value"))));
|
|
191
|
+
}
|
|
192
|
+
// Build the function call arguments
|
|
193
|
+
const args = [];
|
|
194
|
+
if (callSig.style === "positional") {
|
|
195
|
+
for (const param of method.params) {
|
|
196
|
+
if (param.source === "pk" ||
|
|
197
|
+
param.source === "fk" ||
|
|
198
|
+
param.source === "lookup" ||
|
|
199
|
+
param.source === "pagination") {
|
|
200
|
+
args.push(b.identifier(param.name));
|
|
201
|
+
}
|
|
202
|
+
else if (param.source === "body") {
|
|
203
|
+
args.push(b.identifier("body"));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
args.push(b.memberExpression(b.identifier("body"), b.identifier(param.name)));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
const bodyParam = method.params.find(p => p.source === "body");
|
|
212
|
+
if (bodyParam && callSig.bodyStyle === "spread") {
|
|
213
|
+
args.push(b.identifier("body"));
|
|
214
|
+
}
|
|
215
|
+
else if (bodyParam && callSig.bodyStyle === "property") {
|
|
216
|
+
let objBuilder = conjure.obj();
|
|
217
|
+
for (const param of method.params) {
|
|
218
|
+
if (param.source === "pk" ||
|
|
219
|
+
param.source === "fk" ||
|
|
220
|
+
param.source === "lookup" ||
|
|
221
|
+
param.source === "pagination") {
|
|
222
|
+
objBuilder = objBuilder.shorthand(param.name);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
objBuilder = objBuilder.prop(bodyParam.name, b.identifier("body"));
|
|
226
|
+
args.push(objBuilder.build());
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
let objBuilder = conjure.obj();
|
|
230
|
+
for (const param of method.params) {
|
|
231
|
+
if (param.source === "pk" ||
|
|
232
|
+
param.source === "fk" ||
|
|
233
|
+
param.source === "lookup" ||
|
|
234
|
+
param.source === "pagination") {
|
|
235
|
+
objBuilder = objBuilder.shorthand(param.name);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (method.params.length > 0) {
|
|
239
|
+
args.push(objBuilder.build());
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Build: const result = await Queries.queryFn(args)
|
|
244
|
+
const queryCall = b.callExpression(b.memberExpression(b.identifier("Queries"), b.identifier(method.name)), args.map(cast.toExpr));
|
|
245
|
+
statements.push(stmt.const("result", b.awaitExpression(queryCall)));
|
|
246
|
+
// Handle 404 for read/lookup that returns null
|
|
247
|
+
if (method.kind === "read" || (method.kind === "lookup" && method.isUniqueLookup)) {
|
|
248
|
+
// if (!result) return res.status(404).json({ error: 'Not found' })
|
|
249
|
+
const notFoundResponse = b.callExpression(b.memberExpression(b.callExpression(b.memberExpression(b.identifier("res"), b.identifier("status")), [
|
|
250
|
+
b.numericLiteral(404),
|
|
251
|
+
]), b.identifier("json")), [conjure.obj().prop("error", b.stringLiteral("Not found")).build()]);
|
|
252
|
+
statements.push(b.ifStatement(b.unaryExpression("!", b.identifier("result")), b.returnStatement(notFoundResponse)));
|
|
253
|
+
}
|
|
254
|
+
// return res.json(result) or res.status(201).json(result) for create
|
|
255
|
+
let responseExpr;
|
|
256
|
+
if (method.kind === "create") {
|
|
257
|
+
// res.status(201).json(result)
|
|
258
|
+
responseExpr = b.callExpression(b.memberExpression(b.callExpression(b.memberExpression(b.identifier("res"), b.identifier("status")), [
|
|
259
|
+
b.numericLiteral(201),
|
|
260
|
+
]), b.identifier("json")), [b.identifier("result")]);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// res.json(result)
|
|
264
|
+
responseExpr = b.callExpression(b.memberExpression(b.identifier("res"), b.identifier("json")), [
|
|
265
|
+
b.identifier("result"),
|
|
266
|
+
]);
|
|
267
|
+
}
|
|
268
|
+
statements.push(b.returnStatement(cast.toExpr(responseExpr)));
|
|
269
|
+
return statements;
|
|
270
|
+
};
|
|
271
|
+
/**
|
|
272
|
+
* Build a single route method call: router.get('/path', handler)
|
|
273
|
+
*/
|
|
274
|
+
const buildRouteCall = (method, entityName, options) => {
|
|
275
|
+
const httpMethod = kindToHttpMethod(method.kind);
|
|
276
|
+
const path = getRoutePath(method);
|
|
277
|
+
// Build handler: async (req, res) => { ... }
|
|
278
|
+
const handlerBody = buildHandlerBody(method, entityName, options);
|
|
279
|
+
const handler = b.arrowFunctionExpression([b.identifier("req"), b.identifier("res")], b.blockStatement(handlerBody.map(cast.toStmt)));
|
|
280
|
+
handler.async = true;
|
|
281
|
+
return { httpMethod, path, handler };
|
|
282
|
+
};
|
|
283
|
+
// ============================================================================
|
|
284
|
+
// Plugin Definition
|
|
285
|
+
// ============================================================================
|
|
286
|
+
export function httpExpress(config = {}) {
|
|
287
|
+
const parsed = S.decodeUnknownSync(HttpExpressConfigSchema)(config);
|
|
288
|
+
return definePlugin({
|
|
289
|
+
name: "http-express",
|
|
290
|
+
kind: "http-routes",
|
|
291
|
+
singleton: true,
|
|
292
|
+
canProvide: () => true,
|
|
293
|
+
requires: () => [{ kind: "queries", params: {} }],
|
|
294
|
+
optionalRequires: () => [{ kind: "schemas", params: {} }],
|
|
295
|
+
provide: (_params, _deps, ctx) => {
|
|
296
|
+
const { outputDir, basePath, header, aggregatorName } = parsed;
|
|
297
|
+
const entityNames = ctx.symbols.getEntitiesWithMethods();
|
|
298
|
+
if (entityNames.length === 0) {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
const generatedRoutes = [];
|
|
302
|
+
for (const entityName of entityNames) {
|
|
303
|
+
const entityMethods = ctx.symbols.getEntityMethods(entityName);
|
|
304
|
+
if (!entityMethods || entityMethods.methods.length === 0)
|
|
305
|
+
continue;
|
|
306
|
+
const pathSegment = entityToPathSegment(entityName);
|
|
307
|
+
const filePath = `${outputDir}/${inflect.uncapitalize(entityName)}.ts`;
|
|
308
|
+
const routesVarName = `${inflect.uncapitalize(entityName)}Routes`;
|
|
309
|
+
const file = ctx.file(filePath);
|
|
310
|
+
if (header) {
|
|
311
|
+
file.header(header);
|
|
312
|
+
}
|
|
313
|
+
// Import Router from express
|
|
314
|
+
file.import({ kind: "package", names: ["Router"], from: "express" });
|
|
315
|
+
// Import queries as namespace
|
|
316
|
+
const queriesImportPath = `../${entityMethods.importPath.replace(/\.ts$/, ".js")}`;
|
|
317
|
+
file.import({
|
|
318
|
+
kind: "relative",
|
|
319
|
+
namespace: "Queries",
|
|
320
|
+
from: queriesImportPath,
|
|
321
|
+
});
|
|
322
|
+
// Check if a schema provider is available for body validation
|
|
323
|
+
const hasSchemaProvider = ctx.symbols.resolve({
|
|
324
|
+
capability: "schemas",
|
|
325
|
+
entity: entityName,
|
|
326
|
+
shape: "insert",
|
|
327
|
+
}) !== undefined;
|
|
328
|
+
// Collect body schemas needed for imports
|
|
329
|
+
const bodySchemasNeeded = [];
|
|
330
|
+
// Build the Express router chain
|
|
331
|
+
// Router().get('/path', handler).post('/path', handler)...
|
|
332
|
+
let chainExpr = b.callExpression(b.identifier("Router"), []);
|
|
333
|
+
for (const method of entityMethods.methods) {
|
|
334
|
+
const pathParams = method.params.filter(p => p.source === "pk" || p.source === "fk" || p.source === "lookup");
|
|
335
|
+
const bodySchema = getBodySchemaImport(method, entityName);
|
|
336
|
+
if (bodySchema && hasSchemaProvider) {
|
|
337
|
+
bodySchemasNeeded.push(bodySchema);
|
|
338
|
+
}
|
|
339
|
+
const { httpMethod, path, handler } = buildRouteCall(method, entityName, {
|
|
340
|
+
hasSchemaProvider,
|
|
341
|
+
bodySchema,
|
|
342
|
+
pathParams,
|
|
343
|
+
});
|
|
344
|
+
chainExpr = b.callExpression(b.memberExpression(cast.toExpr(chainExpr), b.identifier(httpMethod)), [b.stringLiteral(path), handler]);
|
|
345
|
+
}
|
|
346
|
+
// Import schemas needed for body validation
|
|
347
|
+
for (const schema of bodySchemasNeeded) {
|
|
348
|
+
file.import({
|
|
349
|
+
kind: "symbol",
|
|
350
|
+
ref: { capability: "schemas", entity: schema.entity, shape: schema.shape },
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
const exportStmt = conjure.export.const(routesVarName, chainExpr);
|
|
354
|
+
file.ast(conjure.program(exportStmt)).emit();
|
|
355
|
+
generatedRoutes.push({
|
|
356
|
+
fileName: `${inflect.uncapitalize(entityName)}.js`,
|
|
357
|
+
exportName: routesVarName,
|
|
358
|
+
pathSegment,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
// Generate aggregator index.ts
|
|
362
|
+
if (generatedRoutes.length > 0) {
|
|
363
|
+
const indexPath = `${outputDir}/index.ts`;
|
|
364
|
+
const indexFile = ctx.file(indexPath);
|
|
365
|
+
if (header) {
|
|
366
|
+
indexFile.header(header);
|
|
367
|
+
}
|
|
368
|
+
indexFile.import({ kind: "package", names: ["Router"], from: "express" });
|
|
369
|
+
for (const route of generatedRoutes) {
|
|
370
|
+
indexFile.import({
|
|
371
|
+
kind: "relative",
|
|
372
|
+
names: [route.exportName],
|
|
373
|
+
from: `./${route.fileName}`,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
// Build: Router().use('/users', userRoutes).use('/posts', postRoutes)...
|
|
377
|
+
let chainExpr = b.callExpression(b.identifier("Router"), []);
|
|
378
|
+
// Add routes with their path prefixes
|
|
379
|
+
for (const route of generatedRoutes) {
|
|
380
|
+
chainExpr = b.callExpression(b.memberExpression(cast.toExpr(chainExpr), b.identifier("use")), [b.stringLiteral(`${basePath}/${route.pathSegment}`), b.identifier(route.exportName)]);
|
|
381
|
+
}
|
|
382
|
+
const exportStmt = conjure.export.const(aggregatorName, chainExpr);
|
|
383
|
+
indexFile.ast(conjure.program(exportStmt)).emit();
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=http-express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-express.js","sourceRoot":"","sources":["../../src/plugins/http-express.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Hono Plugin - Generate Hono 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 Hono HTTP route handlers.
|
|
6
|
+
*
|
|
7
|
+
* Schema validation is provided via @hono/standard-validator when a schema plugin
|
|
8
|
+
* (zod, valibot, arktype) is configured. Without a schema plugin, routes are
|
|
9
|
+
* generated without validation middleware.
|
|
10
|
+
*/
|
|
11
|
+
import { Schema as S } from "effect";
|
|
12
|
+
import { definePlugin } from "../services/plugin.js";
|
|
13
|
+
declare const HttpHonoConfigSchema: S.Struct<{
|
|
14
|
+
/** Output directory for generated route files. Default: "routes" */
|
|
15
|
+
outputDir: S.optionalWith<typeof S.String, {
|
|
16
|
+
default: () => string;
|
|
17
|
+
}>;
|
|
18
|
+
/** Base path for all routes. Default: "/api" */
|
|
19
|
+
basePath: S.optionalWith<typeof S.String, {
|
|
20
|
+
default: () => string;
|
|
21
|
+
}>;
|
|
22
|
+
/** Header content to prepend to each generated file */
|
|
23
|
+
header: S.optional<typeof S.String>;
|
|
24
|
+
/**
|
|
25
|
+
* Name of the aggregated router export.
|
|
26
|
+
* Default: "api"
|
|
27
|
+
*/
|
|
28
|
+
aggregatorName: S.optionalWith<typeof S.String, {
|
|
29
|
+
default: () => string;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
32
|
+
/** Input config type (with optional fields) */
|
|
33
|
+
export type HttpHonoConfig = S.Schema.Encoded<typeof HttpHonoConfigSchema>;
|
|
34
|
+
export declare function httpHono(config?: HttpHonoConfig): ReturnType<typeof definePlugin>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=http-hono.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-hono.d.ts","sourceRoot":"","sources":["../../src/plugins/http-hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,YAAY,EAAsB,MAAM,uBAAuB,CAAC;AAoBzE,QAAA,MAAM,oBAAoB;IACxB,oEAAoE;;;;IAGpE,gDAAgD;;;;IAGhD,uDAAuD;;IAGvD;;;OAGG;;;;EAEH,CAAC;AAEH,+CAA+C;AAC/C,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAwa3E,wBAAgB,QAAQ,CAAC,MAAM,GAAE,cAAmB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAwLrF"}
|