@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.
Files changed (145) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +104 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/config.d.ts +133 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +47 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/errors.d.ts +129 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +41 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/generate.d.ts +75 -0
  14. package/dist/generate.d.ts.map +1 -0
  15. package/dist/generate.js +183 -0
  16. package/dist/generate.js.map +1 -0
  17. package/dist/index.d.ts +35 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +62 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/init.d.ts +4 -0
  22. package/dist/init.d.ts.map +1 -0
  23. package/dist/init.js +229 -0
  24. package/dist/init.js.map +1 -0
  25. package/dist/ir/index.d.ts +7 -0
  26. package/dist/ir/index.d.ts.map +1 -0
  27. package/dist/ir/index.js +7 -0
  28. package/dist/ir/index.js.map +1 -0
  29. package/dist/ir/relation-graph.d.ts +113 -0
  30. package/dist/ir/relation-graph.d.ts.map +1 -0
  31. package/dist/ir/relation-graph.js +232 -0
  32. package/dist/ir/relation-graph.js.map +1 -0
  33. package/dist/ir/semantic-ir.d.ts +448 -0
  34. package/dist/ir/semantic-ir.d.ts.map +1 -0
  35. package/dist/ir/semantic-ir.js +138 -0
  36. package/dist/ir/semantic-ir.js.map +1 -0
  37. package/dist/ir/smart-tags.d.ts +24 -0
  38. package/dist/ir/smart-tags.d.ts.map +1 -0
  39. package/dist/ir/smart-tags.js +30 -0
  40. package/dist/ir/smart-tags.js.map +1 -0
  41. package/dist/lib/conjure.d.ts +431 -0
  42. package/dist/lib/conjure.d.ts.map +1 -0
  43. package/dist/lib/conjure.js +697 -0
  44. package/dist/lib/conjure.js.map +1 -0
  45. package/dist/lib/field-utils.d.ts +61 -0
  46. package/dist/lib/field-utils.d.ts.map +1 -0
  47. package/dist/lib/field-utils.js +132 -0
  48. package/dist/lib/field-utils.js.map +1 -0
  49. package/dist/lib/hex.d.ts +117 -0
  50. package/dist/lib/hex.d.ts.map +1 -0
  51. package/dist/lib/hex.js +185 -0
  52. package/dist/lib/hex.js.map +1 -0
  53. package/dist/plugins/arktype.d.ts +11 -0
  54. package/dist/plugins/arktype.d.ts.map +1 -0
  55. package/dist/plugins/arktype.js +207 -0
  56. package/dist/plugins/arktype.js.map +1 -0
  57. package/dist/plugins/effect-model.d.ts +10 -0
  58. package/dist/plugins/effect-model.d.ts.map +1 -0
  59. package/dist/plugins/effect-model.js +261 -0
  60. package/dist/plugins/effect-model.js.map +1 -0
  61. package/dist/plugins/kysely-queries.d.ts +7 -0
  62. package/dist/plugins/kysely-queries.d.ts.map +1 -0
  63. package/dist/plugins/kysely-queries.js +380 -0
  64. package/dist/plugins/kysely-queries.js.map +1 -0
  65. package/dist/plugins/sql-queries.d.ts +6 -0
  66. package/dist/plugins/sql-queries.d.ts.map +1 -0
  67. package/dist/plugins/sql-queries.js +249 -0
  68. package/dist/plugins/sql-queries.js.map +1 -0
  69. package/dist/plugins/types.d.ts +18 -0
  70. package/dist/plugins/types.d.ts.map +1 -0
  71. package/dist/plugins/types.js +263 -0
  72. package/dist/plugins/types.js.map +1 -0
  73. package/dist/plugins/zod.d.ts +11 -0
  74. package/dist/plugins/zod.d.ts.map +1 -0
  75. package/dist/plugins/zod.js +180 -0
  76. package/dist/plugins/zod.js.map +1 -0
  77. package/dist/services/artifact-store.d.ts +55 -0
  78. package/dist/services/artifact-store.d.ts.map +1 -0
  79. package/dist/services/artifact-store.js +51 -0
  80. package/dist/services/artifact-store.js.map +1 -0
  81. package/dist/services/config-loader.d.ts +45 -0
  82. package/dist/services/config-loader.d.ts.map +1 -0
  83. package/dist/services/config-loader.js +113 -0
  84. package/dist/services/config-loader.js.map +1 -0
  85. package/dist/services/emissions.d.ts +89 -0
  86. package/dist/services/emissions.d.ts.map +1 -0
  87. package/dist/services/emissions.js +194 -0
  88. package/dist/services/emissions.js.map +1 -0
  89. package/dist/services/file-builder.d.ts +81 -0
  90. package/dist/services/file-builder.d.ts.map +1 -0
  91. package/dist/services/file-builder.js +112 -0
  92. package/dist/services/file-builder.js.map +1 -0
  93. package/dist/services/file-writer.d.ts +57 -0
  94. package/dist/services/file-writer.d.ts.map +1 -0
  95. package/dist/services/file-writer.js +76 -0
  96. package/dist/services/file-writer.js.map +1 -0
  97. package/dist/services/inflection.d.ts +227 -0
  98. package/dist/services/inflection.d.ts.map +1 -0
  99. package/dist/services/inflection.js +350 -0
  100. package/dist/services/inflection.js.map +1 -0
  101. package/dist/services/introspection.d.ts +46 -0
  102. package/dist/services/introspection.d.ts.map +1 -0
  103. package/dist/services/introspection.js +99 -0
  104. package/dist/services/introspection.js.map +1 -0
  105. package/dist/services/ir-builder.d.ts +46 -0
  106. package/dist/services/ir-builder.d.ts.map +1 -0
  107. package/dist/services/ir-builder.js +923 -0
  108. package/dist/services/ir-builder.js.map +1 -0
  109. package/dist/services/ir.d.ts +28 -0
  110. package/dist/services/ir.d.ts.map +1 -0
  111. package/dist/services/ir.js +25 -0
  112. package/dist/services/ir.js.map +1 -0
  113. package/dist/services/pg-types.d.ts +197 -0
  114. package/dist/services/pg-types.d.ts.map +1 -0
  115. package/dist/services/pg-types.js +274 -0
  116. package/dist/services/pg-types.js.map +1 -0
  117. package/dist/services/plugin-meta.d.ts +33 -0
  118. package/dist/services/plugin-meta.d.ts.map +1 -0
  119. package/dist/services/plugin-meta.js +24 -0
  120. package/dist/services/plugin-meta.js.map +1 -0
  121. package/dist/services/plugin-runner.d.ts +52 -0
  122. package/dist/services/plugin-runner.d.ts.map +1 -0
  123. package/dist/services/plugin-runner.js +182 -0
  124. package/dist/services/plugin-runner.js.map +1 -0
  125. package/dist/services/plugin.d.ts +286 -0
  126. package/dist/services/plugin.d.ts.map +1 -0
  127. package/dist/services/plugin.js +132 -0
  128. package/dist/services/plugin.js.map +1 -0
  129. package/dist/services/smart-tags-parser.d.ts +37 -0
  130. package/dist/services/smart-tags-parser.d.ts.map +1 -0
  131. package/dist/services/smart-tags-parser.js +79 -0
  132. package/dist/services/smart-tags-parser.js.map +1 -0
  133. package/dist/services/symbols.d.ts +85 -0
  134. package/dist/services/symbols.d.ts.map +1 -0
  135. package/dist/services/symbols.js +128 -0
  136. package/dist/services/symbols.js.map +1 -0
  137. package/dist/services/type-hints.d.ts +62 -0
  138. package/dist/services/type-hints.d.ts.map +1 -0
  139. package/dist/services/type-hints.js +117 -0
  140. package/dist/services/type-hints.js.map +1 -0
  141. package/dist/testing.d.ts +77 -0
  142. package/dist/testing.d.ts.map +1 -0
  143. package/dist/testing.js +84 -0
  144. package/dist/testing.js.map +1 -0
  145. 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"}
@@ -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
+ }