@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.
Files changed (307) hide show
  1. package/bin/pgsourcerer +2 -0
  2. package/dist/__tests__/fixtures/index.d.ts +15 -0
  3. package/dist/__tests__/fixtures/index.d.ts.map +1 -0
  4. package/dist/__tests__/fixtures/index.js +19 -0
  5. package/dist/__tests__/fixtures/index.js.map +1 -0
  6. package/dist/__tests__/fixtures/introspection.json +40522 -0
  7. package/dist/cli.d.ts +0 -1
  8. package/dist/cli.js +7 -46
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.d.ts +38 -5
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +13 -2
  13. package/dist/config.js.map +1 -1
  14. package/dist/{lib/conjure.d.ts → conjure/index.d.ts} +62 -3
  15. package/dist/conjure/index.d.ts.map +1 -0
  16. package/dist/{lib/conjure.js → conjure/index.js} +124 -3
  17. package/dist/conjure/index.js.map +1 -0
  18. package/dist/conjure/signature.d.ts +85 -0
  19. package/dist/conjure/signature.d.ts.map +1 -0
  20. package/dist/conjure/signature.js +130 -0
  21. package/dist/conjure/signature.js.map +1 -0
  22. package/dist/conjure/types.d.ts +97 -0
  23. package/dist/conjure/types.d.ts.map +1 -0
  24. package/dist/conjure/types.js +206 -0
  25. package/dist/conjure/types.js.map +1 -0
  26. package/dist/errors.d.ts +114 -139
  27. package/dist/errors.d.ts.map +1 -1
  28. package/dist/errors.js +82 -36
  29. package/dist/errors.js.map +1 -1
  30. package/dist/generate.d.ts +45 -46
  31. package/dist/generate.d.ts.map +1 -1
  32. package/dist/generate.js +86 -59
  33. package/dist/generate.js.map +1 -1
  34. package/dist/hex/builder.d.ts +12 -0
  35. package/dist/hex/builder.d.ts.map +1 -0
  36. package/dist/hex/builder.js +64 -0
  37. package/dist/hex/builder.js.map +1 -0
  38. package/dist/hex/ddl.d.ts +53 -0
  39. package/dist/hex/ddl.d.ts.map +1 -0
  40. package/dist/hex/ddl.js +306 -0
  41. package/dist/hex/ddl.js.map +1 -0
  42. package/dist/hex/index.d.ts +105 -0
  43. package/dist/hex/index.d.ts.map +1 -0
  44. package/dist/hex/index.js +81 -0
  45. package/dist/hex/index.js.map +1 -0
  46. package/dist/hex/primitives.d.ts +23 -0
  47. package/dist/hex/primitives.d.ts.map +1 -0
  48. package/dist/hex/primitives.js +38 -0
  49. package/dist/hex/primitives.js.map +1 -0
  50. package/dist/hex/query.d.ts +116 -0
  51. package/dist/hex/query.d.ts.map +1 -0
  52. package/dist/hex/query.js +219 -0
  53. package/dist/hex/query.js.map +1 -0
  54. package/dist/hex/types.d.ts +287 -0
  55. package/dist/hex/types.d.ts.map +1 -0
  56. package/dist/hex/types.js +431 -0
  57. package/dist/hex/types.js.map +1 -0
  58. package/dist/index.d.ts +17 -25
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +33 -44
  61. package/dist/index.js.map +1 -1
  62. package/dist/init.d.ts.map +1 -1
  63. package/dist/init.js +76 -140
  64. package/dist/init.js.map +1 -1
  65. package/dist/ir/extensions/queries.d.ts +6 -6
  66. package/dist/ir/extensions/queries.d.ts.map +1 -1
  67. package/dist/ir/extensions/queries.js +6 -4
  68. package/dist/ir/extensions/queries.js.map +1 -1
  69. package/dist/ir/extensions/schema-builder.d.ts.map +1 -1
  70. package/dist/ir/extensions/schema-builder.js.map +1 -1
  71. package/dist/ir/index.d.ts.map +1 -1
  72. package/dist/ir/index.js.map +1 -1
  73. package/dist/ir/relation-graph.d.ts.map +1 -1
  74. package/dist/ir/relation-graph.js +8 -8
  75. package/dist/ir/relation-graph.js.map +1 -1
  76. package/dist/ir/semantic-ir.d.ts +38 -0
  77. package/dist/ir/semantic-ir.d.ts.map +1 -1
  78. package/dist/ir/semantic-ir.js +50 -2
  79. package/dist/ir/semantic-ir.js.map +1 -1
  80. package/dist/ir/smart-tags.d.ts.map +1 -1
  81. package/dist/ir/smart-tags.js.map +1 -1
  82. package/dist/lib/field-utils.d.ts.map +1 -1
  83. package/dist/lib/field-utils.js +7 -7
  84. package/dist/lib/field-utils.js.map +1 -1
  85. package/dist/lib/join-graph.d.ts +95 -0
  86. package/dist/lib/join-graph.d.ts.map +1 -0
  87. package/dist/lib/join-graph.js +305 -0
  88. package/dist/lib/join-graph.js.map +1 -0
  89. package/dist/lib/picker.d.ts +60 -0
  90. package/dist/lib/picker.d.ts.map +1 -0
  91. package/dist/lib/picker.js +325 -0
  92. package/dist/lib/picker.js.map +1 -0
  93. package/dist/plugins/arktype.d.ts +20 -24
  94. package/dist/plugins/arktype.d.ts.map +1 -1
  95. package/dist/plugins/arktype.js +462 -386
  96. package/dist/plugins/arktype.js.map +1 -1
  97. package/dist/plugins/effect/http.d.ts +7 -0
  98. package/dist/plugins/effect/http.d.ts.map +1 -0
  99. package/dist/plugins/effect/http.js +460 -0
  100. package/dist/plugins/effect/http.js.map +1 -0
  101. package/dist/plugins/effect/index.d.ts +22 -0
  102. package/dist/plugins/effect/index.d.ts.map +1 -0
  103. package/dist/plugins/effect/index.js +65 -0
  104. package/dist/plugins/effect/index.js.map +1 -0
  105. package/dist/plugins/effect/models.d.ts +6 -0
  106. package/dist/plugins/effect/models.d.ts.map +1 -0
  107. package/dist/plugins/effect/models.js +116 -0
  108. package/dist/plugins/effect/models.js.map +1 -0
  109. package/dist/plugins/effect/repos.d.ts +21 -0
  110. package/dist/plugins/effect/repos.d.ts.map +1 -0
  111. package/dist/plugins/effect/repos.js +131 -0
  112. package/dist/plugins/effect/repos.js.map +1 -0
  113. package/dist/plugins/effect/schemas.d.ts +7 -0
  114. package/dist/plugins/effect/schemas.d.ts.map +1 -0
  115. package/dist/plugins/effect/schemas.js +75 -0
  116. package/dist/plugins/effect/schemas.js.map +1 -0
  117. package/dist/plugins/effect/shared.d.ts +116 -0
  118. package/dist/plugins/effect/shared.d.ts.map +1 -0
  119. package/dist/plugins/effect/shared.js +164 -0
  120. package/dist/plugins/effect/shared.js.map +1 -0
  121. package/dist/plugins/http-elysia.d.ts +20 -27
  122. package/dist/plugins/http-elysia.d.ts.map +1 -1
  123. package/dist/plugins/http-elysia.js +350 -475
  124. package/dist/plugins/http-elysia.js.map +1 -1
  125. package/dist/plugins/http-express.d.ts +20 -31
  126. package/dist/plugins/http-express.d.ts.map +1 -1
  127. package/dist/plugins/http-express.js +281 -268
  128. package/dist/plugins/http-express.js.map +1 -1
  129. package/dist/plugins/http-hono.d.ts +17 -33
  130. package/dist/plugins/http-hono.d.ts.map +1 -1
  131. package/dist/plugins/http-hono.js +317 -341
  132. package/dist/plugins/http-hono.js.map +1 -1
  133. package/dist/plugins/http-orpc.d.ts +34 -33
  134. package/dist/plugins/http-orpc.d.ts.map +1 -1
  135. package/dist/plugins/http-orpc.js +345 -257
  136. package/dist/plugins/http-orpc.js.map +1 -1
  137. package/dist/plugins/http-trpc.d.ts +33 -35
  138. package/dist/plugins/http-trpc.d.ts.map +1 -1
  139. package/dist/plugins/http-trpc.js +337 -241
  140. package/dist/plugins/http-trpc.js.map +1 -1
  141. package/dist/plugins/kysely.d.ts +54 -59
  142. package/dist/plugins/kysely.d.ts.map +1 -1
  143. package/dist/plugins/kysely.js +826 -687
  144. package/dist/plugins/kysely.js.map +1 -1
  145. package/dist/plugins/sql-queries.d.ts +38 -44
  146. package/dist/plugins/sql-queries.d.ts.map +1 -1
  147. package/dist/plugins/sql-queries.js +497 -897
  148. package/dist/plugins/sql-queries.js.map +1 -1
  149. package/dist/plugins/types.d.ts +12 -20
  150. package/dist/plugins/types.d.ts.map +1 -1
  151. package/dist/plugins/types.js +84 -227
  152. package/dist/plugins/types.js.map +1 -1
  153. package/dist/plugins/valibot.d.ts +7 -44
  154. package/dist/plugins/valibot.d.ts.map +1 -1
  155. package/dist/plugins/valibot.js +376 -382
  156. package/dist/plugins/valibot.js.map +1 -1
  157. package/dist/plugins/zod.d.ts +20 -24
  158. package/dist/plugins/zod.d.ts.map +1 -1
  159. package/dist/plugins/zod.js +370 -367
  160. package/dist/plugins/zod.js.map +1 -1
  161. package/dist/runtime/emit.d.ts +64 -0
  162. package/dist/runtime/emit.d.ts.map +1 -0
  163. package/dist/runtime/emit.js +445 -0
  164. package/dist/runtime/emit.js.map +1 -0
  165. package/dist/runtime/errors.d.ts +36 -0
  166. package/dist/runtime/errors.d.ts.map +1 -0
  167. package/dist/runtime/errors.js +29 -0
  168. package/dist/runtime/errors.js.map +1 -0
  169. package/dist/runtime/file-assignment.d.ts +161 -0
  170. package/dist/runtime/file-assignment.d.ts.map +1 -0
  171. package/dist/runtime/file-assignment.js +195 -0
  172. package/dist/runtime/file-assignment.js.map +1 -0
  173. package/dist/runtime/orchestrator.d.ts +62 -0
  174. package/dist/runtime/orchestrator.d.ts.map +1 -0
  175. package/dist/runtime/orchestrator.js +99 -0
  176. package/dist/runtime/orchestrator.js.map +1 -0
  177. package/dist/runtime/registry.d.ts +268 -0
  178. package/dist/runtime/registry.d.ts.map +1 -0
  179. package/dist/runtime/registry.js +436 -0
  180. package/dist/runtime/registry.js.map +1 -0
  181. package/dist/runtime/types.d.ts +182 -0
  182. package/dist/runtime/types.d.ts.map +1 -0
  183. package/dist/runtime/types.js +2 -0
  184. package/dist/runtime/types.js.map +1 -0
  185. package/dist/runtime/validation.d.ts +41 -0
  186. package/dist/runtime/validation.d.ts.map +1 -0
  187. package/dist/runtime/validation.js +70 -0
  188. package/dist/runtime/validation.js.map +1 -0
  189. package/dist/services/config-loader.d.ts.map +1 -1
  190. package/dist/services/config-loader.js +15 -6
  191. package/dist/services/config-loader.js.map +1 -1
  192. package/dist/services/config.d.ts +55 -25
  193. package/dist/services/config.d.ts.map +1 -1
  194. package/dist/services/config.js +60 -34
  195. package/dist/services/config.js.map +1 -1
  196. package/dist/services/file-writer.d.ts +3 -3
  197. package/dist/services/file-writer.d.ts.map +1 -1
  198. package/dist/services/file-writer.js +6 -8
  199. package/dist/services/file-writer.js.map +1 -1
  200. package/dist/services/inflection.d.ts +126 -27
  201. package/dist/services/inflection.d.ts.map +1 -1
  202. package/dist/services/inflection.js +300 -72
  203. package/dist/services/inflection.js.map +1 -1
  204. package/dist/services/introspection.d.ts.map +1 -1
  205. package/dist/services/introspection.js +6 -6
  206. package/dist/services/introspection.js.map +1 -1
  207. package/dist/services/ir-builder.d.ts.map +1 -1
  208. package/dist/services/ir-builder.js +73 -77
  209. package/dist/services/ir-builder.js.map +1 -1
  210. package/dist/services/ir.d.ts.map +1 -1
  211. package/dist/services/ir.js.map +1 -1
  212. package/dist/services/pg-types.d.ts.map +1 -1
  213. package/dist/services/pg-types.js +3 -3
  214. package/dist/services/pg-types.js.map +1 -1
  215. package/dist/services/smart-tags-parser.d.ts.map +1 -1
  216. package/dist/services/smart-tags-parser.js +4 -4
  217. package/dist/services/smart-tags-parser.js.map +1 -1
  218. package/dist/services/type-hints.d.ts.map +1 -1
  219. package/dist/services/type-hints.js +1 -1
  220. package/dist/services/type-hints.js.map +1 -1
  221. package/dist/services/user-module-parser.d.ts +46 -0
  222. package/dist/services/user-module-parser.d.ts.map +1 -0
  223. package/dist/services/user-module-parser.js +181 -0
  224. package/dist/services/user-module-parser.js.map +1 -0
  225. package/dist/shared/converters.d.ts +60 -0
  226. package/dist/shared/converters.d.ts.map +1 -0
  227. package/dist/shared/converters.js +168 -0
  228. package/dist/shared/converters.js.map +1 -0
  229. package/dist/shared/query-types.d.ts +95 -0
  230. package/dist/shared/query-types.d.ts.map +1 -0
  231. package/dist/shared/query-types.js +9 -0
  232. package/dist/shared/query-types.js.map +1 -0
  233. package/dist/testing.d.ts +125 -37
  234. package/dist/testing.d.ts.map +1 -1
  235. package/dist/testing.js +134 -42
  236. package/dist/testing.js.map +1 -1
  237. package/dist/user-module.d.ts +86 -0
  238. package/dist/user-module.d.ts.map +1 -0
  239. package/dist/user-module.js +55 -0
  240. package/dist/user-module.js.map +1 -0
  241. package/package.json +10 -6
  242. package/dist/lib/conjure.d.ts.map +0 -1
  243. package/dist/lib/conjure.js.map +0 -1
  244. package/dist/lib/hex.d.ts +0 -119
  245. package/dist/lib/hex.d.ts.map +0 -1
  246. package/dist/lib/hex.js +0 -188
  247. package/dist/lib/hex.js.map +0 -1
  248. package/dist/plugins/effect.d.ts +0 -53
  249. package/dist/plugins/effect.d.ts.map +0 -1
  250. package/dist/plugins/effect.js +0 -1074
  251. package/dist/plugins/effect.js.map +0 -1
  252. package/dist/plugins/kysely/queries.d.ts +0 -92
  253. package/dist/plugins/kysely/queries.d.ts.map +0 -1
  254. package/dist/plugins/kysely/queries.js +0 -1169
  255. package/dist/plugins/kysely/queries.js.map +0 -1
  256. package/dist/plugins/kysely/shared.d.ts +0 -59
  257. package/dist/plugins/kysely/shared.d.ts.map +0 -1
  258. package/dist/plugins/kysely/shared.js +0 -247
  259. package/dist/plugins/kysely/shared.js.map +0 -1
  260. package/dist/plugins/kysely/types.d.ts +0 -22
  261. package/dist/plugins/kysely/types.d.ts.map +0 -1
  262. package/dist/plugins/kysely/types.js +0 -428
  263. package/dist/plugins/kysely/types.js.map +0 -1
  264. package/dist/services/artifact-store.d.ts +0 -65
  265. package/dist/services/artifact-store.d.ts.map +0 -1
  266. package/dist/services/artifact-store.js +0 -57
  267. package/dist/services/artifact-store.js.map +0 -1
  268. package/dist/services/core-providers.d.ts +0 -15
  269. package/dist/services/core-providers.d.ts.map +0 -1
  270. package/dist/services/core-providers.js +0 -23
  271. package/dist/services/core-providers.js.map +0 -1
  272. package/dist/services/emissions.d.ts +0 -103
  273. package/dist/services/emissions.d.ts.map +0 -1
  274. package/dist/services/emissions.js +0 -241
  275. package/dist/services/emissions.js.map +0 -1
  276. package/dist/services/execution.d.ts +0 -35
  277. package/dist/services/execution.d.ts.map +0 -1
  278. package/dist/services/execution.js +0 -86
  279. package/dist/services/execution.js.map +0 -1
  280. package/dist/services/file-builder.d.ts +0 -85
  281. package/dist/services/file-builder.d.ts.map +0 -1
  282. package/dist/services/file-builder.js +0 -112
  283. package/dist/services/file-builder.js.map +0 -1
  284. package/dist/services/plugin-meta.d.ts +0 -33
  285. package/dist/services/plugin-meta.d.ts.map +0 -1
  286. package/dist/services/plugin-meta.js +0 -24
  287. package/dist/services/plugin-meta.js.map +0 -1
  288. package/dist/services/plugin-runner.d.ts +0 -42
  289. package/dist/services/plugin-runner.d.ts.map +0 -1
  290. package/dist/services/plugin-runner.js +0 -84
  291. package/dist/services/plugin-runner.js.map +0 -1
  292. package/dist/services/plugin.d.ts +0 -421
  293. package/dist/services/plugin.d.ts.map +0 -1
  294. package/dist/services/plugin.js +0 -197
  295. package/dist/services/plugin.js.map +0 -1
  296. package/dist/services/resolution.d.ts +0 -38
  297. package/dist/services/resolution.d.ts.map +0 -1
  298. package/dist/services/resolution.js +0 -242
  299. package/dist/services/resolution.js.map +0 -1
  300. package/dist/services/service-registry.d.ts +0 -74
  301. package/dist/services/service-registry.d.ts.map +0 -1
  302. package/dist/services/service-registry.js +0 -61
  303. package/dist/services/service-registry.js.map +0 -1
  304. package/dist/services/symbols.d.ts +0 -144
  305. package/dist/services/symbols.d.ts.map +0 -1
  306. package/dist/services/symbols.js +0 -144
  307. package/dist/services/symbols.js.map +0 -1
@@ -0,0 +1,41 @@
1
+ import { Effect, Schema } from "effect";
2
+ import type { Plugin, SymbolDeclaration } from "./types.js";
3
+ declare const UnsatisfiedCapability_base: Schema.TaggedErrorClass<UnsatisfiedCapability, "UnsatisfiedCapability", {
4
+ readonly _tag: Schema.tag<"UnsatisfiedCapability">;
5
+ } & {
6
+ message: typeof Schema.String;
7
+ capability: typeof Schema.String;
8
+ consumer: typeof Schema.String;
9
+ }>;
10
+ /**
11
+ * Error when a plugin consumes a capability that no plugin provides.
12
+ */
13
+ export declare class UnsatisfiedCapability extends UnsatisfiedCapability_base {
14
+ }
15
+ declare const CircularDependency_base: Schema.TaggedErrorClass<CircularDependency, "CircularDependency", {
16
+ readonly _tag: Schema.tag<"CircularDependency">;
17
+ } & {
18
+ message: typeof Schema.String;
19
+ cycle: Schema.Array$<typeof Schema.String>;
20
+ }>;
21
+ /**
22
+ * Error when there's a circular dependency between symbols.
23
+ */
24
+ export declare class CircularDependency extends CircularDependency_base {
25
+ }
26
+ /**
27
+ * Validate that all plugin.consumes are satisfied by some plugin.provides.
28
+ */
29
+ export declare const validateConsumes: (plugins: readonly Plugin[]) => Effect.Effect<void, UnsatisfiedCapability, never>;
30
+ /**
31
+ * Validate that symbol dependencies form a DAG (no cycles).
32
+ */
33
+ export declare const validateDependencyGraph: (declarations: readonly SymbolDeclaration[]) => Effect.Effect<void, CircularDependency, never>;
34
+ /**
35
+ * Run all validations on plugins and their declarations.
36
+ */
37
+ export declare const validateAll: (plugins: readonly Plugin[], registry: {
38
+ all(): readonly SymbolDeclaration[];
39
+ }) => Effect.Effect<[void, void], UnsatisfiedCapability | CircularDependency, never>;
40
+ export {};
41
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/runtime/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAc,MAAM,YAAY,CAAC;;;;;;;;AAExE;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,0BAO1C;CAAG;;;;;;;AAEJ;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,uBAMvC;CAAG;AAEJ;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,SAAS,MAAM,EAAE,sDAiBvD,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,cAAc,SAAS,iBAAiB,EAAE,mDAyC9E,CAAC;AAEL;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,SAAS,SAAS,MAAM,EAAE,EAC1B,UAAU;IAAE,GAAG,IAAI,SAAS,iBAAiB,EAAE,CAAA;CAAE,mFACkC,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { Effect, Schema } from "effect";
2
+ /**
3
+ * Error when a plugin consumes a capability that no plugin provides.
4
+ */
5
+ export class UnsatisfiedCapability extends Schema.TaggedError()("UnsatisfiedCapability", {
6
+ message: Schema.String,
7
+ capability: Schema.String,
8
+ consumer: Schema.String,
9
+ }) {
10
+ }
11
+ /**
12
+ * Error when there's a circular dependency between symbols.
13
+ */
14
+ export class CircularDependency extends Schema.TaggedError()("CircularDependency", {
15
+ message: Schema.String,
16
+ cycle: Schema.Array(Schema.String),
17
+ }) {
18
+ }
19
+ /**
20
+ * Validate that all plugin.consumes are satisfied by some plugin.provides.
21
+ */
22
+ export const validateConsumes = (plugins) => Effect.gen(function* () {
23
+ const provided = new Set(plugins.flatMap(plugin => plugin.provides));
24
+ yield* Effect.forEach(plugins, plugin => Effect.forEach(plugin.consumes ?? [], cap => {
25
+ if (!provided.has(cap)) {
26
+ return Effect.fail(new UnsatisfiedCapability({
27
+ message: `Plugin "${plugin.name}" consumes "${cap}" but no plugin provides it`,
28
+ capability: cap,
29
+ consumer: plugin.name,
30
+ }));
31
+ }
32
+ return Effect.succeed(undefined);
33
+ }));
34
+ });
35
+ /**
36
+ * Validate that symbol dependencies form a DAG (no cycles).
37
+ */
38
+ export const validateDependencyGraph = (declarations) => Effect.gen(function* () {
39
+ const adjacency = new Map();
40
+ for (const decl of declarations) {
41
+ adjacency.set(decl.capability, [...(decl.dependsOn ?? [])]);
42
+ }
43
+ const visited = new Set();
44
+ const recursionStack = new Set();
45
+ const detectCycle = (cap, path) => Effect.suspend(() => {
46
+ if (recursionStack.has(cap)) {
47
+ const cycleStart = path.indexOf(cap);
48
+ const cycle = [...path.slice(cycleStart), cap];
49
+ return Effect.fail(new CircularDependency({
50
+ message: `Circular dependency detected: ${cycle.join(" -> ")}`,
51
+ cycle,
52
+ }));
53
+ }
54
+ if (visited.has(cap)) {
55
+ return Effect.void;
56
+ }
57
+ visited.add(cap);
58
+ recursionStack.add(cap);
59
+ const deps = adjacency.get(cap) ?? [];
60
+ return Effect.forEach(deps, dep => detectCycle(dep, [...path, cap]), { discard: true }).pipe(Effect.ensuring(Effect.sync(() => {
61
+ recursionStack.delete(cap);
62
+ })));
63
+ });
64
+ yield* Effect.forEach(Array.from(adjacency.keys()), cap => detectCycle(cap, []));
65
+ });
66
+ /**
67
+ * Run all validations on plugins and their declarations.
68
+ */
69
+ export const validateAll = (plugins, registry) => Effect.all([validateConsumes(plugins), validateDependencyGraph(registry.all())]);
70
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/runtime/validation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/services/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAkC,MAAM,QAAQ,CAAC;AAEhF,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;QACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;KAC9B,KAAK,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,cAAc,GAAG,aAAa,CAAC,CAAC;CACrE;;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,wBAGtC;CAAG;AAEN;;GAEG;AACH,eAAO,MAAM,iBAAiB,UAK7B,CAAC;AA4BF;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAkEjD;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,gDAA2D,CAAC;AAEzF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/services/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAkC,MAAM,QAAQ,CAAC;AAGhF,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;QACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;KAC9B,KAAK,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,cAAc,GAAG,aAAa,CAAC,CAAC;CACrE;;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,wBAGtC;CAAG;AAEN;;GAEG;AACH,eAAO,MAAM,iBAAiB,UAK7B,CAAC;AA+BF;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAwEjD;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,gDAA2D,CAAC;AAEzF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D"}
@@ -4,8 +4,9 @@
4
4
  * Loads and validates pgsourcerer.config.{ts,js,mjs} using lilconfig.
5
5
  * Wraps the async config loading in Effect for proper error handling.
6
6
  */
7
- import { Context, Effect, Layer, Schema as S, pipe } from "effect";
7
+ import { Context, Effect, Layer, Schema as S, ParseResult, pipe } from "effect";
8
8
  import { lilconfig } from "lilconfig";
9
+ import path from "node:path";
9
10
  import { Config } from "../config.js";
10
11
  import { ConfigNotFound, ConfigInvalid } from "../errors.js";
11
12
  /**
@@ -39,11 +40,14 @@ function createLilconfig() {
39
40
  });
40
41
  }
41
42
  /**
42
- * Format Schema decode errors into readable strings
43
+ * Format Schema decode errors into readable strings using ArrayFormatter
43
44
  */
44
45
  function formatSchemaErrors(error) {
45
- // Use the error message which is already formatted
46
- return [error.message];
46
+ const issues = ParseResult.ArrayFormatter.formatErrorSync(error);
47
+ return issues.map((issue) => {
48
+ const path = issue.path.join(".");
49
+ return path ? `${path}: ${issue.message}` : issue.message;
50
+ });
47
51
  }
48
52
  /**
49
53
  * Create a ConfigLoader implementation
@@ -76,13 +80,16 @@ export function createConfigLoader() {
76
80
  }));
77
81
  }
78
82
  const filepath = result.filepath;
83
+ const configDir = path.dirname(filepath);
79
84
  // Validate with Effect Schema
80
85
  const parseResult = yield* pipe(S.decodeUnknown(Config)(result.config), Effect.mapError(parseError => new ConfigInvalid({
81
86
  message: `Invalid configuration in ${filepath}`,
82
87
  path: filepath,
83
88
  errors: formatSchemaErrors(parseError),
84
89
  })));
85
- // Return resolved config
90
+ // Return resolved config with plugins flattened
91
+ // parseResult.plugins may contain Plugin | Plugin[] entries
92
+ const flatPlugins = parseResult.plugins.flat();
86
93
  const resolved = {
87
94
  connectionString: parseResult.connectionString,
88
95
  schemas: parseResult.schemas,
@@ -91,8 +98,10 @@ export function createConfigLoader() {
91
98
  typeHints: parseResult.typeHints,
92
99
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- inflection is S.Any in schema, validated by plugin system
93
100
  inflection: parseResult.inflection,
94
- plugins: parseResult.plugins,
101
+ plugins: flatPlugins,
95
102
  formatter: parseResult.formatter,
103
+ defaultFile: parseResult.defaultFile,
104
+ configDir,
96
105
  };
97
106
  return resolved;
98
107
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/services/config-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/services/config-loader.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,49 @@
1
1
  /**
2
2
  * Config Service
3
3
  *
4
- * Provides loaded configuration via Effect DI.
4
+ * Effect-based configuration with multiple providers.
5
5
  *
6
- * This is the service that effects depend on to get config.
7
- * The config-loader.ts provides the loading logic, while this
8
- * module provides the service tag and layer constructors.
6
+ * ## Provider Pattern
7
+ *
8
+ * ConfigProvider is how config gets loaded - file, in-memory, wizard.
9
+ * Each provider returns Effect<ResolvedConfig, ConfigError>.
10
+ *
11
+ * Providers can be chained with withFallback:
12
+ * withFallback(FileProvider(), () => WizardProvider())
13
+ *
14
+ * ## Layer Constructors
9
15
  *
10
- * Layers available:
11
16
  * - ConfigFromFile: Load from file, fail if not found
12
- * - ConfigWithInit: Load from file, or run interactive init (for CLI)
13
- * - ConfigTest: Provide config directly for testing
17
+ * - ConfigFromMemory: Use provided config directly (testing)
18
+ * - ConfigWithFallback: Load from file, fallback to another provider
14
19
  */
15
- import { Context, Layer } from "effect";
16
- import { FileSystem, Terminal } from "@effect/platform";
17
- import type { PlatformError } from "@effect/platform/Error";
20
+ import { Context, Effect, Layer } from "effect";
18
21
  import type { ResolvedConfig } from "../config.js";
19
22
  import { ConfigNotFound, ConfigInvalid } from "../errors.js";
23
+ /**
24
+ * A ConfigProvider knows how to produce a ResolvedConfig.
25
+ * Different providers: file, wizard, in-memory, env vars.
26
+ */
27
+ export interface ConfigProvider {
28
+ readonly load: Effect.Effect<ResolvedConfig, ConfigNotFound | ConfigInvalid>;
29
+ }
30
+ /**
31
+ * File-based config provider using lilconfig.
32
+ */
33
+ export declare const FileConfigProvider: (opts?: {
34
+ readonly configPath?: string;
35
+ readonly searchFrom?: string;
36
+ }) => ConfigProvider;
37
+ /**
38
+ * In-memory config provider - returns the provided config directly.
39
+ * Useful for testing or programmatic usage.
40
+ */
41
+ export declare const InMemoryConfigProvider: (config: ResolvedConfig) => ConfigProvider;
42
+ /**
43
+ * Create a provider that tries primary first, falls back to secondary.
44
+ * ConfigNotFound from primary triggers fallback; ConfigInvalid propagates.
45
+ */
46
+ export declare const withFallback: (primary: ConfigProvider, fallback: () => ConfigProvider) => ConfigProvider;
20
47
  declare const ConfigService_base: Context.TagClass<ConfigService, "ConfigService", ResolvedConfig>;
21
48
  /**
22
49
  * Service that provides the loaded configuration.
@@ -28,27 +55,30 @@ export declare class ConfigService extends ConfigService_base {
28
55
  * Load config from file. Fails with ConfigNotFound if not found.
29
56
  */
30
57
  export declare const ConfigFromFile: (opts?: {
31
- configPath?: string;
32
- searchFrom?: string;
58
+ readonly configPath?: string;
59
+ readonly searchFrom?: string;
33
60
  }) => Layer.Layer<ConfigService, ConfigNotFound | ConfigInvalid>;
34
61
  /**
35
- * Load config from file, or run interactive init if not found.
36
- * This is the layer to use for CLI commands.
37
- *
38
- * Flow:
39
- * 1. Try to load config from file
40
- * 2. If ConfigNotFound, print message and run init prompts
41
- * 3. After init writes config, load it
42
- * 4. Return the loaded config
62
+ * Provide config directly (for testing or programmatic use).
43
63
  */
44
- export declare const ConfigWithInit: (opts?: {
45
- configPath?: string;
46
- searchFrom?: string;
47
- }) => Layer.Layer<ConfigService, ConfigInvalid | Error | Terminal.QuitException | PlatformError, Terminal.Terminal | FileSystem.FileSystem>;
64
+ export declare const ConfigFromMemory: (config: ResolvedConfig) => Layer.Layer<ConfigService>;
48
65
  /**
49
- * Provide config directly for testing.
66
+ * Alias for ConfigFromMemory - clearer name for test contexts.
50
67
  */
51
68
  export declare const ConfigTest: (config: ResolvedConfig) => Layer.Layer<ConfigService>;
69
+ /**
70
+ * Load config with fallback provider chain.
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * // Try file first, fall back to wizard if not found
75
+ * ConfigWithFallback(
76
+ * FileConfigProvider(),
77
+ * () => WizardConfigProvider()
78
+ * )
79
+ * ```
80
+ */
81
+ export declare const ConfigWithFallback: (primary: ConfigProvider, fallback: () => ConfigProvider) => Layer.Layer<ConfigService, ConfigNotFound | ConfigInvalid>;
52
82
  /**
53
83
  * Get the default search paths for config files.
54
84
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAW,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;;AAO7D;;;GAGG;AACH,qBAAa,aAAc,SAAQ,kBAGhC;CAAG;AAMN;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,cAAc,GAAG,aAAa,CAO1D,CAAC;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KAAG,KAAK,CAAC,KAAK,CACb,aAAa,EACb,aAAa,GAAG,KAAK,GAAG,QAAQ,CAAC,aAAa,GAAG,aAAa,EAC9D,QAAQ,CAAC,QAAQ,GAAG,UAAU,CAAC,UAAU,CAuBxC,CAAC;AAEJ;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,cAAc,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CACvC,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,aAAY,MAAsB,KAAG,MAAM,EACxB,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAO7D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,cAAc,GAAG,aAAa,CAAC,CAAC;CAC9E;AAMD;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,KAAG,cAKF,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,QAAQ,cAAc,KAAG,cAE9D,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,YAAY,GACvB,SAAS,cAAc,EACvB,UAAU,MAAM,cAAc,KAC7B,cAED,CAAC;;AAMH;;;GAGG;AACH,qBAAa,aAAc,SAAQ,kBAA6D;CAAG;AAMnG;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO;IACpC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,cAAc,GAAG,aAAa,CACD,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,cAAc,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAC7C,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,UAAU,WANkB,cAAc,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAMzC,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,GAC7B,SAAS,cAAc,EACvB,UAAU,MAAM,cAAc,KAC7B,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,cAAc,GAAG,aAAa,CACO,CAAC;AAMpE;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,aAAY,MAAsB,KAAG,MAAM,EACxB,CAAC"}
@@ -1,20 +1,51 @@
1
1
  /**
2
2
  * Config Service
3
3
  *
4
- * Provides loaded configuration via Effect DI.
4
+ * Effect-based configuration with multiple providers.
5
5
  *
6
- * This is the service that effects depend on to get config.
7
- * The config-loader.ts provides the loading logic, while this
8
- * module provides the service tag and layer constructors.
6
+ * ## Provider Pattern
7
+ *
8
+ * ConfigProvider is how config gets loaded - file, in-memory, wizard.
9
+ * Each provider returns Effect<ResolvedConfig, ConfigError>.
10
+ *
11
+ * Providers can be chained with withFallback:
12
+ * withFallback(FileProvider(), () => WizardProvider())
13
+ *
14
+ * ## Layer Constructors
9
15
  *
10
- * Layers available:
11
16
  * - ConfigFromFile: Load from file, fail if not found
12
- * - ConfigWithInit: Load from file, or run interactive init (for CLI)
13
- * - ConfigTest: Provide config directly for testing
17
+ * - ConfigFromMemory: Use provided config directly (testing)
18
+ * - ConfigWithFallback: Load from file, fallback to another provider
14
19
  */
15
- import { Console, Context, Effect, Layer } from "effect";
20
+ import { Context, Effect, Layer } from "effect";
16
21
  import { createConfigLoader, CONFIG_FILE_NAMES } from "./config-loader.js";
17
22
  // ============================================================================
23
+ // Config Providers
24
+ // ============================================================================
25
+ /**
26
+ * File-based config provider using lilconfig.
27
+ */
28
+ export const FileConfigProvider = (opts) => ({
29
+ load: Effect.gen(function* () {
30
+ const loader = createConfigLoader();
31
+ return yield* loader.load(opts);
32
+ }),
33
+ });
34
+ /**
35
+ * In-memory config provider - returns the provided config directly.
36
+ * Useful for testing or programmatic usage.
37
+ */
38
+ export const InMemoryConfigProvider = (config) => ({
39
+ load: Effect.succeed(config),
40
+ });
41
+ /**
42
+ * Create a provider that tries primary first, falls back to secondary.
43
+ * ConfigNotFound from primary triggers fallback; ConfigInvalid propagates.
44
+ */
45
+ export const withFallback = (primary, fallback) => ({
46
+ load: primary.load.pipe(Effect.catchTag("ConfigNotFound", () => fallback().load)),
47
+ });
48
+ // ============================================================================
18
49
  // Service Definition
19
50
  // ============================================================================
20
51
  /**
@@ -29,36 +60,31 @@ export class ConfigService extends Context.Tag("ConfigService")() {
29
60
  /**
30
61
  * Load config from file. Fails with ConfigNotFound if not found.
31
62
  */
32
- export const ConfigFromFile = (opts) => Layer.effect(ConfigService, Effect.gen(function* () {
33
- const loader = createConfigLoader();
34
- return yield* loader.load(opts);
35
- }));
63
+ export const ConfigFromFile = (opts) => Layer.effect(ConfigService, FileConfigProvider(opts).load);
36
64
  /**
37
- * Load config from file, or run interactive init if not found.
38
- * This is the layer to use for CLI commands.
39
- *
40
- * Flow:
41
- * 1. Try to load config from file
42
- * 2. If ConfigNotFound, print message and run init prompts
43
- * 3. After init writes config, load it
44
- * 4. Return the loaded config
65
+ * Provide config directly (for testing or programmatic use).
66
+ */
67
+ export const ConfigFromMemory = (config) => Layer.succeed(ConfigService, config);
68
+ /**
69
+ * Alias for ConfigFromMemory - clearer name for test contexts.
45
70
  */
46
- export const ConfigWithInit = (opts) => Layer.effect(ConfigService, Effect.gen(function* () {
47
- const loader = createConfigLoader();
48
- return yield* loader.load(opts).pipe(Effect.catchTag("ConfigNotFound", (error) => Effect.gen(function* () {
49
- yield* Console.error(`\n✗ No config file found`);
50
- yield* Console.error(` Searched: ${error.searchPaths.join(", ")}`);
51
- // Dynamic import to avoid circular dependency with init.ts
52
- const initModule = yield* Effect.promise(() => import("../init.js"));
53
- const result = yield* initModule.runInit;
54
- // Load the newly created config
55
- return yield* loader.load({ configPath: result.configPath });
56
- })));
57
- }));
71
+ export const ConfigTest = ConfigFromMemory;
58
72
  /**
59
- * Provide config directly for testing.
73
+ * Load config with fallback provider chain.
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * // Try file first, fall back to wizard if not found
78
+ * ConfigWithFallback(
79
+ * FileConfigProvider(),
80
+ * () => WizardConfigProvider()
81
+ * )
82
+ * ```
60
83
  */
61
- export const ConfigTest = (config) => Layer.succeed(ConfigService, config);
84
+ export const ConfigWithFallback = (primary, fallback) => Layer.effect(ConfigService, withFallback(primary, fallback).load);
85
+ // ============================================================================
86
+ // Utility
87
+ // ============================================================================
62
88
  /**
63
89
  * Get the default search paths for config files.
64
90
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAKzD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAG5D;CAAG;AAEN,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAG9B,EAA8D,EAAE,CAC/D,KAAK,CAAC,MAAM,CACV,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC,CAAC,CACH,CAAC;AAEJ;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAG9B,EAIC,EAAE,CACF,KAAK,CAAC,MAAM,CACV,aAAa,EACb,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IAEpC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAClC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,KAAqB,EAAE,EAAE,CAC1D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACjD,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEpE,2DAA2D;QAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;QAEzC,gCAAgC;QAChC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CACH,CACF,CAAC;AACJ,CAAC,CAAC,CACH,CAAC;AAEJ;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAsB,EAA8B,EAAE,CAC/E,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,aAAqB,OAAO,CAAC,GAAG,EAAE,EAAY,EAAE,CACnF,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAGhD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAc3E,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAGlC,EAAkB,EAAE,CAAC,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACxB,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC;CACH,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAAsB,EAAkB,EAAE,CAAC,CAAC;IACjF,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;CAC7B,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAAuB,EACvB,QAA8B,EACd,EAAE,CAAC,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;CAClF,CAAC,CAAC;AAEH,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAiC;CAAG;AAEnG,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAG9B,EAA8D,EAAE,CAC/D,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAsB,EAA8B,EAAE,CACrF,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,OAAuB,EACvB,QAA8B,EAC8B,EAAE,CAC9D,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAEpE,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,aAAqB,OAAO,CAAC,GAAG,EAAE,EAAY,EAAE,CACnF,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC"}
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * File Writer Service
3
3
  *
4
- * Writes buffered emissions to disk using @effect/platform FileSystem.
4
+ * Writes generated files to disk using @effect/platform FileSystem.
5
5
  */
6
6
  import { Context, Effect, Layer } from "effect";
7
7
  import { FileSystem, Path } from "@effect/platform";
8
- import type { EmissionEntry } from "./emissions.js";
8
+ import type { EmittedFile } from "../runtime/emit.js";
9
9
  import { WriteError } from "../errors.js";
10
10
  /**
11
11
  * Result of a write operation
@@ -33,7 +33,7 @@ export interface FileWriter {
33
33
  /**
34
34
  * Write all emissions to disk
35
35
  */
36
- readonly writeAll: (emissions: readonly EmissionEntry[], options: WriteOptions) => Effect.Effect<readonly WriteResult[], WriteError, FileSystem.FileSystem | Path.Path>;
36
+ readonly writeAll: (emissions: readonly EmittedFile[], options: WriteOptions) => Effect.Effect<readonly WriteResult[], WriteError, FileSystem.FileSystem | Path.Path>;
37
37
  }
38
38
  declare const FileWriterSvc_base: Context.TagClass<FileWriterSvc, "FileWriter", FileWriter>;
39
39
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"file-writer.d.ts","sourceRoot":"","sources":["../../src/services/file-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAsB,MAAM,QAAQ,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,SAAS,EAAE,SAAS,aAAa,EAAE,EACnC,OAAO,EAAE,YAAY,KAClB,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;CAC1F;;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,kBAGhC;CAAG;AAYN;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAiE7C;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,0CAAmD,CAAA"}
1
+ {"version":3,"file":"file-writer.d.ts","sourceRoot":"","sources":["../../src/services/file-writer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAsB,MAAM,QAAQ,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,CACjB,SAAS,EAAE,SAAS,WAAW,EAAE,EACjC,OAAO,EAAE,YAAY,KAClB,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;CAC3F;;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,kBAAsD;CAAG;AAc5F;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,UAAU,CAqE7C;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,0CAAmD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * File Writer Service
3
3
  *
4
- * Writes buffered emissions to disk using @effect/platform FileSystem.
4
+ * Writes generated files to disk using @effect/platform FileSystem.
5
5
  */
6
6
  import { Context, Effect, Layer, pipe, Array as Arr } from "effect";
7
7
  import { FileSystem, Path } from "@effect/platform";
@@ -29,7 +29,7 @@ export function createFileWriter() {
29
29
  const pathSvc = yield* Path.Path;
30
30
  const outputDir = options.outputDir;
31
31
  // Collect unique directories that need to be created
32
- const directories = pipe(emissions, Arr.map((e) => pathSvc.dirname(pathSvc.join(outputDir, e.path))), Arr.dedupe);
32
+ const directories = pipe(emissions, Arr.map(e => pathSvc.dirname(pathSvc.join(outputDir, e.path))), Arr.dedupe);
33
33
  // In dry-run mode, just return what would be written
34
34
  if (options.dryRun) {
35
35
  return pipe(emissions, Arr.map((e) => ({
@@ -39,12 +39,11 @@ export function createFileWriter() {
39
39
  })));
40
40
  }
41
41
  // Create directories
42
- yield* Effect.forEach(directories, (dir) => fs.makeDirectory(dir, { recursive: true }).pipe(Effect.catchAll((err) =>
42
+ yield* Effect.forEach(directories, dir => fs.makeDirectory(dir, { recursive: true }).pipe(Effect.catchAll(err =>
43
43
  // Ignore "already exists" errors
44
44
  err._tag === "SystemError" && err.reason === "AlreadyExists"
45
45
  ? Effect.void
46
- : Effect.fail(toWriteError(dir)(err)))), { concurrency: 1 } // Sequential to avoid race conditions
47
- );
46
+ : Effect.fail(toWriteError(dir)(err)))), { concurrency: 1 });
48
47
  // Write files
49
48
  const results = yield* Effect.forEach(emissions, (entry) => {
50
49
  const fullPath = pathSvc.join(outputDir, entry.path);
@@ -53,9 +52,8 @@ export function createFileWriter() {
53
52
  return fs.writeFileString(fullPath, content).pipe(Effect.map(() => ({
54
53
  path: fullPath,
55
54
  written: true,
56
- })), Effect.catchAll((err) => Effect.fail(toWriteError(fullPath)(err))));
57
- }, { concurrency: 10 } // Parallel file writes
58
- );
55
+ })), Effect.catchAll(err => Effect.fail(toWriteError(fullPath)(err))));
56
+ }, { concurrency: 10 });
59
57
  return results;
60
58
  }),
61
59
  };
@@ -1 +1 @@
1
- {"version":3,"file":"file-writer.js","sourceRoot":"","sources":["../../src/services/file-writer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-writer.js","sourceRoot":"","sources":["../../src/services/file-writer.ts"],"names":[],"mappings":"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"}