@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/generate.js
CHANGED
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
* 1. Load config
|
|
6
6
|
* 2. Introspect database
|
|
7
7
|
* 3. Build IR
|
|
8
|
-
* 4. Run
|
|
9
|
-
* 5.
|
|
8
|
+
* 4. Run plugins
|
|
9
|
+
* 5. Validate user module imports
|
|
10
|
+
* 6. Emit files
|
|
11
|
+
* 7. Write files
|
|
10
12
|
*
|
|
11
13
|
* Logging:
|
|
12
14
|
* - Effect.log (INFO) - Progress messages shown by default
|
|
@@ -14,9 +16,12 @@
|
|
|
14
16
|
*
|
|
15
17
|
* Configure via Logger.withMinimumLogLevel at the call site.
|
|
16
18
|
*/
|
|
17
|
-
import
|
|
19
|
+
import path from "node:path";
|
|
20
|
+
import { Effect, Layer, Schema } from "effect";
|
|
18
21
|
import { Command } from "@effect/platform";
|
|
19
|
-
import {
|
|
22
|
+
import { NodeFileSystem } from "@effect/platform-node";
|
|
23
|
+
import { runPlugins } from "./runtime/orchestrator.js";
|
|
24
|
+
import { emitFiles } from "./runtime/emit.js";
|
|
20
25
|
import { ConfigService } from "./services/config.js";
|
|
21
26
|
import { DatabaseIntrospectionService, DatabaseIntrospectionLive, } from "./services/introspection.js";
|
|
22
27
|
import { createIRBuilderService } from "./services/ir-builder.js";
|
|
@@ -24,25 +29,30 @@ import { createFileWriter } from "./services/file-writer.js";
|
|
|
24
29
|
import { createInflection, makeInflectionLayer } from "./services/inflection.js";
|
|
25
30
|
import { createTypeHintRegistry } from "./services/type-hints.js";
|
|
26
31
|
import { getEnumEntities, getTableEntities, getDomainEntities, getCompositeEntities, } from "./ir/semantic-ir.js";
|
|
27
|
-
import {
|
|
32
|
+
import { createUserModuleParser } from "./services/user-module-parser.js";
|
|
33
|
+
export class FormatError extends Schema.TaggedError()("FormatError", {
|
|
34
|
+
message: Schema.String,
|
|
35
|
+
path: Schema.String,
|
|
36
|
+
cause: Schema.optional(Schema.Unknown),
|
|
37
|
+
}) {
|
|
38
|
+
}
|
|
28
39
|
/**
|
|
29
40
|
* Run a formatter command on the output directory.
|
|
30
41
|
* Spawns a subprocess and fails if it exits non-zero.
|
|
31
42
|
* Output is piped to the parent process's stdout/stderr.
|
|
32
43
|
*/
|
|
33
44
|
const runFormatter = (command, outputDir) => {
|
|
34
|
-
// Parse command string into program and args, append outputDir
|
|
35
45
|
const parts = command.split(/\s+/).filter(Boolean);
|
|
36
46
|
const program = parts[0] ?? "echo";
|
|
37
47
|
const args = parts.slice(1);
|
|
38
48
|
const cmd = Command.make(program, ...args, outputDir).pipe(Command.stdout("inherit"), Command.stderr("inherit"), Command.runInShell(true));
|
|
39
|
-
return Command.exitCode(cmd).pipe(Effect.flatMap(
|
|
49
|
+
return Command.exitCode(cmd).pipe(Effect.flatMap(code => code === 0
|
|
40
50
|
? Effect.void
|
|
41
51
|
: Effect.fail(new FormatError({
|
|
42
52
|
message: `Formatter command failed with exit code ${code}: ${command} ${outputDir}`,
|
|
43
53
|
path: outputDir,
|
|
44
54
|
cause: new Error(`Exit code: ${code}`),
|
|
45
|
-
}))), Effect.mapError(
|
|
55
|
+
}))), Effect.mapError(cause => cause instanceof FormatError
|
|
46
56
|
? cause
|
|
47
57
|
: new FormatError({
|
|
48
58
|
message: `Formatter command failed: ${command} ${outputDir}`,
|
|
@@ -50,41 +60,72 @@ const runFormatter = (command, outputDir) => {
|
|
|
50
60
|
cause,
|
|
51
61
|
})));
|
|
52
62
|
};
|
|
63
|
+
/**
|
|
64
|
+
* Collect all unique UserModuleRefs from rendered symbols.
|
|
65
|
+
*/
|
|
66
|
+
function collectUserModuleRefs(rendered) {
|
|
67
|
+
const seen = new Set();
|
|
68
|
+
const refs = [];
|
|
69
|
+
for (const symbol of rendered) {
|
|
70
|
+
const withImports = symbol;
|
|
71
|
+
if (!withImports.userImports)
|
|
72
|
+
continue;
|
|
73
|
+
for (const ref of withImports.userImports) {
|
|
74
|
+
// Only validate refs that have validate: true (default)
|
|
75
|
+
if (ref.validate === false)
|
|
76
|
+
continue;
|
|
77
|
+
// Dedupe by path (we only need to validate each file once)
|
|
78
|
+
if (!seen.has(ref.path)) {
|
|
79
|
+
seen.add(ref.path);
|
|
80
|
+
refs.push(ref);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return refs;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Validate all user module imports.
|
|
88
|
+
* Resolves paths relative to configDir and checks that exports exist.
|
|
89
|
+
*/
|
|
90
|
+
const validateUserModules = (refs, configDir) => Effect.gen(function* () {
|
|
91
|
+
if (refs.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
const parser = createUserModuleParser();
|
|
94
|
+
for (const ref of refs) {
|
|
95
|
+
const absolutePath = path.resolve(configDir, ref.path);
|
|
96
|
+
yield* parser.validateImports(absolutePath, ref);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
53
99
|
/**
|
|
54
100
|
* The main generate pipeline.
|
|
55
101
|
*
|
|
56
102
|
* Config is provided via ConfigService layer (Effect DI).
|
|
57
|
-
* Use ConfigFromFile or
|
|
103
|
+
* Use ConfigFromFile or ConfigWithFallback layers depending on context.
|
|
58
104
|
*/
|
|
59
105
|
export const generate = (options = {}) => Effect.gen(function* () {
|
|
60
|
-
// 1. Get configuration from Effect context (DI)
|
|
61
106
|
yield* Effect.logDebug("Loading configuration...");
|
|
62
107
|
const config = yield* ConfigService;
|
|
63
108
|
yield* Effect.logDebug(`Config schemas: ${config.schemas.join(", ")}`);
|
|
64
109
|
yield* Effect.logDebug(`Config plugins: ${config.plugins.length}`);
|
|
65
|
-
// 2. Introspect database
|
|
66
110
|
yield* Effect.log("Introspecting database...");
|
|
67
111
|
const dbService = yield* DatabaseIntrospectionService;
|
|
68
112
|
const introspection = yield* dbService.introspect({
|
|
69
113
|
connectionString: config.connectionString,
|
|
70
114
|
role: config.role,
|
|
71
115
|
});
|
|
72
|
-
const tables = introspection.classes.filter(
|
|
73
|
-
const views = introspection.classes.filter(
|
|
116
|
+
const tables = introspection.classes.filter(c => c.relkind === "r");
|
|
117
|
+
const views = introspection.classes.filter(c => c.relkind === "v");
|
|
74
118
|
yield* Effect.log(`Found ${tables.length} tables, ${views.length} views`);
|
|
75
119
|
if (tables.length > 0) {
|
|
76
|
-
const tableNames = tables.map(
|
|
120
|
+
const tableNames = tables.map(t => t.relname).sort();
|
|
77
121
|
yield* Effect.logDebug(`Tables: ${tableNames.join(", ")}`);
|
|
78
122
|
}
|
|
79
123
|
if (views.length > 0) {
|
|
80
|
-
const viewNames = views.map(
|
|
124
|
+
const viewNames = views.map(v => v.relname).sort();
|
|
81
125
|
yield* Effect.logDebug(`Views: ${viewNames.join(", ")}`);
|
|
82
126
|
}
|
|
83
|
-
// 3. Build IR with user's inflection config
|
|
84
127
|
yield* Effect.log("Building semantic IR...");
|
|
85
128
|
const irBuilder = createIRBuilderService();
|
|
86
|
-
// Create inflection from config (or use defaults)
|
|
87
|
-
const inflection = createInflection(config.inflection);
|
|
88
129
|
const inflectionLayer = makeInflectionLayer(config.inflection);
|
|
89
130
|
const ir = yield* irBuilder
|
|
90
131
|
.build(introspection, {
|
|
@@ -96,10 +137,7 @@ export const generate = (options = {}) => Effect.gen(function* () {
|
|
|
96
137
|
const tableEntities = getTableEntities(ir);
|
|
97
138
|
const domainEntities = getDomainEntities(ir);
|
|
98
139
|
const compositeEntities = getCompositeEntities(ir);
|
|
99
|
-
const counts = [
|
|
100
|
-
`${tableEntities.length} tables/views`,
|
|
101
|
-
`${enumEntities.length} enums`,
|
|
102
|
-
];
|
|
140
|
+
const counts = [`${tableEntities.length} tables/views`, `${enumEntities.length} enums`];
|
|
103
141
|
if (domainEntities.length > 0)
|
|
104
142
|
counts.push(`${domainEntities.length} domains`);
|
|
105
143
|
if (compositeEntities.length > 0)
|
|
@@ -110,80 +148,69 @@ export const generate = (options = {}) => Effect.gen(function* () {
|
|
|
110
148
|
yield* Effect.logDebug(`Entities: ${entityNames.join(", ")}`);
|
|
111
149
|
}
|
|
112
150
|
if (enumEntities.length > 0) {
|
|
113
|
-
const enumNames = enumEntities.map(
|
|
151
|
+
const enumNames = enumEntities.map(e => e.name).sort();
|
|
114
152
|
yield* Effect.logDebug(`Enums: ${enumNames.join(", ")}`);
|
|
115
153
|
}
|
|
116
|
-
// 4. Run providers
|
|
117
154
|
yield* Effect.log("Running plugins...");
|
|
118
|
-
// Cast plugins from config to Plugin[]
|
|
119
155
|
const plugins = config.plugins;
|
|
120
|
-
|
|
121
|
-
|
|
156
|
+
const pluginNames = plugins.map(p => p.name);
|
|
157
|
+
yield* Effect.log(`Plugins: ${pluginNames.join(", ")}`);
|
|
122
158
|
const typeHints = createTypeHintRegistry(config.typeHints ?? []);
|
|
123
|
-
const
|
|
159
|
+
const inflection = createInflection(config.inflection);
|
|
160
|
+
const pluginResult = yield* runPlugins({
|
|
161
|
+
plugins,
|
|
124
162
|
ir,
|
|
125
163
|
typeHints,
|
|
126
164
|
inflection,
|
|
165
|
+
defaultFile: config.defaultFile,
|
|
166
|
+
outputDir: config.outputDir,
|
|
167
|
+
});
|
|
168
|
+
// Validate user module imports before emitting
|
|
169
|
+
if (config.configDir) {
|
|
170
|
+
const userModuleRefs = collectUserModuleRefs(pluginResult.rendered);
|
|
171
|
+
if (userModuleRefs.length > 0) {
|
|
172
|
+
yield* Effect.logDebug(`Validating ${userModuleRefs.length} user module import(s)...`);
|
|
173
|
+
yield* validateUserModules(userModuleRefs, config.configDir).pipe(Effect.provide(NodeFileSystem.layer));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const emittedFiles = emitFiles(pluginResult, {
|
|
177
|
+
configDir: config.configDir,
|
|
178
|
+
outputDir: options.outputDir ?? config.outputDir,
|
|
127
179
|
});
|
|
128
|
-
|
|
129
|
-
yield* Effect.log(`Generated ${emissions.length} files`);
|
|
130
|
-
// 5. Write files
|
|
180
|
+
yield* Effect.log(`Generated ${emittedFiles.length} files`);
|
|
131
181
|
const outputDir = options.outputDir ?? config.outputDir;
|
|
132
182
|
yield* Effect.log(`Writing to ${outputDir}...`);
|
|
133
183
|
const writer = createFileWriter();
|
|
134
|
-
const writeResults = yield* writer.writeAll(
|
|
184
|
+
const writeResults = yield* writer.writeAll(emittedFiles, {
|
|
135
185
|
outputDir,
|
|
136
186
|
dryRun: options.dryRun ?? false,
|
|
137
187
|
});
|
|
138
|
-
// 6. Format files (if formatter provided and not dry run)
|
|
139
188
|
if (config.formatter && !options.dryRun) {
|
|
140
189
|
yield* Effect.log(`Formatting with: ${config.formatter} ${outputDir}`);
|
|
141
190
|
yield* runFormatter(config.formatter, outputDir);
|
|
142
191
|
yield* Effect.log("Formatting complete");
|
|
143
192
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const status = options.dryRun
|
|
147
|
-
? "(dry run)"
|
|
148
|
-
: result.written
|
|
149
|
-
? "✓"
|
|
150
|
-
: "–";
|
|
193
|
+
yield* Effect.forEach(writeResults, result => {
|
|
194
|
+
const status = options.dryRun ? "(dry run)" : result.written ? "✓" : "–";
|
|
151
195
|
return Effect.logDebug(`${status} ${result.path}`);
|
|
152
196
|
}, { discard: true });
|
|
153
|
-
const written = writeResults.filter(
|
|
197
|
+
const written = writeResults.filter(r => r.written).length;
|
|
154
198
|
const dryRunSuffix = options.dryRun ? " (dry run)" : "";
|
|
155
199
|
yield* Effect.log(`Wrote ${written} files${dryRunSuffix}`);
|
|
156
200
|
return {
|
|
157
201
|
config,
|
|
158
202
|
ir,
|
|
159
203
|
pluginResult,
|
|
204
|
+
emittedFiles,
|
|
160
205
|
writeResults,
|
|
161
206
|
};
|
|
162
207
|
});
|
|
163
208
|
/**
|
|
164
209
|
* Layer that provides database introspection for generate().
|
|
165
|
-
*
|
|
166
|
-
* Note: ConfigService is NOT included here - it must be provided separately
|
|
167
|
-
* via ConfigFromFile, ConfigWithInit, or ConfigTest layers.
|
|
168
210
|
*/
|
|
169
211
|
export const GenerateLive = Layer.effect(DatabaseIntrospectionService, DatabaseIntrospectionLive);
|
|
170
212
|
/**
|
|
171
213
|
* Run generate with database introspection provided.
|
|
172
|
-
*
|
|
173
|
-
* ConfigService must still be provided by the caller via one of:
|
|
174
|
-
* - ConfigFromFile (load from disk, fail if not found)
|
|
175
|
-
* - ConfigWithInit (load from disk, or run interactive init)
|
|
176
|
-
* - ConfigTest (provide config directly for testing)
|
|
177
|
-
*
|
|
178
|
-
* @example
|
|
179
|
-
* ```typescript
|
|
180
|
-
* import { ConfigFromFile } from "./services/config.js"
|
|
181
|
-
*
|
|
182
|
-
* runGenerate({ dryRun: true }).pipe(
|
|
183
|
-
* Effect.provide(ConfigFromFile()),
|
|
184
|
-
* // ... platform layers
|
|
185
|
-
* )
|
|
186
|
-
* ```
|
|
187
214
|
*/
|
|
188
215
|
export const runGenerate = (options = {}) => generate(options).pipe(Effect.provide(GenerateLive));
|
|
189
216
|
//# sourceMappingURL=generate.js.map
|
package/dist/generate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hex - Query Builder Functions
|
|
3
|
+
*
|
|
4
|
+
* Core declarative query building functions.
|
|
5
|
+
*/
|
|
6
|
+
import type { SemanticIR } from "../ir/semantic-ir.js";
|
|
7
|
+
import type { QueryDescriptor } from "../shared/query-types.js";
|
|
8
|
+
import type { SelectSpec, MutationSpec, ParamSpec } from "./types.js";
|
|
9
|
+
export declare function select(ir: SemanticIR, spec: SelectSpec): QueryDescriptor;
|
|
10
|
+
export declare function mutate(ir: SemanticIR, spec: MutationSpec): QueryDescriptor;
|
|
11
|
+
export declare function call(ir: SemanticIR, funcName: string, args: ParamSpec[]): QueryDescriptor;
|
|
12
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/hex/builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,0BAA0B,CAAC;AAClF,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAgB,MAAM,YAAY,CAAC;AAQpF,wBAAgB,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,eAAe,CAgBxE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,GAAG,eAAe,CAsB1E;AAED,wBAAgB,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,eAAe,CA4BzF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createBuilderState, buildSelectQuery, buildMutationQuery, inferReturnFields, } from "./types.js";
|
|
2
|
+
export function select(ir, spec) {
|
|
3
|
+
const state = createBuilderState(ir);
|
|
4
|
+
const sql = buildSelectQuery(state, spec);
|
|
5
|
+
const returns = {
|
|
6
|
+
mode: "many",
|
|
7
|
+
fields: inferReturnFields(state, spec.selects),
|
|
8
|
+
};
|
|
9
|
+
return {
|
|
10
|
+
name: "",
|
|
11
|
+
entityName: "",
|
|
12
|
+
operation: "select",
|
|
13
|
+
sql,
|
|
14
|
+
params: state.params,
|
|
15
|
+
returns,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function mutate(ir, spec) {
|
|
19
|
+
const state = createBuilderState(ir);
|
|
20
|
+
const sql = buildMutationQuery(state, spec);
|
|
21
|
+
const operation = spec.kind === "insert" ? "insert"
|
|
22
|
+
: spec.kind === "update" ? "update"
|
|
23
|
+
: spec.kind === "delete" ? "delete"
|
|
24
|
+
: "upsert";
|
|
25
|
+
const returns = {
|
|
26
|
+
mode: spec.returning ? "many" : "void",
|
|
27
|
+
fields: spec.returning ? inferReturnFields(state, spec.returning) : [],
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
name: "",
|
|
31
|
+
entityName: "",
|
|
32
|
+
operation,
|
|
33
|
+
sql,
|
|
34
|
+
params: state.params,
|
|
35
|
+
returns,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function call(ir, funcName, args) {
|
|
39
|
+
const state = createBuilderState(ir);
|
|
40
|
+
const placeholders = args.map(arg => {
|
|
41
|
+
const placeholder = `$${state.params.length + 1}`;
|
|
42
|
+
state.params.push({
|
|
43
|
+
name: arg.name,
|
|
44
|
+
pgType: arg.pgType,
|
|
45
|
+
tsType: arg.tsType ?? "unknown",
|
|
46
|
+
nullable: arg.nullable ?? false,
|
|
47
|
+
});
|
|
48
|
+
return placeholder;
|
|
49
|
+
});
|
|
50
|
+
const sql = `SELECT ${funcName}(${placeholders.join(", ")})`;
|
|
51
|
+
const returns = {
|
|
52
|
+
mode: "oneOrNone",
|
|
53
|
+
fields: [],
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
name: "",
|
|
57
|
+
entityName: "",
|
|
58
|
+
operation: "select",
|
|
59
|
+
sql,
|
|
60
|
+
params: state.params,
|
|
61
|
+
returns,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/hex/builder.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,MAAM,CAAC,EAAc,EAAE,IAAgB;IACrD,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAqB;QAChC,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;KAC/C,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,QAAQ;QACnB,GAAG;QACH,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EAAc,EAAE,IAAkB;IACvD,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE5C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ;QACjD,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ;YACnC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ;gBACnC,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,OAAO,GAAqB;QAChC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACtC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;KACvE,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,EAAE;QACd,SAAS;QACT,GAAG;QACH,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,EAAc,EAAE,QAAgB,EAAE,IAAiB;IACtE,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAErC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QAClC,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;YAC/B,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,KAAK;SAChC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,UAAU,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7D,MAAM,OAAO,GAAqB;QAChC,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,QAAQ;QACnB,GAAG;QACH,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hex - DDL Query Builder
|
|
3
|
+
*
|
|
4
|
+
* Declarative query builder for DDL statements (CREATE TABLE, ALTER TABLE, etc.).
|
|
5
|
+
* Integrates with SemanticIR for type-aware schema generation.
|
|
6
|
+
*/
|
|
7
|
+
import type { SemanticIR } from "../ir/semantic-ir.js";
|
|
8
|
+
import type { CreateTableSpec, AlterTableSpec, IndexSpec, ForeignKeySpec, DropSpec } from "./types.js";
|
|
9
|
+
export { IndexMethod } from "./types.js";
|
|
10
|
+
export declare function createTable(_ir: SemanticIR, spec: CreateTableSpec): string;
|
|
11
|
+
export declare function createIndex(_ir: SemanticIR, tableName: string, index: IndexSpec, options?: {
|
|
12
|
+
concurrently?: boolean;
|
|
13
|
+
ifNotExists?: boolean;
|
|
14
|
+
schema?: string;
|
|
15
|
+
}): string;
|
|
16
|
+
export declare function createPrimaryKeyIndex(_ir: SemanticIR, tableName: string, columns: string[], indexName: string, options?: {
|
|
17
|
+
concurrently?: boolean;
|
|
18
|
+
schema?: string;
|
|
19
|
+
}): string;
|
|
20
|
+
export declare function addForeignKey(_ir: SemanticIR, tableName: string, foreignKey: ForeignKeySpec, options?: {
|
|
21
|
+
schema?: string;
|
|
22
|
+
}): string;
|
|
23
|
+
export declare function dropForeignKey(_ir: SemanticIR, tableName: string, constraintName: string, options?: {
|
|
24
|
+
schema?: string;
|
|
25
|
+
ifExists?: boolean;
|
|
26
|
+
cascade?: boolean;
|
|
27
|
+
}): string;
|
|
28
|
+
export declare function dropIndex(indexName: string, options?: {
|
|
29
|
+
ifExists?: boolean;
|
|
30
|
+
cascade?: boolean;
|
|
31
|
+
concurrently?: boolean;
|
|
32
|
+
}): string;
|
|
33
|
+
export declare function dropTable(tableName: string, options?: {
|
|
34
|
+
schema?: string;
|
|
35
|
+
ifExists?: boolean;
|
|
36
|
+
cascade?: boolean;
|
|
37
|
+
}): string;
|
|
38
|
+
export declare function alterTable(_ir: SemanticIR, spec: AlterTableSpec): string;
|
|
39
|
+
export declare function drop(spec: DropSpec): string;
|
|
40
|
+
export declare function renameTable(oldName: string, newName: string, options?: {
|
|
41
|
+
schema?: string;
|
|
42
|
+
}): string;
|
|
43
|
+
export declare function renameColumn(tableName: string, oldColumn: string, newColumn: string, options?: {
|
|
44
|
+
schema?: string;
|
|
45
|
+
}): string;
|
|
46
|
+
export declare function renameConstraint(tableName: string, oldConstraint: string, newConstraint: string, options?: {
|
|
47
|
+
schema?: string;
|
|
48
|
+
}): string;
|
|
49
|
+
export declare function setSchema(objectName: string, newSchema: string, options?: {
|
|
50
|
+
schema?: string;
|
|
51
|
+
cascade?: boolean;
|
|
52
|
+
}): string;
|
|
53
|
+
//# sourceMappingURL=ddl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ddl.d.ts","sourceRoot":"","sources":["../../src/hex/ddl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,SAAS,EACT,cAAc,EACd,QAAQ,EAGT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAmHzC,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CA+C1E;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/E,MAAM,CAQR;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,MAAM,CAQR;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAMvI;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAQ3K;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAMpI;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAQ7H;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAwDxE;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAuC3C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CASvG;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAM/H;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAM3I;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAK7H"}
|