@danielfgray/pg-sourcerer 0.3.0 → 0.4.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-utils.js","sourceRoot":"","sources":["../../src/lib/field-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"field-utils.js","sourceRoot":"","sources":["../../src/lib/field-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { SemanticIR, TableEntity, IndexDef } from "../ir/semantic-ir.js";
|
|
2
|
+
/**
|
|
3
|
+
* Direction of a join edge - which side has the FK
|
|
4
|
+
*/
|
|
5
|
+
export type JoinDirection = "forward" | "reverse";
|
|
6
|
+
/**
|
|
7
|
+
* A joinable edge in the graph - represents one way to join two tables
|
|
8
|
+
*/
|
|
9
|
+
export interface JoinEdge {
|
|
10
|
+
/** Target entity name (what we're joining TO) */
|
|
11
|
+
readonly targetEntity: string;
|
|
12
|
+
/** Direction: forward = we have FK, reverse = they have FK to us */
|
|
13
|
+
readonly direction: JoinDirection;
|
|
14
|
+
/** Cardinality: many-to-one or one-to-many */
|
|
15
|
+
readonly cardinality: "many-to-one" | "one-to-many" | "one-to-one";
|
|
16
|
+
/** Original constraint name (for debugging) */
|
|
17
|
+
readonly constraintName: string;
|
|
18
|
+
/** Column mappings for the join condition */
|
|
19
|
+
readonly columns: readonly {
|
|
20
|
+
readonly local: string;
|
|
21
|
+
readonly foreign: string;
|
|
22
|
+
}[];
|
|
23
|
+
/** Suggested alias based on relationship semantics */
|
|
24
|
+
readonly suggestedAlias?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Join path - a sequence of edges from source to destination
|
|
28
|
+
*/
|
|
29
|
+
export interface JoinPath {
|
|
30
|
+
/** Starting entity */
|
|
31
|
+
readonly from: string;
|
|
32
|
+
/** Sequence of edges to traverse */
|
|
33
|
+
readonly edges: readonly JoinEdge[];
|
|
34
|
+
/** Table aliases for each step (including start) */
|
|
35
|
+
readonly aliases: readonly string[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Index info for filter suggestions
|
|
39
|
+
*/
|
|
40
|
+
export interface FilterableIndex {
|
|
41
|
+
readonly entityName: string;
|
|
42
|
+
readonly columns: readonly string[];
|
|
43
|
+
readonly isUnique: boolean;
|
|
44
|
+
readonly isPartial: boolean;
|
|
45
|
+
readonly method: IndexDef["method"];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Suggested foreign key based on naming patterns and type analysis
|
|
49
|
+
*/
|
|
50
|
+
export interface ForeignKeySuggestion {
|
|
51
|
+
/** Column name that could be a foreign key */
|
|
52
|
+
readonly column: string;
|
|
53
|
+
/** Suggested target table name */
|
|
54
|
+
readonly targetTable: string;
|
|
55
|
+
/** Suggested target column (typically the PK) */
|
|
56
|
+
readonly targetColumn: string;
|
|
57
|
+
/** Confidence level based on heuristics */
|
|
58
|
+
readonly confidence: "high" | "medium" | "low";
|
|
59
|
+
/** Reason for the suggestion */
|
|
60
|
+
readonly reason: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The JoinGraph provides navigation APIs for building queries
|
|
64
|
+
*/
|
|
65
|
+
export interface JoinGraph {
|
|
66
|
+
/** Get all entities in the graph */
|
|
67
|
+
readonly entities: ReadonlyMap<string, TableEntity>;
|
|
68
|
+
/** Get joinable edges from an entity */
|
|
69
|
+
readonly getEdges: (entityName: string) => readonly JoinEdge[];
|
|
70
|
+
/** Get a specific entity */
|
|
71
|
+
readonly getEntity: (name: string) => TableEntity | undefined;
|
|
72
|
+
/** Find shortest path between two entities (BFS) */
|
|
73
|
+
readonly findPath: (from: string, to: string) => JoinPath | undefined;
|
|
74
|
+
/** Get all reachable entities from a starting point */
|
|
75
|
+
readonly getReachable: (from: string, maxDepth?: number) => ReadonlySet<string>;
|
|
76
|
+
/** Get indexes that could be used for filtering on an entity */
|
|
77
|
+
readonly getFilterableIndexes: (entityName: string) => readonly FilterableIndex[];
|
|
78
|
+
/** Suggest foreign keys based on column naming and type patterns */
|
|
79
|
+
readonly suggestForeignKeys: (entityName: string) => readonly ForeignKeySuggestion[];
|
|
80
|
+
/** Generate SQL JOIN clause from a path */
|
|
81
|
+
readonly toJoinClause: (path: JoinPath) => string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Create a JoinGraph from SemanticIR
|
|
85
|
+
*/
|
|
86
|
+
export declare function createJoinGraph(ir: SemanticIR): JoinGraph;
|
|
87
|
+
/**
|
|
88
|
+
* Format an edge for display in picker
|
|
89
|
+
*/
|
|
90
|
+
export declare function formatEdge(edge: JoinEdge): string;
|
|
91
|
+
/**
|
|
92
|
+
* Format edge with more detail
|
|
93
|
+
*/
|
|
94
|
+
export declare function formatEdgeDetail(edge: JoinEdge): string;
|
|
95
|
+
//# sourceMappingURL=join-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-graph.d.ts","sourceRoot":"","sources":["../../src/lib/join-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { isTableEntity, getAllRelations } from "../ir/semantic-ir.js";
|
|
2
|
+
import { inflect } from "../services/inflection.js";
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Implementation
|
|
5
|
+
// =============================================================================
|
|
6
|
+
/**
|
|
7
|
+
* Build edge from a forward (belongsTo) relation
|
|
8
|
+
*/
|
|
9
|
+
function edgeFromBelongsTo(rel) {
|
|
10
|
+
return {
|
|
11
|
+
targetEntity: rel.targetEntity,
|
|
12
|
+
direction: "forward",
|
|
13
|
+
cardinality: "many-to-one",
|
|
14
|
+
constraintName: rel.constraintName,
|
|
15
|
+
columns: rel.columns,
|
|
16
|
+
suggestedAlias: inferAliasFromConstraint(rel.constraintName, rel.targetEntity),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build edge from a reverse (hasMany) relation
|
|
21
|
+
*/
|
|
22
|
+
function edgeFromHasMany(rel) {
|
|
23
|
+
return {
|
|
24
|
+
targetEntity: rel.sourceEntity,
|
|
25
|
+
direction: "reverse",
|
|
26
|
+
cardinality: rel.kind === "hasOne" ? "one-to-one" : "one-to-many",
|
|
27
|
+
constraintName: rel.constraintName,
|
|
28
|
+
columns: rel.columns,
|
|
29
|
+
suggestedAlias: inferAliasFromConstraint(rel.constraintName, rel.sourceEntity),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Infer a reasonable alias from constraint name or target
|
|
34
|
+
*/
|
|
35
|
+
function inferAliasFromConstraint(constraintName, targetEntity) {
|
|
36
|
+
// Extract meaningful part from constraint name like "posts_user_id_fkey"
|
|
37
|
+
// We want something short and meaningful
|
|
38
|
+
const parts = constraintName.replace(/_fkey$/, "").split("_");
|
|
39
|
+
// If constraint has a meaningful relationship hint, use it
|
|
40
|
+
// e.g., "comments_parent_id_fkey" -> could suggest "parent"
|
|
41
|
+
const targetLower = targetEntity.toLowerCase();
|
|
42
|
+
const hintPart = parts.find(p => p !== targetLower && p.length > 2 && !["id", "idx", "key"].includes(p));
|
|
43
|
+
if (hintPart && hintPart !== parts[0]) {
|
|
44
|
+
return hintPart;
|
|
45
|
+
}
|
|
46
|
+
// Fall back to lowercase target entity
|
|
47
|
+
return targetEntity.charAt(0).toLowerCase() + targetEntity.slice(1);
|
|
48
|
+
}
|
|
49
|
+
function analyzeColumnForFk(entityName, columnName, columnType, entities) {
|
|
50
|
+
const colLower = columnName.toLowerCase();
|
|
51
|
+
for (const [targetName, targetEntity] of entities) {
|
|
52
|
+
if (targetName === entityName)
|
|
53
|
+
continue;
|
|
54
|
+
if (!isTableEntity(targetEntity))
|
|
55
|
+
continue;
|
|
56
|
+
const targetLower = targetName.toLowerCase();
|
|
57
|
+
const targetPk = targetEntity.primaryKey;
|
|
58
|
+
const targetPkColumn = targetPk?.columns[0];
|
|
59
|
+
if (!targetPkColumn)
|
|
60
|
+
continue;
|
|
61
|
+
const targetField = targetEntity.shapes.row.fields.find(f => f.columnName === targetPkColumn);
|
|
62
|
+
const targetType = targetField?.pgAttribute.getType()?.typname;
|
|
63
|
+
const idSuffixes = ["_id", "_ids", "id", "_by", "_at"];
|
|
64
|
+
const isLikelyFkColumn = idSuffixes.some(suffix => colLower.endsWith(suffix)) || colLower.includes("_ref_");
|
|
65
|
+
if (!isLikelyFkColumn)
|
|
66
|
+
continue;
|
|
67
|
+
const singularTarget = inflect.singularize(targetLower);
|
|
68
|
+
const pluralTarget = inflect.pluralize(targetLower);
|
|
69
|
+
const possibleTargets = [targetLower, singularTarget, pluralTarget, targetName];
|
|
70
|
+
const matchingTarget = possibleTargets.find(t => {
|
|
71
|
+
const patterns = [
|
|
72
|
+
`${t}_id`,
|
|
73
|
+
`${t}id`,
|
|
74
|
+
`${t}_ids`,
|
|
75
|
+
`${t}_by`,
|
|
76
|
+
`${t}_at`,
|
|
77
|
+
`ref_${t}`,
|
|
78
|
+
];
|
|
79
|
+
return patterns.some(p => colLower === p || colLower.endsWith(`_${p}`));
|
|
80
|
+
});
|
|
81
|
+
if (!matchingTarget)
|
|
82
|
+
continue;
|
|
83
|
+
if (columnType && targetType && !typesMatch(columnType, targetType)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const targetFieldForColumn = targetEntity.shapes.row.fields.find(f => f.columnName === targetPkColumn);
|
|
87
|
+
const confidence = determineConfidence(columnName, targetName, columnType, targetType, targetFieldForColumn);
|
|
88
|
+
return {
|
|
89
|
+
column: columnName,
|
|
90
|
+
targetTable: targetName,
|
|
91
|
+
targetColumn: targetPkColumn,
|
|
92
|
+
confidence,
|
|
93
|
+
reason: confidence === "high"
|
|
94
|
+
? `Column "${columnName}" matches ${targetName}.${targetPkColumn} by naming convention`
|
|
95
|
+
: `Column "${columnName}" may reference ${targetName}.${targetPkColumn}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
// Manual singularize/pluralize removed - now using inflect helpers from inflection service
|
|
101
|
+
function typesMatch(colType, targetType) {
|
|
102
|
+
if (colType === targetType)
|
|
103
|
+
return true;
|
|
104
|
+
const intTypes = new Set(["int2", "int4", "int8", "serial", "bigserial"]);
|
|
105
|
+
const uuidTypes = new Set(["uuid", "char", "bpchar"]);
|
|
106
|
+
const textTypes = new Set(["text", "varchar", "char"]);
|
|
107
|
+
if (intTypes.has(colType) && intTypes.has(targetType))
|
|
108
|
+
return true;
|
|
109
|
+
if (uuidTypes.has(colType) && uuidTypes.has(targetType))
|
|
110
|
+
return true;
|
|
111
|
+
if (textTypes.has(colType) && textTypes.has(targetType))
|
|
112
|
+
return true;
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
function determineConfidence(columnName, targetName, columnType, targetType, targetField) {
|
|
116
|
+
const colLower = columnName.toLowerCase();
|
|
117
|
+
const targetLower = targetName.toLowerCase();
|
|
118
|
+
const singularTarget = inflect.singularize(targetLower);
|
|
119
|
+
const exactMatch = colLower === `${targetLower}_id` || colLower === `${singularTarget}_id`;
|
|
120
|
+
const typeMatch = columnType && targetType && typesMatch(columnType, targetType);
|
|
121
|
+
const nonNullable = targetField && !targetField.nullable;
|
|
122
|
+
if (exactMatch && typeMatch) {
|
|
123
|
+
return nonNullable ? "high" : "medium";
|
|
124
|
+
}
|
|
125
|
+
if (exactMatch || (typeMatch && colLower.includes(targetLower))) {
|
|
126
|
+
return "medium";
|
|
127
|
+
}
|
|
128
|
+
return "low";
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a JoinGraph from SemanticIR
|
|
132
|
+
*/
|
|
133
|
+
export function createJoinGraph(ir) {
|
|
134
|
+
// Build entity map (tables/views only)
|
|
135
|
+
const entities = new Map();
|
|
136
|
+
for (const [name, entity] of ir.entities) {
|
|
137
|
+
if (isTableEntity(entity)) {
|
|
138
|
+
entities.set(name, entity);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Pre-compute edges for each entity
|
|
142
|
+
const edgeCache = new Map();
|
|
143
|
+
const getEdges = (entityName) => {
|
|
144
|
+
const cached = edgeCache.get(entityName);
|
|
145
|
+
if (cached)
|
|
146
|
+
return cached;
|
|
147
|
+
const rels = getAllRelations(ir, entityName);
|
|
148
|
+
if (!rels)
|
|
149
|
+
return [];
|
|
150
|
+
const edges = [
|
|
151
|
+
...rels.belongsTo.map(edgeFromBelongsTo),
|
|
152
|
+
...rels.hasMany.map(edgeFromHasMany),
|
|
153
|
+
];
|
|
154
|
+
edgeCache.set(entityName, edges);
|
|
155
|
+
return edges;
|
|
156
|
+
};
|
|
157
|
+
const getEntity = (name) => entities.get(name);
|
|
158
|
+
// BFS to find shortest path
|
|
159
|
+
const findPath = (from, to) => {
|
|
160
|
+
if (from === to) {
|
|
161
|
+
return { from, edges: [], aliases: [from] };
|
|
162
|
+
}
|
|
163
|
+
if (!entities.has(from) || !entities.has(to)) {
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
const visited = new Set([from]);
|
|
167
|
+
const queue = [
|
|
168
|
+
{ entity: from, path: [], aliases: [from.toLowerCase()] },
|
|
169
|
+
];
|
|
170
|
+
while (queue.length > 0) {
|
|
171
|
+
const current = queue.shift();
|
|
172
|
+
const edges = getEdges(current.entity);
|
|
173
|
+
for (const edge of edges) {
|
|
174
|
+
if (visited.has(edge.targetEntity))
|
|
175
|
+
continue;
|
|
176
|
+
const newPath = [...current.path, edge];
|
|
177
|
+
const newAliases = [...current.aliases, edge.suggestedAlias ?? edge.targetEntity.toLowerCase()];
|
|
178
|
+
if (edge.targetEntity === to) {
|
|
179
|
+
return { from, edges: newPath, aliases: newAliases };
|
|
180
|
+
}
|
|
181
|
+
visited.add(edge.targetEntity);
|
|
182
|
+
queue.push({ entity: edge.targetEntity, path: newPath, aliases: newAliases });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return undefined;
|
|
186
|
+
};
|
|
187
|
+
// Get all reachable entities via BFS
|
|
188
|
+
const getReachable = (from, maxDepth = Infinity) => {
|
|
189
|
+
const result = new Set();
|
|
190
|
+
const visited = new Set([from]);
|
|
191
|
+
const queue = [{ entity: from, depth: 0 }];
|
|
192
|
+
while (queue.length > 0) {
|
|
193
|
+
const { entity, depth } = queue.shift();
|
|
194
|
+
result.add(entity);
|
|
195
|
+
if (depth >= maxDepth)
|
|
196
|
+
continue;
|
|
197
|
+
for (const edge of getEdges(entity)) {
|
|
198
|
+
if (!visited.has(edge.targetEntity)) {
|
|
199
|
+
visited.add(edge.targetEntity);
|
|
200
|
+
queue.push({ entity: edge.targetEntity, depth: depth + 1 });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return result;
|
|
205
|
+
};
|
|
206
|
+
// Get indexes useful for filtering
|
|
207
|
+
const getFilterableIndexes = (entityName) => {
|
|
208
|
+
const entity = entities.get(entityName);
|
|
209
|
+
if (!entity)
|
|
210
|
+
return [];
|
|
211
|
+
return entity.indexes.map(idx => ({
|
|
212
|
+
entityName,
|
|
213
|
+
columns: idx.columns,
|
|
214
|
+
isUnique: idx.isUnique,
|
|
215
|
+
isPartial: idx.isPartial,
|
|
216
|
+
method: idx.method,
|
|
217
|
+
}));
|
|
218
|
+
};
|
|
219
|
+
// Generate SQL JOIN clause
|
|
220
|
+
const toJoinClause = (path) => {
|
|
221
|
+
if (path.edges.length === 0) {
|
|
222
|
+
return `FROM ${entities.get(path.from)?.pgName ?? path.from} AS ${path.aliases[0]}`;
|
|
223
|
+
}
|
|
224
|
+
const clauses = [];
|
|
225
|
+
const startEntity = entities.get(path.from);
|
|
226
|
+
clauses.push(`FROM ${startEntity?.pgName ?? path.from} AS ${path.aliases[0]}`);
|
|
227
|
+
for (let i = 0; i < path.edges.length; i++) {
|
|
228
|
+
const edge = path.edges[i];
|
|
229
|
+
const alias = path.aliases[i + 1];
|
|
230
|
+
const prevAlias = path.aliases[i];
|
|
231
|
+
const targetEntity = entities.get(edge.targetEntity);
|
|
232
|
+
const tableName = targetEntity?.pgName ?? edge.targetEntity;
|
|
233
|
+
// Build ON clause
|
|
234
|
+
const onConditions = edge.columns.map(col => {
|
|
235
|
+
if (edge.direction === "forward") {
|
|
236
|
+
// We have the FK: our local column matches their foreign column
|
|
237
|
+
return `${prevAlias}.${col.local} = ${alias}.${col.foreign}`;
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
// They have FK to us: their foreign column matches our local column
|
|
241
|
+
return `${alias}.${col.foreign} = ${prevAlias}.${col.local}`;
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
// Use LEFT JOIN for one-to-many (reverse) to not filter out rows without children
|
|
245
|
+
const joinType = edge.direction === "reverse" ? "LEFT JOIN" : "JOIN";
|
|
246
|
+
clauses.push(`${joinType} ${tableName} AS ${alias} ON ${onConditions.join(" AND ")}`);
|
|
247
|
+
}
|
|
248
|
+
return clauses.join("\n ");
|
|
249
|
+
};
|
|
250
|
+
const suggestForeignKeys = (entityName) => {
|
|
251
|
+
const entity = entities.get(entityName);
|
|
252
|
+
if (!entity)
|
|
253
|
+
return [];
|
|
254
|
+
const suggestions = [];
|
|
255
|
+
const existingFkColumns = new Set();
|
|
256
|
+
for (const rel of entity.relations) {
|
|
257
|
+
if (rel.kind === "belongsTo") {
|
|
258
|
+
for (const col of rel.columns) {
|
|
259
|
+
existingFkColumns.add(col.local);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
for (const field of entity.shapes.row.fields) {
|
|
264
|
+
if (existingFkColumns.has(field.columnName))
|
|
265
|
+
continue;
|
|
266
|
+
const suggestion = analyzeColumnForFk(entityName, field.columnName, field.pgAttribute.getType()?.typname, entities);
|
|
267
|
+
if (suggestion) {
|
|
268
|
+
suggestions.push(suggestion);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return suggestions.sort((a, b) => {
|
|
272
|
+
const confidenceOrder = { high: 0, medium: 1, low: 2 };
|
|
273
|
+
return confidenceOrder[a.confidence] - confidenceOrder[b.confidence];
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
return {
|
|
277
|
+
entities,
|
|
278
|
+
getEdges,
|
|
279
|
+
getEntity,
|
|
280
|
+
findPath,
|
|
281
|
+
getReachable,
|
|
282
|
+
getFilterableIndexes,
|
|
283
|
+
suggestForeignKeys,
|
|
284
|
+
toJoinClause,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
// =============================================================================
|
|
288
|
+
// Formatting utilities for TUI
|
|
289
|
+
// =============================================================================
|
|
290
|
+
/**
|
|
291
|
+
* Format an edge for display in picker
|
|
292
|
+
*/
|
|
293
|
+
export function formatEdge(edge) {
|
|
294
|
+
const arrow = edge.direction === "forward" ? "->" : "<-";
|
|
295
|
+
const cardinality = edge.cardinality === "one-to-many" ? "[*]" : "[1]";
|
|
296
|
+
return `${arrow} ${edge.targetEntity} ${cardinality}`;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Format edge with more detail
|
|
300
|
+
*/
|
|
301
|
+
export function formatEdgeDetail(edge) {
|
|
302
|
+
const cols = edge.columns.map(c => `${c.local} = ${c.foreign}`).join(", ");
|
|
303
|
+
return `via ${edge.constraintName} (${cols})`;
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=join-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-graph.js","sourceRoot":"","sources":["../../src/lib/join-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { BoxRenderable, InputRenderable, SelectRenderable, TextRenderable, type BoxOptions, type InputRenderableOptions, type SelectRenderableOptions, type CliRenderer, type RenderContext, type StyledText } from "@opentui/core";
|
|
2
|
+
interface RequiredBaseRow {
|
|
3
|
+
label: string;
|
|
4
|
+
id?: string | number;
|
|
5
|
+
description?: string;
|
|
6
|
+
}
|
|
7
|
+
interface RowListProps<T extends RequiredBaseRow> {
|
|
8
|
+
rows: T[];
|
|
9
|
+
filterPlaceholder?: string;
|
|
10
|
+
focused?: "input" | "list";
|
|
11
|
+
wrapSelection?: boolean;
|
|
12
|
+
showDescription?: boolean;
|
|
13
|
+
fastScrollStep?: number;
|
|
14
|
+
preview?: PreviewOptions<T>;
|
|
15
|
+
colors?: {
|
|
16
|
+
input?: Partial<Pick<InputRenderableOptions, "backgroundColor" | "textColor" | "focusedBackgroundColor" | "focusedTextColor" | "placeholderColor" | "cursorColor">>;
|
|
17
|
+
select?: Partial<Pick<SelectRenderableOptions, "backgroundColor" | "textColor" | "focusedBackgroundColor" | "focusedTextColor" | "selectedBackgroundColor" | "selectedTextColor" | "descriptionColor" | "selectedDescriptionColor" | "itemSpacing" | "fastScrollStep">>;
|
|
18
|
+
preview?: {
|
|
19
|
+
backgroundColor?: string;
|
|
20
|
+
textColor?: string;
|
|
21
|
+
borderColor?: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
style?: {
|
|
25
|
+
container?: Partial<BoxOptions>;
|
|
26
|
+
filter?: Partial<InputRenderableOptions>;
|
|
27
|
+
list?: Partial<SelectRenderableOptions>;
|
|
28
|
+
};
|
|
29
|
+
onSelect: (rows: T[], indices: number[]) => void;
|
|
30
|
+
}
|
|
31
|
+
interface RowListInstance<T extends RequiredBaseRow> {
|
|
32
|
+
container: BoxRenderable;
|
|
33
|
+
input: InputRenderable;
|
|
34
|
+
list: SelectRenderable;
|
|
35
|
+
previewBox?: BoxRenderable;
|
|
36
|
+
previewText?: TextRenderable;
|
|
37
|
+
setRows: (rows: T[]) => void;
|
|
38
|
+
focus: (which: "input" | "list") => void;
|
|
39
|
+
destroy: () => void;
|
|
40
|
+
getSelectedRows: () => T[];
|
|
41
|
+
clearSelection: () => void;
|
|
42
|
+
updatePreview: (row: T | undefined) => void;
|
|
43
|
+
}
|
|
44
|
+
type PreviewPosition = "right" | "bottom" | "none";
|
|
45
|
+
export interface PreviewOptions<T> {
|
|
46
|
+
position?: PreviewPosition;
|
|
47
|
+
width?: number | `${number}%`;
|
|
48
|
+
height?: number | `${number}%`;
|
|
49
|
+
title?: string;
|
|
50
|
+
onPreview?: (row: T, SelectedRows: T[]) => string | StyledText | undefined;
|
|
51
|
+
}
|
|
52
|
+
export interface PickerOptions<T extends RequiredBaseRow> {
|
|
53
|
+
filterPlaceholder?: string;
|
|
54
|
+
preview?: PreviewOptions<T>;
|
|
55
|
+
}
|
|
56
|
+
declare function createRowList<T extends RequiredBaseRow>(ctx: CliRenderer | RenderContext, { rows, filterPlaceholder, focused, wrapSelection, showDescription, fastScrollStep, preview, colors, style, onSelect, }: RowListProps<T>): RowListInstance<T>;
|
|
57
|
+
export declare function picker<T extends RequiredBaseRow>(rows: T[], options?: PickerOptions<T>): Promise<null | T[]>;
|
|
58
|
+
export { createRowList };
|
|
59
|
+
export type { RowListProps, RowListInstance };
|
|
60
|
+
//# sourceMappingURL=picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../../src/lib/picker.ts"],"names":[],"mappings":"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"}
|