@danielfgray/pg-sourcerer 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/pgsourcerer +2 -0
- package/dist/__tests__/fixtures/index.d.ts +15 -0
- package/dist/__tests__/fixtures/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/index.js +19 -0
- package/dist/__tests__/fixtures/index.js.map +1 -0
- package/dist/__tests__/fixtures/introspection.json +40522 -0
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +7 -46
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +38 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -2
- package/dist/config.js.map +1 -1
- package/dist/{lib/conjure.d.ts → conjure/index.d.ts} +62 -3
- package/dist/conjure/index.d.ts.map +1 -0
- package/dist/{lib/conjure.js → conjure/index.js} +124 -3
- package/dist/conjure/index.js.map +1 -0
- package/dist/conjure/signature.d.ts +85 -0
- package/dist/conjure/signature.d.ts.map +1 -0
- package/dist/conjure/signature.js +130 -0
- package/dist/conjure/signature.js.map +1 -0
- package/dist/conjure/types.d.ts +97 -0
- package/dist/conjure/types.d.ts.map +1 -0
- package/dist/conjure/types.js +206 -0
- package/dist/conjure/types.js.map +1 -0
- package/dist/errors.d.ts +114 -139
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +82 -36
- package/dist/errors.js.map +1 -1
- package/dist/generate.d.ts +45 -46
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +86 -59
- package/dist/generate.js.map +1 -1
- package/dist/hex/builder.d.ts +12 -0
- package/dist/hex/builder.d.ts.map +1 -0
- package/dist/hex/builder.js +64 -0
- package/dist/hex/builder.js.map +1 -0
- package/dist/hex/ddl.d.ts +53 -0
- package/dist/hex/ddl.d.ts.map +1 -0
- package/dist/hex/ddl.js +306 -0
- package/dist/hex/ddl.js.map +1 -0
- package/dist/hex/index.d.ts +105 -0
- package/dist/hex/index.d.ts.map +1 -0
- package/dist/hex/index.js +81 -0
- package/dist/hex/index.js.map +1 -0
- package/dist/hex/primitives.d.ts +23 -0
- package/dist/hex/primitives.d.ts.map +1 -0
- package/dist/hex/primitives.js +38 -0
- package/dist/hex/primitives.js.map +1 -0
- package/dist/hex/query.d.ts +116 -0
- package/dist/hex/query.d.ts.map +1 -0
- package/dist/hex/query.js +219 -0
- package/dist/hex/query.js.map +1 -0
- package/dist/hex/types.d.ts +287 -0
- package/dist/hex/types.d.ts.map +1 -0
- package/dist/hex/types.js +431 -0
- package/dist/hex/types.js.map +1 -0
- package/dist/index.d.ts +17 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +33 -44
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +76 -140
- package/dist/init.js.map +1 -1
- package/dist/ir/extensions/queries.d.ts +6 -6
- package/dist/ir/extensions/queries.d.ts.map +1 -1
- package/dist/ir/extensions/queries.js +6 -4
- package/dist/ir/extensions/queries.js.map +1 -1
- package/dist/ir/extensions/schema-builder.d.ts.map +1 -1
- package/dist/ir/extensions/schema-builder.js.map +1 -1
- package/dist/ir/index.d.ts.map +1 -1
- package/dist/ir/index.js.map +1 -1
- package/dist/ir/relation-graph.d.ts.map +1 -1
- package/dist/ir/relation-graph.js +8 -8
- package/dist/ir/relation-graph.js.map +1 -1
- package/dist/ir/semantic-ir.d.ts +38 -0
- package/dist/ir/semantic-ir.d.ts.map +1 -1
- package/dist/ir/semantic-ir.js +50 -2
- package/dist/ir/semantic-ir.js.map +1 -1
- package/dist/ir/smart-tags.d.ts.map +1 -1
- package/dist/ir/smart-tags.js.map +1 -1
- package/dist/lib/field-utils.d.ts.map +1 -1
- package/dist/lib/field-utils.js +7 -7
- package/dist/lib/field-utils.js.map +1 -1
- package/dist/lib/join-graph.d.ts +95 -0
- package/dist/lib/join-graph.d.ts.map +1 -0
- package/dist/lib/join-graph.js +305 -0
- package/dist/lib/join-graph.js.map +1 -0
- package/dist/lib/picker.d.ts +60 -0
- package/dist/lib/picker.d.ts.map +1 -0
- package/dist/lib/picker.js +325 -0
- package/dist/lib/picker.js.map +1 -0
- package/dist/plugins/arktype.d.ts +20 -24
- package/dist/plugins/arktype.d.ts.map +1 -1
- package/dist/plugins/arktype.js +462 -386
- package/dist/plugins/arktype.js.map +1 -1
- package/dist/plugins/effect/http.d.ts +7 -0
- package/dist/plugins/effect/http.d.ts.map +1 -0
- package/dist/plugins/effect/http.js +460 -0
- package/dist/plugins/effect/http.js.map +1 -0
- package/dist/plugins/effect/index.d.ts +22 -0
- package/dist/plugins/effect/index.d.ts.map +1 -0
- package/dist/plugins/effect/index.js +65 -0
- package/dist/plugins/effect/index.js.map +1 -0
- package/dist/plugins/effect/models.d.ts +6 -0
- package/dist/plugins/effect/models.d.ts.map +1 -0
- package/dist/plugins/effect/models.js +116 -0
- package/dist/plugins/effect/models.js.map +1 -0
- package/dist/plugins/effect/repos.d.ts +21 -0
- package/dist/plugins/effect/repos.d.ts.map +1 -0
- package/dist/plugins/effect/repos.js +131 -0
- package/dist/plugins/effect/repos.js.map +1 -0
- package/dist/plugins/effect/schemas.d.ts +7 -0
- package/dist/plugins/effect/schemas.d.ts.map +1 -0
- package/dist/plugins/effect/schemas.js +75 -0
- package/dist/plugins/effect/schemas.js.map +1 -0
- package/dist/plugins/effect/shared.d.ts +116 -0
- package/dist/plugins/effect/shared.d.ts.map +1 -0
- package/dist/plugins/effect/shared.js +164 -0
- package/dist/plugins/effect/shared.js.map +1 -0
- package/dist/plugins/http-elysia.d.ts +20 -27
- package/dist/plugins/http-elysia.d.ts.map +1 -1
- package/dist/plugins/http-elysia.js +350 -475
- package/dist/plugins/http-elysia.js.map +1 -1
- package/dist/plugins/http-express.d.ts +20 -31
- package/dist/plugins/http-express.d.ts.map +1 -1
- package/dist/plugins/http-express.js +281 -268
- package/dist/plugins/http-express.js.map +1 -1
- package/dist/plugins/http-hono.d.ts +17 -33
- package/dist/plugins/http-hono.d.ts.map +1 -1
- package/dist/plugins/http-hono.js +317 -341
- package/dist/plugins/http-hono.js.map +1 -1
- package/dist/plugins/http-orpc.d.ts +34 -33
- package/dist/plugins/http-orpc.d.ts.map +1 -1
- package/dist/plugins/http-orpc.js +345 -257
- package/dist/plugins/http-orpc.js.map +1 -1
- package/dist/plugins/http-trpc.d.ts +33 -35
- package/dist/plugins/http-trpc.d.ts.map +1 -1
- package/dist/plugins/http-trpc.js +337 -241
- package/dist/plugins/http-trpc.js.map +1 -1
- package/dist/plugins/kysely.d.ts +54 -59
- package/dist/plugins/kysely.d.ts.map +1 -1
- package/dist/plugins/kysely.js +826 -687
- package/dist/plugins/kysely.js.map +1 -1
- package/dist/plugins/sql-queries.d.ts +38 -44
- package/dist/plugins/sql-queries.d.ts.map +1 -1
- package/dist/plugins/sql-queries.js +497 -897
- package/dist/plugins/sql-queries.js.map +1 -1
- package/dist/plugins/types.d.ts +12 -20
- package/dist/plugins/types.d.ts.map +1 -1
- package/dist/plugins/types.js +84 -227
- package/dist/plugins/types.js.map +1 -1
- package/dist/plugins/valibot.d.ts +7 -44
- package/dist/plugins/valibot.d.ts.map +1 -1
- package/dist/plugins/valibot.js +376 -382
- package/dist/plugins/valibot.js.map +1 -1
- package/dist/plugins/zod.d.ts +20 -24
- package/dist/plugins/zod.d.ts.map +1 -1
- package/dist/plugins/zod.js +370 -367
- package/dist/plugins/zod.js.map +1 -1
- package/dist/runtime/emit.d.ts +64 -0
- package/dist/runtime/emit.d.ts.map +1 -0
- package/dist/runtime/emit.js +445 -0
- package/dist/runtime/emit.js.map +1 -0
- package/dist/runtime/errors.d.ts +36 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +29 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/file-assignment.d.ts +161 -0
- package/dist/runtime/file-assignment.d.ts.map +1 -0
- package/dist/runtime/file-assignment.js +195 -0
- package/dist/runtime/file-assignment.js.map +1 -0
- package/dist/runtime/orchestrator.d.ts +62 -0
- package/dist/runtime/orchestrator.d.ts.map +1 -0
- package/dist/runtime/orchestrator.js +99 -0
- package/dist/runtime/orchestrator.js.map +1 -0
- package/dist/runtime/registry.d.ts +268 -0
- package/dist/runtime/registry.d.ts.map +1 -0
- package/dist/runtime/registry.js +436 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/runtime/types.d.ts +182 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/validation.d.ts +41 -0
- package/dist/runtime/validation.d.ts.map +1 -0
- package/dist/runtime/validation.js +70 -0
- package/dist/runtime/validation.js.map +1 -0
- package/dist/services/config-loader.d.ts.map +1 -1
- package/dist/services/config-loader.js +15 -6
- package/dist/services/config-loader.js.map +1 -1
- package/dist/services/config.d.ts +55 -25
- package/dist/services/config.d.ts.map +1 -1
- package/dist/services/config.js +60 -34
- package/dist/services/config.js.map +1 -1
- package/dist/services/file-writer.d.ts +3 -3
- package/dist/services/file-writer.d.ts.map +1 -1
- package/dist/services/file-writer.js +6 -8
- package/dist/services/file-writer.js.map +1 -1
- package/dist/services/inflection.d.ts +126 -27
- package/dist/services/inflection.d.ts.map +1 -1
- package/dist/services/inflection.js +300 -72
- package/dist/services/inflection.js.map +1 -1
- package/dist/services/introspection.d.ts.map +1 -1
- package/dist/services/introspection.js +6 -6
- package/dist/services/introspection.js.map +1 -1
- package/dist/services/ir-builder.d.ts.map +1 -1
- package/dist/services/ir-builder.js +73 -77
- package/dist/services/ir-builder.js.map +1 -1
- package/dist/services/ir.d.ts.map +1 -1
- package/dist/services/ir.js.map +1 -1
- package/dist/services/pg-types.d.ts.map +1 -1
- package/dist/services/pg-types.js +3 -3
- package/dist/services/pg-types.js.map +1 -1
- package/dist/services/smart-tags-parser.d.ts.map +1 -1
- package/dist/services/smart-tags-parser.js +4 -4
- package/dist/services/smart-tags-parser.js.map +1 -1
- package/dist/services/type-hints.d.ts.map +1 -1
- package/dist/services/type-hints.js +1 -1
- package/dist/services/type-hints.js.map +1 -1
- package/dist/services/user-module-parser.d.ts +46 -0
- package/dist/services/user-module-parser.d.ts.map +1 -0
- package/dist/services/user-module-parser.js +181 -0
- package/dist/services/user-module-parser.js.map +1 -0
- package/dist/shared/converters.d.ts +60 -0
- package/dist/shared/converters.d.ts.map +1 -0
- package/dist/shared/converters.js +168 -0
- package/dist/shared/converters.js.map +1 -0
- package/dist/shared/query-types.d.ts +95 -0
- package/dist/shared/query-types.d.ts.map +1 -0
- package/dist/shared/query-types.js +9 -0
- package/dist/shared/query-types.js.map +1 -0
- package/dist/testing.d.ts +125 -37
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +134 -42
- package/dist/testing.js.map +1 -1
- package/dist/user-module.d.ts +86 -0
- package/dist/user-module.d.ts.map +1 -0
- package/dist/user-module.js +55 -0
- package/dist/user-module.js.map +1 -0
- package/package.json +10 -6
- package/dist/lib/conjure.d.ts.map +0 -1
- package/dist/lib/conjure.js.map +0 -1
- package/dist/lib/hex.d.ts +0 -119
- package/dist/lib/hex.d.ts.map +0 -1
- package/dist/lib/hex.js +0 -188
- package/dist/lib/hex.js.map +0 -1
- package/dist/plugins/effect.d.ts +0 -53
- package/dist/plugins/effect.d.ts.map +0 -1
- package/dist/plugins/effect.js +0 -1074
- package/dist/plugins/effect.js.map +0 -1
- package/dist/plugins/kysely/queries.d.ts +0 -92
- package/dist/plugins/kysely/queries.d.ts.map +0 -1
- package/dist/plugins/kysely/queries.js +0 -1169
- package/dist/plugins/kysely/queries.js.map +0 -1
- package/dist/plugins/kysely/shared.d.ts +0 -59
- package/dist/plugins/kysely/shared.d.ts.map +0 -1
- package/dist/plugins/kysely/shared.js +0 -247
- package/dist/plugins/kysely/shared.js.map +0 -1
- package/dist/plugins/kysely/types.d.ts +0 -22
- package/dist/plugins/kysely/types.d.ts.map +0 -1
- package/dist/plugins/kysely/types.js +0 -428
- package/dist/plugins/kysely/types.js.map +0 -1
- package/dist/services/artifact-store.d.ts +0 -65
- package/dist/services/artifact-store.d.ts.map +0 -1
- package/dist/services/artifact-store.js +0 -57
- package/dist/services/artifact-store.js.map +0 -1
- package/dist/services/core-providers.d.ts +0 -15
- package/dist/services/core-providers.d.ts.map +0 -1
- package/dist/services/core-providers.js +0 -23
- package/dist/services/core-providers.js.map +0 -1
- package/dist/services/emissions.d.ts +0 -103
- package/dist/services/emissions.d.ts.map +0 -1
- package/dist/services/emissions.js +0 -241
- package/dist/services/emissions.js.map +0 -1
- package/dist/services/execution.d.ts +0 -35
- package/dist/services/execution.d.ts.map +0 -1
- package/dist/services/execution.js +0 -86
- package/dist/services/execution.js.map +0 -1
- package/dist/services/file-builder.d.ts +0 -85
- package/dist/services/file-builder.d.ts.map +0 -1
- package/dist/services/file-builder.js +0 -112
- package/dist/services/file-builder.js.map +0 -1
- package/dist/services/plugin-meta.d.ts +0 -33
- package/dist/services/plugin-meta.d.ts.map +0 -1
- package/dist/services/plugin-meta.js +0 -24
- package/dist/services/plugin-meta.js.map +0 -1
- package/dist/services/plugin-runner.d.ts +0 -42
- package/dist/services/plugin-runner.d.ts.map +0 -1
- package/dist/services/plugin-runner.js +0 -84
- package/dist/services/plugin-runner.js.map +0 -1
- package/dist/services/plugin.d.ts +0 -421
- package/dist/services/plugin.d.ts.map +0 -1
- package/dist/services/plugin.js +0 -197
- package/dist/services/plugin.js.map +0 -1
- package/dist/services/resolution.d.ts +0 -38
- package/dist/services/resolution.d.ts.map +0 -1
- package/dist/services/resolution.js +0 -242
- package/dist/services/resolution.js.map +0 -1
- package/dist/services/service-registry.d.ts +0 -74
- package/dist/services/service-registry.d.ts.map +0 -1
- package/dist/services/service-registry.js +0 -61
- package/dist/services/service-registry.js.map +0 -1
- package/dist/services/symbols.d.ts +0 -144
- package/dist/services/symbols.d.ts.map +0 -1
- package/dist/services/symbols.js +0 -144
- package/dist/services/symbols.js.map +0 -1
package/dist/plugins/valibot.js
CHANGED
|
@@ -1,422 +1,416 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Valibot Plugin -
|
|
2
|
+
* Valibot Plugin - Generates Valibot schemas for entities
|
|
3
3
|
*
|
|
4
4
|
* Generates Valibot schemas for Row, Insert, Update, and Patch shapes,
|
|
5
|
-
* with inferred TypeScript types.
|
|
5
|
+
* with optional inferred TypeScript types.
|
|
6
|
+
*
|
|
7
|
+
* Capabilities provided:
|
|
8
|
+
* - `schema:valibot:EntityName` for each table entity (Row schema)
|
|
9
|
+
* - `schema:valibot:EntityName:insert` for Insert shape
|
|
10
|
+
* - `schema:valibot:EntityName:update` for Update shape
|
|
11
|
+
* - `schema:valibot:EnumName` for enum entities
|
|
6
12
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// Configuration
|
|
17
|
-
// ============================================================================
|
|
18
|
-
const ValibotConfigSchema = S.Struct({
|
|
19
|
-
/** Output directory relative to main outputDir */
|
|
20
|
-
outputDir: S.optionalWith(S.String, { default: () => "valibot" }),
|
|
21
|
-
/** Export inferred types alongside schemas */
|
|
13
|
+
import { Effect, Schema as S } from "effect";
|
|
14
|
+
import { normalizeFileNaming } from "../runtime/file-assignment.js";
|
|
15
|
+
import { SymbolRegistry } from "../runtime/registry.js";
|
|
16
|
+
import { IR } from "../services/ir.js";
|
|
17
|
+
import { isTableEntity, isEnumEntity, } from "../ir/semantic-ir.js";
|
|
18
|
+
import { conjure, cast } from "../conjure/index.js";
|
|
19
|
+
const b = conjure.b;
|
|
20
|
+
const ValibotSchemaConfig = S.Struct({
|
|
22
21
|
exportTypes: S.optionalWith(S.Boolean, { default: () => true }),
|
|
23
|
-
/** How to represent enum values: 'strings' uses v.picklist([...]), 'enum' uses v.enum(TsEnum) */
|
|
24
|
-
enumStyle: S.optionalWith(S.Union(S.Literal("strings"), S.Literal("enum")), {
|
|
25
|
-
default: () => "strings",
|
|
26
|
-
}),
|
|
27
|
-
/** Where to define enum types: 'inline' embeds at usage, 'separate' generates enum files */
|
|
28
|
-
typeReferences: S.optionalWith(S.Union(S.Literal("inline"), S.Literal("separate")), {
|
|
29
|
-
default: () => "separate",
|
|
30
|
-
}),
|
|
31
22
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
*/
|
|
64
|
-
const tsTypeToValibotMethod = (tsType) => {
|
|
65
|
-
switch (tsType) {
|
|
66
|
-
case TsType.String:
|
|
67
|
-
return "string";
|
|
68
|
-
case TsType.Number:
|
|
69
|
-
return "number";
|
|
70
|
-
case TsType.Boolean:
|
|
71
|
-
return "boolean";
|
|
72
|
-
case TsType.BigInt:
|
|
73
|
-
return "bigint";
|
|
74
|
-
case TsType.Date:
|
|
75
|
-
return "date";
|
|
76
|
-
case TsType.Buffer:
|
|
77
|
-
case TsType.Unknown:
|
|
78
|
-
default:
|
|
79
|
-
return "unknown";
|
|
23
|
+
const PG_STRING_TYPES = new Set([
|
|
24
|
+
"uuid",
|
|
25
|
+
"text",
|
|
26
|
+
"varchar",
|
|
27
|
+
"char",
|
|
28
|
+
"character",
|
|
29
|
+
"name",
|
|
30
|
+
"bpchar",
|
|
31
|
+
"citext",
|
|
32
|
+
]);
|
|
33
|
+
const PG_NUMBER_TYPES = new Set([
|
|
34
|
+
"int2",
|
|
35
|
+
"int4",
|
|
36
|
+
"int8",
|
|
37
|
+
"integer",
|
|
38
|
+
"smallint",
|
|
39
|
+
"bigint",
|
|
40
|
+
"numeric",
|
|
41
|
+
"decimal",
|
|
42
|
+
"real",
|
|
43
|
+
"float4",
|
|
44
|
+
"float8",
|
|
45
|
+
"double",
|
|
46
|
+
]);
|
|
47
|
+
const PG_BOOLEAN_TYPES = new Set(["bool", "boolean"]);
|
|
48
|
+
const PG_DATE_TYPES = new Set(["timestamp", "timestamptz", "date", "time", "timetz"]);
|
|
49
|
+
const PG_JSON_TYPES = new Set(["json", "jsonb"]);
|
|
50
|
+
function fieldToValibotMapping(field, enums) {
|
|
51
|
+
const pgType = field.pgAttribute.getType();
|
|
52
|
+
if (!pgType) {
|
|
53
|
+
return { kind: "schema", schema: conjure.id("v").method("unknown").build() };
|
|
80
54
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const applyFieldModifiers = (schema, field) => {
|
|
87
|
-
let result = schema;
|
|
88
|
-
// Array wrapping first
|
|
89
|
-
if (field.isArray) {
|
|
90
|
-
result = buildValibotArray(result);
|
|
55
|
+
let typeName;
|
|
56
|
+
let typeInfo;
|
|
57
|
+
if (pgType.typcategory === "A") {
|
|
58
|
+
typeName = field.elementTypeName ?? "unknown";
|
|
59
|
+
typeInfo = pgType;
|
|
91
60
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
61
|
+
else if (pgType.typtype === "d" && field.domainBaseType) {
|
|
62
|
+
typeName = field.domainBaseType.typeName;
|
|
63
|
+
typeInfo = { typcategory: field.domainBaseType.category };
|
|
95
64
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
65
|
+
else {
|
|
66
|
+
typeName = pgType.typname;
|
|
67
|
+
typeInfo = pgType;
|
|
99
68
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
* Resolve a field to its Valibot schema expression
|
|
104
|
-
*/
|
|
105
|
-
const resolveFieldValibotSchema = (field, ctx) => {
|
|
106
|
-
const resolved = resolveFieldType(field, ctx.enums, ctx.extensions);
|
|
107
|
-
// Enum handling
|
|
108
|
-
if (resolved.enumDef) {
|
|
109
|
-
let enumSchema;
|
|
110
|
-
if (ctx.typeReferences === "separate") {
|
|
111
|
-
// Reference by name - the enum schema is imported
|
|
112
|
-
enumSchema = conjure.id(resolved.enumDef.name).build();
|
|
113
|
-
}
|
|
114
|
-
else if (ctx.enumStyle === "enum") {
|
|
115
|
-
// Inline native enum: v.enum(EnumName)
|
|
116
|
-
// Note: This requires the TS enum to be generated separately
|
|
117
|
-
enumSchema = buildValibotCall("enum", [conjure.id(resolved.enumDef.name).build()]);
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
// Inline strings: v.picklist(['a', 'b', 'c'])
|
|
121
|
-
enumSchema = buildValibotPicklist(resolved.enumDef.values);
|
|
122
|
-
}
|
|
123
|
-
return applyFieldModifiers(enumSchema, field);
|
|
69
|
+
const baseResult = baseTypeToValibotMapping(typeName, typeInfo, enums);
|
|
70
|
+
if (baseResult.kind === "enumRef") {
|
|
71
|
+
return baseResult;
|
|
124
72
|
}
|
|
125
|
-
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
buildValibotCall("string"),
|
|
129
|
-
buildValibotCall("uuid"),
|
|
130
|
-
]);
|
|
131
|
-
return applyFieldModifiers(uuidSchema, field);
|
|
73
|
+
let schema = baseResult.schema;
|
|
74
|
+
if (field.isArray) {
|
|
75
|
+
schema = conjure.id("v").method("array", [schema]).build();
|
|
132
76
|
}
|
|
133
|
-
|
|
134
|
-
if (
|
|
135
|
-
|
|
77
|
+
const methods = [];
|
|
78
|
+
if (field.nullable)
|
|
79
|
+
methods.push("nullable");
|
|
80
|
+
if (field.optional)
|
|
81
|
+
methods.push("optional");
|
|
82
|
+
for (const method of methods) {
|
|
83
|
+
schema = conjure.id("v").method(method, [schema]).build();
|
|
136
84
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
const generateShapeStatements = (shape, entityName, shapeKind, ctx, exportTypes) => {
|
|
154
|
-
const schemaSymbolCtx = { capability: "schemas", entity: entityName, shape: shapeKind };
|
|
155
|
-
const schemaExpr = buildShapeValibotObject(shape, ctx);
|
|
156
|
-
const schemaStatement = exp.const(shape.name, schemaSymbolCtx, schemaExpr);
|
|
157
|
-
if (!exportTypes) {
|
|
158
|
-
return [schemaStatement];
|
|
85
|
+
return { kind: "schema", schema };
|
|
86
|
+
}
|
|
87
|
+
function baseTypeToValibotMapping(typeName, pgType, enums) {
|
|
88
|
+
const normalized = typeName.toLowerCase();
|
|
89
|
+
if (PG_STRING_TYPES.has(normalized)) {
|
|
90
|
+
if (normalized === "uuid") {
|
|
91
|
+
const uuidSchema = conjure
|
|
92
|
+
.id("v")
|
|
93
|
+
.method("pipe", [
|
|
94
|
+
conjure.id("v").method("string").build(),
|
|
95
|
+
conjure.id("v").method("uuid").build(),
|
|
96
|
+
])
|
|
97
|
+
.build();
|
|
98
|
+
return { kind: "schema", schema: uuidSchema };
|
|
99
|
+
}
|
|
100
|
+
return { kind: "schema", schema: conjure.id("v").method("string").build() };
|
|
159
101
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
const typeSymbolCtx = { capability: "types", entity: entityName, shape: shapeKind };
|
|
163
|
-
const inferType = ts.qualifiedRef("v", "InferOutput", [ts.typeof(shape.name)]);
|
|
164
|
-
const typeStatement = exp.type(shape.name, typeSymbolCtx, inferType);
|
|
165
|
-
return [schemaStatement, typeStatement];
|
|
166
|
-
};
|
|
167
|
-
/**
|
|
168
|
-
* Collect all defined shapes from an entity as [kind, shape] pairs
|
|
169
|
-
*/
|
|
170
|
-
const collectShapes = (entity) => [
|
|
171
|
-
["row", entity.shapes.row],
|
|
172
|
-
["insert", entity.shapes.insert],
|
|
173
|
-
["update", entity.shapes.update],
|
|
174
|
-
].filter((entry) => entry[1] != null);
|
|
175
|
-
/**
|
|
176
|
-
* Generate all statements for an entity's shapes
|
|
177
|
-
*/
|
|
178
|
-
const generateEntityStatements = (entity, ctx, exportTypes) => collectShapes(entity).flatMap(([kind, shape]) => generateShapeStatements(shape, entity.name, kind, ctx, exportTypes));
|
|
179
|
-
// ============================================================================
|
|
180
|
-
// Composite Type Generation
|
|
181
|
-
// ============================================================================
|
|
182
|
-
/**
|
|
183
|
-
* Build v.object({...}) expression from composite fields
|
|
184
|
-
*/
|
|
185
|
-
const buildCompositeValibotObject = (composite, ctx) => {
|
|
186
|
-
const objBuilder = composite.fields.reduce((builder, field) => builder.prop(field.name, resolveFieldValibotSchema(field, ctx)), obj());
|
|
187
|
-
return buildValibotCall("object", [objBuilder.build()]);
|
|
188
|
-
};
|
|
189
|
-
/**
|
|
190
|
-
* Generate schema const + optional inferred type for a composite type
|
|
191
|
-
*/
|
|
192
|
-
const generateCompositeStatements = (composite, ctx, exportTypes) => {
|
|
193
|
-
const schemaSymbolCtx = { capability: "schemas", entity: composite.name };
|
|
194
|
-
const schemaExpr = buildCompositeValibotObject(composite, ctx);
|
|
195
|
-
const schemaStatement = exp.const(composite.name, schemaSymbolCtx, schemaExpr);
|
|
196
|
-
if (!exportTypes) {
|
|
197
|
-
return [schemaStatement];
|
|
102
|
+
if (PG_NUMBER_TYPES.has(normalized)) {
|
|
103
|
+
return { kind: "schema", schema: conjure.id("v").method("number").build() };
|
|
198
104
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
const typeSymbolCtx = { capability: "types", entity: composite.name };
|
|
202
|
-
const inferType = ts.qualifiedRef("v", "InferOutput", [ts.typeof(composite.name)]);
|
|
203
|
-
const typeStatement = exp.type(composite.name, typeSymbolCtx, inferType);
|
|
204
|
-
return [schemaStatement, typeStatement];
|
|
205
|
-
};
|
|
206
|
-
// ============================================================================
|
|
207
|
-
// Enum Generation
|
|
208
|
-
// ============================================================================
|
|
209
|
-
/**
|
|
210
|
-
* Generate enum schema statement: export const EnumName = v.picklist(['a', 'b', ...])
|
|
211
|
-
* or for native enums: export enum EnumName { A = 'a', ... } + schema
|
|
212
|
-
*/
|
|
213
|
-
const generateEnumStatement = (enumEntity, enumStyle, exportTypes) => {
|
|
214
|
-
const schemaSymbolCtx = { capability: "schemas", entity: enumEntity.name };
|
|
215
|
-
if (enumStyle === "enum") {
|
|
216
|
-
// Generate: export enum EnumName { A = 'a', B = 'b', ... }
|
|
217
|
-
// Then: export const EnumNameSchema = v.enum(EnumName)
|
|
218
|
-
const enumStatement = exp.tsEnum(enumEntity.name, { capability: "types", entity: enumEntity.name }, enumEntity.values);
|
|
219
|
-
const schemaName = `${enumEntity.name}Schema`;
|
|
220
|
-
const schemaExpr = buildValibotCall("enum", [conjure.id(enumEntity.name).build()]);
|
|
221
|
-
const schemaStatement = exp.const(schemaName, schemaSymbolCtx, schemaExpr);
|
|
222
|
-
return [enumStatement, schemaStatement];
|
|
105
|
+
if (PG_BOOLEAN_TYPES.has(normalized)) {
|
|
106
|
+
return { kind: "schema", schema: conjure.id("v").method("boolean").build() };
|
|
223
107
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
const schemaStatement = exp.const(enumEntity.name, schemaSymbolCtx, schemaExpr);
|
|
227
|
-
if (!exportTypes) {
|
|
228
|
-
return [schemaStatement];
|
|
108
|
+
if (PG_DATE_TYPES.has(normalized)) {
|
|
109
|
+
return { kind: "schema", schema: conjure.id("v").method("date").build() };
|
|
229
110
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
111
|
+
if (PG_JSON_TYPES.has(normalized)) {
|
|
112
|
+
return { kind: "schema", schema: conjure.id("v").method("unknown").build() };
|
|
113
|
+
}
|
|
114
|
+
if (pgType.typtype === "e" || pgType.typcategory === "E") {
|
|
115
|
+
const enumEntity = enums.find(e => e.pgType.typname === typeName);
|
|
116
|
+
if (enumEntity) {
|
|
117
|
+
return { kind: "enumRef", enumRef: enumEntity.name };
|
|
118
|
+
}
|
|
119
|
+
return { kind: "schema", schema: conjure.id("v").method("unknown").build() };
|
|
120
|
+
}
|
|
121
|
+
return { kind: "schema", schema: conjure.id("v").method("unknown").build() };
|
|
122
|
+
}
|
|
123
|
+
function shapeToValibotObject(shape, enums, registry) {
|
|
124
|
+
const properties = shape.fields.map(field => {
|
|
125
|
+
const mapping = fieldToValibotMapping(field, enums);
|
|
126
|
+
let value;
|
|
127
|
+
if (mapping.kind === "enumRef") {
|
|
128
|
+
const enumHandle = registry.import(`schema:valibot:${mapping.enumRef}`);
|
|
129
|
+
value = enumHandle.ref();
|
|
130
|
+
if (field.isArray) {
|
|
131
|
+
value = conjure.id("v").method("array", [value]).build();
|
|
132
|
+
}
|
|
133
|
+
if (field.nullable) {
|
|
134
|
+
value = conjure.id("v").method("nullable", [value]).build();
|
|
135
|
+
}
|
|
136
|
+
if (field.optional) {
|
|
137
|
+
value = conjure.id("v").method("optional", [value]).build();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
value = mapping.schema;
|
|
142
|
+
}
|
|
143
|
+
return b.objectProperty(b.identifier(field.name), cast.toExpr(value));
|
|
244
144
|
});
|
|
245
|
-
|
|
145
|
+
const objExpr = b.objectExpression(properties);
|
|
146
|
+
const vObject = b.callExpression(b.memberExpression(b.identifier("v"), b.identifier("object")), [
|
|
147
|
+
objExpr,
|
|
148
|
+
]);
|
|
149
|
+
return vObject;
|
|
150
|
+
}
|
|
151
|
+
function createValibotConsumeCallback(schemaName) {
|
|
152
|
+
return (input) => {
|
|
153
|
+
return conjure
|
|
154
|
+
.id("v")
|
|
155
|
+
.method("parse", [conjure.id(schemaName).build(), cast.toExpr(input)])
|
|
156
|
+
.build();
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
const valibotSchemaBuilder = {
|
|
160
|
+
build(request) {
|
|
161
|
+
if (request.params.length === 0) {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
let objBuilder = conjure.obj();
|
|
165
|
+
for (const param of request.params) {
|
|
166
|
+
const valibotType = paramToValibotType(param);
|
|
167
|
+
objBuilder = objBuilder.prop(param.name, valibotType);
|
|
168
|
+
}
|
|
169
|
+
const ast = conjure.id("v").method("object", [objBuilder.build()]).build();
|
|
170
|
+
return {
|
|
171
|
+
ast,
|
|
172
|
+
importSpec: { from: "valibot", names: ["v"] },
|
|
173
|
+
};
|
|
174
|
+
},
|
|
246
175
|
};
|
|
247
|
-
|
|
248
|
-
const
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
}));
|
|
252
|
-
// ============================================================================
|
|
253
|
-
// Param Schema Builder (for HTTP plugins)
|
|
254
|
-
// ============================================================================
|
|
255
|
-
/**
|
|
256
|
-
* Build Valibot schema expression for a single param.
|
|
257
|
-
* Uses v.pipe(v.string(), v.transform(...)) for type coercion since URL params are strings.
|
|
258
|
-
*/
|
|
259
|
-
const buildParamFieldSchema = (param) => {
|
|
260
|
-
const tsType = param.type.toLowerCase();
|
|
261
|
-
let fieldSchema;
|
|
262
|
-
switch (tsType) {
|
|
176
|
+
function paramToValibotType(param) {
|
|
177
|
+
const baseType = param.type.replace(/\[\]$/, "").replace(/\?$/, "").toLowerCase();
|
|
178
|
+
let valibotSchema;
|
|
179
|
+
switch (baseType) {
|
|
263
180
|
case "number":
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
181
|
+
case "int":
|
|
182
|
+
case "integer":
|
|
183
|
+
case "float":
|
|
184
|
+
case "double":
|
|
185
|
+
valibotSchema = conjure
|
|
186
|
+
.id("v")
|
|
187
|
+
.method("pipe", [
|
|
188
|
+
conjure.id("v").method("string").build(),
|
|
189
|
+
conjure
|
|
190
|
+
.id("v")
|
|
191
|
+
.method("transform", [
|
|
192
|
+
b.arrowFunctionExpression([b.identifier("s")], b.identifier("Number")),
|
|
193
|
+
])
|
|
194
|
+
.build(),
|
|
195
|
+
])
|
|
196
|
+
.build();
|
|
269
197
|
break;
|
|
270
198
|
case "boolean":
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
199
|
+
case "bool":
|
|
200
|
+
valibotSchema = conjure
|
|
201
|
+
.id("v")
|
|
202
|
+
.method("pipe", [
|
|
203
|
+
conjure.id("v").method("string").build(),
|
|
204
|
+
conjure
|
|
205
|
+
.id("v")
|
|
206
|
+
.method("transform", [
|
|
207
|
+
b.arrowFunctionExpression([b.identifier("v")], conjure.op.eq(b.identifier("v"), b.stringLiteral("true"))),
|
|
208
|
+
])
|
|
209
|
+
.build(),
|
|
210
|
+
])
|
|
211
|
+
.build();
|
|
278
212
|
break;
|
|
279
213
|
case "bigint":
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
214
|
+
valibotSchema = conjure
|
|
215
|
+
.id("v")
|
|
216
|
+
.method("pipe", [
|
|
217
|
+
conjure.id("v").method("string").build(),
|
|
218
|
+
conjure
|
|
219
|
+
.id("v")
|
|
220
|
+
.method("transform", [
|
|
221
|
+
b.arrowFunctionExpression([b.identifier("s")], b.identifier("BigInt")),
|
|
222
|
+
])
|
|
223
|
+
.build(),
|
|
224
|
+
])
|
|
225
|
+
.build();
|
|
285
226
|
break;
|
|
286
227
|
case "date":
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
228
|
+
valibotSchema = conjure
|
|
229
|
+
.id("v")
|
|
230
|
+
.method("pipe", [
|
|
231
|
+
conjure.id("v").method("string").build(),
|
|
232
|
+
conjure
|
|
233
|
+
.id("v")
|
|
234
|
+
.method("transform", [
|
|
291
235
|
b.arrowFunctionExpression([b.identifier("s")], b.newExpression(b.identifier("Date"), [b.identifier("s")])),
|
|
292
|
-
])
|
|
293
|
-
|
|
236
|
+
])
|
|
237
|
+
.build(),
|
|
238
|
+
])
|
|
239
|
+
.build();
|
|
294
240
|
break;
|
|
295
241
|
case "string":
|
|
296
242
|
default:
|
|
297
|
-
|
|
298
|
-
fieldSchema = buildValibotCall("string");
|
|
243
|
+
valibotSchema = conjure.id("v").method("string").build();
|
|
299
244
|
break;
|
|
300
245
|
}
|
|
301
|
-
// Add v.optional(...) for non-required params
|
|
302
246
|
if (!param.required) {
|
|
303
|
-
|
|
247
|
+
valibotSchema = conjure.id("v").method("optional", [valibotSchema]).build();
|
|
304
248
|
}
|
|
305
|
-
return
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
export function valibot(config = {}) {
|
|
351
|
-
const parsed = S.decodeUnknownSync(ValibotConfigSchema)(config);
|
|
352
|
-
return definePlugin({
|
|
249
|
+
return valibotSchema;
|
|
250
|
+
}
|
|
251
|
+
function getShapeDeclarations(entity) {
|
|
252
|
+
const declarations = [];
|
|
253
|
+
const baseEntityName = entity.name;
|
|
254
|
+
declarations.push({
|
|
255
|
+
name: entity.shapes.row.name,
|
|
256
|
+
capability: `schema:valibot:${entity.shapes.row.name}`,
|
|
257
|
+
baseEntityName,
|
|
258
|
+
});
|
|
259
|
+
if (entity.shapes.insert) {
|
|
260
|
+
const insertName = entity.shapes.insert.name;
|
|
261
|
+
declarations.push({
|
|
262
|
+
name: insertName,
|
|
263
|
+
capability: `schema:valibot:${insertName}`,
|
|
264
|
+
baseEntityName,
|
|
265
|
+
});
|
|
266
|
+
declarations.push({
|
|
267
|
+
name: insertName,
|
|
268
|
+
capability: `schema:valibot:${insertName}:type`,
|
|
269
|
+
baseEntityName,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
if (entity.shapes.update) {
|
|
273
|
+
const updateName = entity.shapes.update.name;
|
|
274
|
+
declarations.push({
|
|
275
|
+
name: updateName,
|
|
276
|
+
capability: `schema:valibot:${updateName}`,
|
|
277
|
+
baseEntityName,
|
|
278
|
+
});
|
|
279
|
+
declarations.push({
|
|
280
|
+
name: updateName,
|
|
281
|
+
capability: `schema:valibot:${updateName}:type`,
|
|
282
|
+
baseEntityName,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
return declarations;
|
|
286
|
+
}
|
|
287
|
+
export function valibot(config) {
|
|
288
|
+
const schemaConfig = S.decodeSync(ValibotSchemaConfig)(config ?? {});
|
|
289
|
+
const resolvedConfig = {
|
|
290
|
+
...schemaConfig,
|
|
291
|
+
schemasFile: normalizeFileNaming(config?.schemasFile, "schemas.ts"),
|
|
292
|
+
};
|
|
293
|
+
return {
|
|
353
294
|
name: "valibot",
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
const
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
.
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
.
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
.emit();
|
|
381
|
-
});
|
|
295
|
+
provides: ["schema"],
|
|
296
|
+
fileDefaults: [
|
|
297
|
+
{
|
|
298
|
+
pattern: "schema:",
|
|
299
|
+
fileNaming: resolvedConfig.schemasFile,
|
|
300
|
+
},
|
|
301
|
+
],
|
|
302
|
+
declare: Effect.gen(function* () {
|
|
303
|
+
const ir = yield* IR;
|
|
304
|
+
const declarations = [];
|
|
305
|
+
for (const entity of ir.entities.values()) {
|
|
306
|
+
if (isTableEntity(entity)) {
|
|
307
|
+
declarations.push(...getShapeDeclarations(entity));
|
|
308
|
+
}
|
|
309
|
+
else if (isEnumEntity(entity)) {
|
|
310
|
+
declarations.push({
|
|
311
|
+
name: entity.name,
|
|
312
|
+
capability: `schema:valibot:${entity.name}`,
|
|
313
|
+
baseEntityName: entity.name,
|
|
314
|
+
});
|
|
315
|
+
declarations.push({
|
|
316
|
+
name: entity.name,
|
|
317
|
+
capability: `schema:valibot:${entity.name}:type`,
|
|
318
|
+
baseEntityName: entity.name,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
382
321
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
const statements = generateEntityStatements(entity, fieldCtx, parsed.exportTypes);
|
|
387
|
-
const entityName = inflection.entityName(entity.pgClass, entity.tags);
|
|
388
|
-
// Collect all fields for enum detection
|
|
389
|
-
const allFields = [
|
|
390
|
-
...entity.shapes.row.fields,
|
|
391
|
-
...(entity.shapes.insert?.fields ?? []),
|
|
392
|
-
...(entity.shapes.update?.fields ?? []),
|
|
393
|
-
];
|
|
394
|
-
const usedEnums = parsed.typeReferences === "separate"
|
|
395
|
-
? collectUsedEnums(allFields, Arr.fromIterable(fieldCtx.enums))
|
|
396
|
-
: new Set();
|
|
397
|
-
const fileBuilder = ctx
|
|
398
|
-
.file(buildFilePath(entityName))
|
|
399
|
-
.import({ kind: "package", namespace: "v", from: "valibot" });
|
|
400
|
-
// Add enum imports when using separate files
|
|
401
|
-
buildEnumImports(usedEnums).forEach(ref => fileBuilder.import(ref));
|
|
402
|
-
fileBuilder.ast(conjure.symbolProgram(...statements)).emit();
|
|
322
|
+
declarations.push({
|
|
323
|
+
name: "valibotSchemaBuilder",
|
|
324
|
+
capability: "schema:valibot:builder",
|
|
403
325
|
});
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
326
|
+
return declarations;
|
|
327
|
+
}),
|
|
328
|
+
render: Effect.gen(function* () {
|
|
329
|
+
const ir = yield* IR;
|
|
330
|
+
const registry = yield* SymbolRegistry;
|
|
331
|
+
const enums = [...ir.entities.values()].filter(isEnumEntity);
|
|
332
|
+
const rendered = [];
|
|
333
|
+
for (const entity of ir.entities.values()) {
|
|
334
|
+
if (isTableEntity(entity)) {
|
|
335
|
+
const shapes = [
|
|
336
|
+
entity.shapes.row,
|
|
337
|
+
];
|
|
338
|
+
if (entity.shapes.insert)
|
|
339
|
+
shapes.push(entity.shapes.insert);
|
|
340
|
+
if (entity.shapes.update)
|
|
341
|
+
shapes.push(entity.shapes.update);
|
|
342
|
+
for (const shape of shapes) {
|
|
343
|
+
const isRow = shape.kind === "row";
|
|
344
|
+
const capability = `schema:valibot:${shape.name}`;
|
|
345
|
+
const schemaNode = registry.forSymbol(capability, () => shapeToValibotObject(shape, enums, registry));
|
|
346
|
+
const schemaDecl = conjure.export.const(shape.name, schemaNode);
|
|
347
|
+
rendered.push({
|
|
348
|
+
name: shape.name,
|
|
349
|
+
capability,
|
|
350
|
+
node: schemaDecl,
|
|
351
|
+
exports: "named",
|
|
352
|
+
externalImports: [{ from: "valibot", names: ["v"] }],
|
|
353
|
+
metadata: {
|
|
354
|
+
consume: createValibotConsumeCallback(shape.name),
|
|
355
|
+
},
|
|
356
|
+
});
|
|
357
|
+
if (resolvedConfig.exportTypes && !isRow) {
|
|
358
|
+
const inferType = conjure.ts.qualifiedRef("v", "InferOutput", [
|
|
359
|
+
conjure.ts.typeof(shape.name),
|
|
360
|
+
]);
|
|
361
|
+
const typeDecl = conjure.export.type(shape.name, inferType);
|
|
362
|
+
rendered.push({
|
|
363
|
+
name: shape.name,
|
|
364
|
+
capability: `schema:valibot:${shape.name}:type`,
|
|
365
|
+
node: typeDecl,
|
|
366
|
+
exports: "named",
|
|
367
|
+
externalImports: [{ from: "valibot", names: ["v"] }],
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
else if (isEnumEntity(entity)) {
|
|
373
|
+
const schemaNode = conjure
|
|
374
|
+
.id("v")
|
|
375
|
+
.method("picklist", [conjure.arr(...entity.values.map(v => conjure.str(v))).build()])
|
|
376
|
+
.build();
|
|
377
|
+
const schemaDecl = conjure.export.const(entity.name, schemaNode);
|
|
378
|
+
const inferType = conjure.ts.qualifiedRef("v", "InferOutput", [
|
|
379
|
+
conjure.ts.typeof(entity.name),
|
|
380
|
+
]);
|
|
381
|
+
const typeDecl = conjure.export.type(entity.name, inferType);
|
|
382
|
+
rendered.push({
|
|
383
|
+
name: entity.name,
|
|
384
|
+
capability: `schema:valibot:${entity.name}`,
|
|
385
|
+
node: schemaDecl,
|
|
386
|
+
exports: "named",
|
|
387
|
+
externalImports: [{ from: "valibot", names: ["v"] }],
|
|
388
|
+
metadata: {
|
|
389
|
+
consume: createValibotConsumeCallback(entity.name),
|
|
390
|
+
},
|
|
391
|
+
});
|
|
392
|
+
if (resolvedConfig.exportTypes) {
|
|
393
|
+
rendered.push({
|
|
394
|
+
name: entity.name,
|
|
395
|
+
capability: `schema:valibot:${entity.name}:type`,
|
|
396
|
+
node: typeDecl,
|
|
397
|
+
exports: "named",
|
|
398
|
+
externalImports: [{ from: "valibot", names: ["v"] }],
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
rendered.push({
|
|
404
|
+
name: "valibotSchemaBuilder",
|
|
405
|
+
capability: "schema:valibot:builder",
|
|
406
|
+
node: null,
|
|
407
|
+
exports: false,
|
|
408
|
+
metadata: {
|
|
409
|
+
builder: valibotSchemaBuilder,
|
|
410
|
+
},
|
|
418
411
|
});
|
|
419
|
-
|
|
420
|
-
|
|
412
|
+
return rendered;
|
|
413
|
+
}),
|
|
414
|
+
};
|
|
421
415
|
}
|
|
422
416
|
//# sourceMappingURL=valibot.js.map
|