@danielfgray/pg-sourcerer 0.1.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/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +104 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +133 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +129 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/generate.d.ts +75 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +183 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +4 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +229 -0
- package/dist/init.js.map +1 -0
- package/dist/ir/index.d.ts +7 -0
- package/dist/ir/index.d.ts.map +1 -0
- package/dist/ir/index.js +7 -0
- package/dist/ir/index.js.map +1 -0
- package/dist/ir/relation-graph.d.ts +113 -0
- package/dist/ir/relation-graph.d.ts.map +1 -0
- package/dist/ir/relation-graph.js +232 -0
- package/dist/ir/relation-graph.js.map +1 -0
- package/dist/ir/semantic-ir.d.ts +448 -0
- package/dist/ir/semantic-ir.d.ts.map +1 -0
- package/dist/ir/semantic-ir.js +138 -0
- package/dist/ir/semantic-ir.js.map +1 -0
- package/dist/ir/smart-tags.d.ts +24 -0
- package/dist/ir/smart-tags.d.ts.map +1 -0
- package/dist/ir/smart-tags.js +30 -0
- package/dist/ir/smart-tags.js.map +1 -0
- package/dist/lib/conjure.d.ts +431 -0
- package/dist/lib/conjure.d.ts.map +1 -0
- package/dist/lib/conjure.js +697 -0
- package/dist/lib/conjure.js.map +1 -0
- package/dist/lib/field-utils.d.ts +61 -0
- package/dist/lib/field-utils.d.ts.map +1 -0
- package/dist/lib/field-utils.js +132 -0
- package/dist/lib/field-utils.js.map +1 -0
- package/dist/lib/hex.d.ts +117 -0
- package/dist/lib/hex.d.ts.map +1 -0
- package/dist/lib/hex.js +185 -0
- package/dist/lib/hex.js.map +1 -0
- package/dist/plugins/arktype.d.ts +11 -0
- package/dist/plugins/arktype.d.ts.map +1 -0
- package/dist/plugins/arktype.js +207 -0
- package/dist/plugins/arktype.js.map +1 -0
- package/dist/plugins/effect-model.d.ts +10 -0
- package/dist/plugins/effect-model.d.ts.map +1 -0
- package/dist/plugins/effect-model.js +261 -0
- package/dist/plugins/effect-model.js.map +1 -0
- package/dist/plugins/kysely-queries.d.ts +7 -0
- package/dist/plugins/kysely-queries.d.ts.map +1 -0
- package/dist/plugins/kysely-queries.js +380 -0
- package/dist/plugins/kysely-queries.js.map +1 -0
- package/dist/plugins/sql-queries.d.ts +6 -0
- package/dist/plugins/sql-queries.d.ts.map +1 -0
- package/dist/plugins/sql-queries.js +249 -0
- package/dist/plugins/sql-queries.js.map +1 -0
- package/dist/plugins/types.d.ts +18 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +263 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/plugins/zod.d.ts +11 -0
- package/dist/plugins/zod.d.ts.map +1 -0
- package/dist/plugins/zod.js +180 -0
- package/dist/plugins/zod.js.map +1 -0
- package/dist/services/artifact-store.d.ts +55 -0
- package/dist/services/artifact-store.d.ts.map +1 -0
- package/dist/services/artifact-store.js +51 -0
- package/dist/services/artifact-store.js.map +1 -0
- package/dist/services/config-loader.d.ts +45 -0
- package/dist/services/config-loader.d.ts.map +1 -0
- package/dist/services/config-loader.js +113 -0
- package/dist/services/config-loader.js.map +1 -0
- package/dist/services/emissions.d.ts +89 -0
- package/dist/services/emissions.d.ts.map +1 -0
- package/dist/services/emissions.js +194 -0
- package/dist/services/emissions.js.map +1 -0
- package/dist/services/file-builder.d.ts +81 -0
- package/dist/services/file-builder.d.ts.map +1 -0
- package/dist/services/file-builder.js +112 -0
- package/dist/services/file-builder.js.map +1 -0
- package/dist/services/file-writer.d.ts +57 -0
- package/dist/services/file-writer.d.ts.map +1 -0
- package/dist/services/file-writer.js +76 -0
- package/dist/services/file-writer.js.map +1 -0
- package/dist/services/inflection.d.ts +227 -0
- package/dist/services/inflection.d.ts.map +1 -0
- package/dist/services/inflection.js +350 -0
- package/dist/services/inflection.js.map +1 -0
- package/dist/services/introspection.d.ts +46 -0
- package/dist/services/introspection.d.ts.map +1 -0
- package/dist/services/introspection.js +99 -0
- package/dist/services/introspection.js.map +1 -0
- package/dist/services/ir-builder.d.ts +46 -0
- package/dist/services/ir-builder.d.ts.map +1 -0
- package/dist/services/ir-builder.js +923 -0
- package/dist/services/ir-builder.js.map +1 -0
- package/dist/services/ir.d.ts +28 -0
- package/dist/services/ir.d.ts.map +1 -0
- package/dist/services/ir.js +25 -0
- package/dist/services/ir.js.map +1 -0
- package/dist/services/pg-types.d.ts +197 -0
- package/dist/services/pg-types.d.ts.map +1 -0
- package/dist/services/pg-types.js +274 -0
- package/dist/services/pg-types.js.map +1 -0
- package/dist/services/plugin-meta.d.ts +33 -0
- package/dist/services/plugin-meta.d.ts.map +1 -0
- package/dist/services/plugin-meta.js +24 -0
- package/dist/services/plugin-meta.js.map +1 -0
- package/dist/services/plugin-runner.d.ts +52 -0
- package/dist/services/plugin-runner.d.ts.map +1 -0
- package/dist/services/plugin-runner.js +182 -0
- package/dist/services/plugin-runner.js.map +1 -0
- package/dist/services/plugin.d.ts +286 -0
- package/dist/services/plugin.d.ts.map +1 -0
- package/dist/services/plugin.js +132 -0
- package/dist/services/plugin.js.map +1 -0
- package/dist/services/smart-tags-parser.d.ts +37 -0
- package/dist/services/smart-tags-parser.d.ts.map +1 -0
- package/dist/services/smart-tags-parser.js +79 -0
- package/dist/services/smart-tags-parser.js.map +1 -0
- package/dist/services/symbols.d.ts +85 -0
- package/dist/services/symbols.d.ts.map +1 -0
- package/dist/services/symbols.js +128 -0
- package/dist/services/symbols.js.map +1 -0
- package/dist/services/type-hints.d.ts +62 -0
- package/dist/services/type-hints.d.ts.map +1 -0
- package/dist/services/type-hints.js +117 -0
- package/dist/services/type-hints.js.map +1 -0
- package/dist/testing.d.ts +77 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +84 -0
- package/dist/testing.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type Hint Registry Service
|
|
3
|
+
*
|
|
4
|
+
* Provides user-configured type overrides that plugins can query.
|
|
5
|
+
*
|
|
6
|
+
* Precedence rules (higher score wins):
|
|
7
|
+
* - schema + table + column: 9 points
|
|
8
|
+
* - table + column: 7 points
|
|
9
|
+
* - schema + column: 6 points
|
|
10
|
+
* - schema + table: 5 points
|
|
11
|
+
* - column: 4 points
|
|
12
|
+
* - table: 3 points
|
|
13
|
+
* - schema: 2 points
|
|
14
|
+
* - pgType: 1 point
|
|
15
|
+
*
|
|
16
|
+
* For same specificity, later rules in config override earlier ones.
|
|
17
|
+
*/
|
|
18
|
+
import { Context, Layer, Option, Order, pipe, Array as Arr } from "effect";
|
|
19
|
+
/**
|
|
20
|
+
* TypeHintRegistry service tag
|
|
21
|
+
*/
|
|
22
|
+
export class TypeHints extends Context.Tag("TypeHints")() {
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Calculate specificity score for a match pattern.
|
|
26
|
+
*
|
|
27
|
+
* Scoring:
|
|
28
|
+
* - schema: 2 points
|
|
29
|
+
* - table: 3 points
|
|
30
|
+
* - column: 4 points
|
|
31
|
+
* - pgType: 1 point
|
|
32
|
+
*
|
|
33
|
+
* Combinations add up:
|
|
34
|
+
* - schema+table+column = 9 points
|
|
35
|
+
* - table+column = 7 points
|
|
36
|
+
* - etc.
|
|
37
|
+
*/
|
|
38
|
+
function calculateScore(match) {
|
|
39
|
+
let score = 0;
|
|
40
|
+
if (match.schema !== undefined)
|
|
41
|
+
score += 2;
|
|
42
|
+
if (match.table !== undefined)
|
|
43
|
+
score += 3;
|
|
44
|
+
if (match.column !== undefined)
|
|
45
|
+
score += 4;
|
|
46
|
+
if (match.pgType !== undefined)
|
|
47
|
+
score += 1;
|
|
48
|
+
return score;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if a hint's match pattern matches a field
|
|
52
|
+
*/
|
|
53
|
+
function matchesField(match, field) {
|
|
54
|
+
// All specified criteria must match
|
|
55
|
+
if (match.schema !== undefined && match.schema !== field.schema)
|
|
56
|
+
return false;
|
|
57
|
+
if (match.table !== undefined && match.table !== field.table)
|
|
58
|
+
return false;
|
|
59
|
+
if (match.column !== undefined && match.column !== field.column)
|
|
60
|
+
return false;
|
|
61
|
+
if (match.pgType !== undefined && match.pgType !== field.pgType)
|
|
62
|
+
return false;
|
|
63
|
+
// At least one criterion must be specified
|
|
64
|
+
return (match.schema !== undefined ||
|
|
65
|
+
match.table !== undefined ||
|
|
66
|
+
match.column !== undefined ||
|
|
67
|
+
match.pgType !== undefined);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Order for sorting scored hints by (score, index) ascending.
|
|
71
|
+
* Lower scores come first, so higher scores override them.
|
|
72
|
+
*/
|
|
73
|
+
const scoredHintOrder = Order.combine(Order.mapInput(Order.number, (sh) => sh.score), Order.mapInput(Order.number, (sh) => sh.index));
|
|
74
|
+
/**
|
|
75
|
+
* Create a type hint registry from configuration
|
|
76
|
+
*/
|
|
77
|
+
export function createTypeHintRegistry(hints) {
|
|
78
|
+
// Pre-calculate scores for all hints with their original index
|
|
79
|
+
const scoredHints = pipe(hints, Arr.map((hint, index) => ({
|
|
80
|
+
hint,
|
|
81
|
+
score: calculateScore(hint.match),
|
|
82
|
+
index,
|
|
83
|
+
})));
|
|
84
|
+
const getHintsImpl = (field) => {
|
|
85
|
+
// Find all matching hints
|
|
86
|
+
const matching = pipe(scoredHints, Arr.filter((sh) => matchesField(sh.hint.match, field)));
|
|
87
|
+
// Sort by score (ascending), then by index (ascending)
|
|
88
|
+
// Lower score/index first, so later ones override
|
|
89
|
+
const sorted = Arr.sort(matching, scoredHintOrder);
|
|
90
|
+
// Merge hints - later (higher score/index) overrides earlier
|
|
91
|
+
return Arr.reduce(sorted, {}, (merged, sh) => ({
|
|
92
|
+
...merged,
|
|
93
|
+
...sh.hint.hints,
|
|
94
|
+
}));
|
|
95
|
+
};
|
|
96
|
+
return {
|
|
97
|
+
getHints: getHintsImpl,
|
|
98
|
+
getHint: (field, key) => {
|
|
99
|
+
const allHints = getHintsImpl(field);
|
|
100
|
+
return Option.fromNullable(allHints[key]);
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Empty registry for testing
|
|
106
|
+
*/
|
|
107
|
+
export const emptyTypeHintRegistry = {
|
|
108
|
+
getHints: () => ({}),
|
|
109
|
+
getHint: () => Option.none(),
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Create a live layer from config
|
|
113
|
+
*/
|
|
114
|
+
export function TypeHintsLive(hints) {
|
|
115
|
+
return Layer.succeed(TypeHints, createTypeHintRegistry(hints));
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=type-hints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-hints.js","sourceRoot":"","sources":["../../src/services/type-hints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides reusable test layers and helpers for plugin testing.
|
|
5
|
+
*/
|
|
6
|
+
import { Layer } from "effect";
|
|
7
|
+
import { PluginMeta } from "./services/plugin-meta.js";
|
|
8
|
+
import { IR } from "./services/ir.js";
|
|
9
|
+
import { PluginRunner } from "./services/plugin-runner.js";
|
|
10
|
+
import type { SemanticIR } from "./ir/semantic-ir.js";
|
|
11
|
+
/**
|
|
12
|
+
* Base test layers for direct plugin testing (bypassing PluginRunner).
|
|
13
|
+
*
|
|
14
|
+
* Provides all shared services except IR and PluginMeta,
|
|
15
|
+
* which are test-specific.
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const TestLayer = Layer.mergeAll(
|
|
20
|
+
* PluginTestLayers,
|
|
21
|
+
* Layer.succeed(IR, testIR),
|
|
22
|
+
* Layer.succeed(PluginMeta, { name: "test-plugin" }),
|
|
23
|
+
* )
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare const PluginTestLayers: Layer.Layer<import("./index.js").Inflection | import("./testing.js").Symbols | import("./index.js").TypeHints | import("./testing.js").Emissions | import("./index.js").ArtifactStore, never, never>;
|
|
27
|
+
/**
|
|
28
|
+
* Test layer for PluginRunner integration tests.
|
|
29
|
+
*
|
|
30
|
+
* PluginRunner.Default includes InflectionLive by default.
|
|
31
|
+
* Add TypeHintsLive for complete test setup.
|
|
32
|
+
*
|
|
33
|
+
* Usage:
|
|
34
|
+
* ```typescript
|
|
35
|
+
* layer(PluginRunnerTestLayer)("my tests", (it) => {
|
|
36
|
+
* it.effect("runs plugins", () =>
|
|
37
|
+
* Effect.gen(function* () {
|
|
38
|
+
* const runner = yield* PluginRunner
|
|
39
|
+
* const prepared = yield* runner.prepare(plugins)
|
|
40
|
+
* const result = yield* runner.run(prepared, ir)
|
|
41
|
+
* })
|
|
42
|
+
* )
|
|
43
|
+
* })
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare const PluginRunnerTestLayer: Layer.Layer<import("./index.js").TypeHints | PluginRunner, never, never>;
|
|
47
|
+
/**
|
|
48
|
+
* Create a complete test layer for a specific plugin test.
|
|
49
|
+
*
|
|
50
|
+
* @param ir - The SemanticIR to provide
|
|
51
|
+
* @param pluginName - The plugin name for PluginMeta
|
|
52
|
+
* @returns Layer with all services for plugin testing
|
|
53
|
+
*
|
|
54
|
+
* Usage:
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const testIR = freezeIR(createIRBuilder(["public"]))
|
|
57
|
+
* const TestLayer = createPluginTestLayer(testIR, "my-plugin")
|
|
58
|
+
*
|
|
59
|
+
* layer(TestLayer)("MyPlugin tests", (it) => {
|
|
60
|
+
* it.effect("generates types", () =>
|
|
61
|
+
* Effect.gen(function* () {
|
|
62
|
+
* yield* myPlugin.run(config)
|
|
63
|
+
* const emissions = yield* Emissions
|
|
64
|
+
* expect(emissions.getAll()).toHaveLength(1)
|
|
65
|
+
* })
|
|
66
|
+
* )
|
|
67
|
+
* })
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare function createPluginTestLayer(ir: SemanticIR, pluginName: string): Layer.Layer<import("./index.js").Inflection | import("./testing.js").Symbols | import("./index.js").TypeHints | import("./testing.js").Emissions | IR | import("./index.js").ArtifactStore | PluginMeta, never, never>;
|
|
71
|
+
export { IR } from "./services/ir.js";
|
|
72
|
+
export { PluginMeta } from "./services/plugin-meta.js";
|
|
73
|
+
export { Emissions } from "./services/emissions.js";
|
|
74
|
+
export { Symbols } from "./services/symbols.js";
|
|
75
|
+
export { PluginRunner } from "./services/plugin-runner.js";
|
|
76
|
+
export { createIRBuilder, freezeIR } from "./ir/semantic-ir.js";
|
|
77
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAM9B,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,sMAM5B,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,qBAAqB,0EAGjC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,0NAMvE;AAGD,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA"}
|
package/dist/testing.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing Utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides reusable test layers and helpers for plugin testing.
|
|
5
|
+
*/
|
|
6
|
+
import { Layer } from "effect";
|
|
7
|
+
import { InflectionLive } from "./services/inflection.js";
|
|
8
|
+
import { EmissionsLive } from "./services/emissions.js";
|
|
9
|
+
import { SymbolsLive } from "./services/symbols.js";
|
|
10
|
+
import { TypeHintsLive } from "./services/type-hints.js";
|
|
11
|
+
import { ArtifactStoreLive } from "./services/artifact-store.js";
|
|
12
|
+
import { PluginMeta } from "./services/plugin-meta.js";
|
|
13
|
+
import { IR } from "./services/ir.js";
|
|
14
|
+
import { PluginRunner } from "./services/plugin-runner.js";
|
|
15
|
+
/**
|
|
16
|
+
* Base test layers for direct plugin testing (bypassing PluginRunner).
|
|
17
|
+
*
|
|
18
|
+
* Provides all shared services except IR and PluginMeta,
|
|
19
|
+
* which are test-specific.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const TestLayer = Layer.mergeAll(
|
|
24
|
+
* PluginTestLayers,
|
|
25
|
+
* Layer.succeed(IR, testIR),
|
|
26
|
+
* Layer.succeed(PluginMeta, { name: "test-plugin" }),
|
|
27
|
+
* )
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export const PluginTestLayers = Layer.mergeAll(InflectionLive, EmissionsLive, SymbolsLive, TypeHintsLive([]), ArtifactStoreLive);
|
|
31
|
+
/**
|
|
32
|
+
* Test layer for PluginRunner integration tests.
|
|
33
|
+
*
|
|
34
|
+
* PluginRunner.Default includes InflectionLive by default.
|
|
35
|
+
* Add TypeHintsLive for complete test setup.
|
|
36
|
+
*
|
|
37
|
+
* Usage:
|
|
38
|
+
* ```typescript
|
|
39
|
+
* layer(PluginRunnerTestLayer)("my tests", (it) => {
|
|
40
|
+
* it.effect("runs plugins", () =>
|
|
41
|
+
* Effect.gen(function* () {
|
|
42
|
+
* const runner = yield* PluginRunner
|
|
43
|
+
* const prepared = yield* runner.prepare(plugins)
|
|
44
|
+
* const result = yield* runner.run(prepared, ir)
|
|
45
|
+
* })
|
|
46
|
+
* )
|
|
47
|
+
* })
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export const PluginRunnerTestLayer = Layer.mergeAll(PluginRunner.Default, TypeHintsLive([]));
|
|
51
|
+
/**
|
|
52
|
+
* Create a complete test layer for a specific plugin test.
|
|
53
|
+
*
|
|
54
|
+
* @param ir - The SemanticIR to provide
|
|
55
|
+
* @param pluginName - The plugin name for PluginMeta
|
|
56
|
+
* @returns Layer with all services for plugin testing
|
|
57
|
+
*
|
|
58
|
+
* Usage:
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const testIR = freezeIR(createIRBuilder(["public"]))
|
|
61
|
+
* const TestLayer = createPluginTestLayer(testIR, "my-plugin")
|
|
62
|
+
*
|
|
63
|
+
* layer(TestLayer)("MyPlugin tests", (it) => {
|
|
64
|
+
* it.effect("generates types", () =>
|
|
65
|
+
* Effect.gen(function* () {
|
|
66
|
+
* yield* myPlugin.run(config)
|
|
67
|
+
* const emissions = yield* Emissions
|
|
68
|
+
* expect(emissions.getAll()).toHaveLength(1)
|
|
69
|
+
* })
|
|
70
|
+
* )
|
|
71
|
+
* })
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export function createPluginTestLayer(ir, pluginName) {
|
|
75
|
+
return Layer.mergeAll(PluginTestLayers, Layer.succeed(IR, ir), Layer.succeed(PluginMeta, { name: pluginName }));
|
|
76
|
+
}
|
|
77
|
+
// Re-export commonly needed items for tests
|
|
78
|
+
export { IR } from "./services/ir.js";
|
|
79
|
+
export { PluginMeta } from "./services/plugin-meta.js";
|
|
80
|
+
export { Emissions } from "./services/emissions.js";
|
|
81
|
+
export { Symbols } from "./services/symbols.js";
|
|
82
|
+
export { PluginRunner } from "./services/plugin-runner.js";
|
|
83
|
+
export { createIRBuilder, freezeIR } from "./ir/semantic-ir.js";
|
|
84
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAG1D;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,CAC5C,cAAc,EACd,aAAa,EACb,WAAW,EACX,aAAa,CAAC,EAAE,CAAC,EACjB,iBAAiB,CAClB,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,QAAQ,CACjD,YAAY,CAAC,OAAO,EACpB,aAAa,CAAC,EAAE,CAAC,CAClB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,qBAAqB,CAAC,EAAc,EAAE,UAAkB;IACtE,OAAO,KAAK,CAAC,QAAQ,CACnB,gBAAgB,EAChB,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,EACrB,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAChD,CAAA;AACH,CAAC;AAED,4CAA4C;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@danielfgray/pg-sourcerer",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "PostgreSQL code generation framework with a plugin ecosystem",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./plugins/*": {
|
|
14
|
+
"types": "./dist/plugins/*.d.ts",
|
|
15
|
+
"import": "./dist/plugins/*.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"bin": {
|
|
19
|
+
"pgsourcerer": "dist/cli.js"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"build:watch": "tsc --watch",
|
|
29
|
+
"clean": "rm -rf dist",
|
|
30
|
+
"prepublishOnly": "bun run clean && bun run build",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:all": "bun --env-file=../example/.env vitest run --config vitest.all.config.ts",
|
|
33
|
+
"test:unit": "vitest run",
|
|
34
|
+
"test:integration": "bun --env-file=../example/.env vitest run --config vitest.integration.config.ts",
|
|
35
|
+
"test:watch": "vitest",
|
|
36
|
+
"typecheck": "tsc --noEmit"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"postgresql",
|
|
40
|
+
"postgres",
|
|
41
|
+
"codegen",
|
|
42
|
+
"code-generation",
|
|
43
|
+
"typescript",
|
|
44
|
+
"effect",
|
|
45
|
+
"zod",
|
|
46
|
+
"introspection"
|
|
47
|
+
],
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "https://github.com/DanielFGray/pg-sourcerer.git",
|
|
51
|
+
"directory": "packages/pg-sourcerer"
|
|
52
|
+
},
|
|
53
|
+
"license": "MIT",
|
|
54
|
+
"author": "Daniel Gray",
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@effect/cli": "catalog:",
|
|
57
|
+
"@effect/platform": "catalog:",
|
|
58
|
+
"@effect/platform-node": "catalog:",
|
|
59
|
+
"effect": "catalog:",
|
|
60
|
+
"lilconfig": "^3.1.3",
|
|
61
|
+
"pg": "catalog:",
|
|
62
|
+
"postgres": "catalog:",
|
|
63
|
+
"@pg-sourcerer/pg-introspection": "workspace:*",
|
|
64
|
+
"recast": "^0.23.11"
|
|
65
|
+
},
|
|
66
|
+
"devDependencies": {
|
|
67
|
+
"@effect/vitest": "catalog:",
|
|
68
|
+
"@types/bun": "catalog:",
|
|
69
|
+
"@types/pg": "catalog:",
|
|
70
|
+
"@vitest/coverage-v8": "3.2.4",
|
|
71
|
+
"typescript": "catalog:",
|
|
72
|
+
"vitest": "catalog:"
|
|
73
|
+
}
|
|
74
|
+
}
|