@danielfgray/pg-sourcerer 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -3,26 +3,60 @@
3
3
  *
4
4
  * Provides configurable naming conventions for entities, fields, enums, etc.
5
5
  * Users configure with simple string→string functions that compose naturally.
6
+ *
7
+ * ## Inflection Registry
8
+ *
9
+ * The registry tracks the provenance of inflected names, allowing the file
10
+ * assignment system to determine which base entity a derived name belongs to.
11
+ *
12
+ * Example: `UserInsert` → base entity `User`, variant `insert`
13
+ *
14
+ * This solves the problem where schemas for `UserInsert` would incorrectly
15
+ * go to `generated/userinsert/` instead of `generated/user/`.
6
16
  */
7
17
  import { Context, Layer } from "effect";
8
18
  import type { PgAttribute, PgClass, PgProc, PgType } from "@danielfgray/pg-introspection";
9
19
  import type { SmartTags, ShapeKind } from "../ir/index.js";
10
20
  /**
11
- * Inflection helper functions for use in configuration.
12
- *
13
- * Users can compose these in their config:
14
- * @example
15
- * ```typescript
16
- * import { inflect } from "pg-sourcerer"
21
+ * The kind of name variant being registered.
22
+ * Extends ShapeKind with additional categories for enums, composites, etc.
23
+ */
24
+ export type NameVariant = ShapeKind | "enum" | "composite" | "domain" | "function" | "entity";
25
+ /**
26
+ * Information about an inflected name and its provenance.
27
+ */
28
+ export interface InflectedName {
29
+ /** The inflected name (e.g., "UserInsert") */
30
+ readonly name: string;
31
+ /** Base entity this derives from (e.g., "User") */
32
+ readonly baseEntity: string;
33
+ /** What kind of variant this is */
34
+ readonly variant: NameVariant;
35
+ /** Origin for debugging (e.g., "shapeName(User, insert)") */
36
+ readonly origin: string;
37
+ }
38
+ /**
39
+ * Registry for tracking inflected names and their provenance.
17
40
  *
18
- * const config = {
19
- * inflection: {
20
- * entityName: (name) => inflect.pascalCase(inflect.singularize(name)),
21
- * fieldName: inflect.camelCase,
22
- * }
23
- * }
24
- * ```
41
+ * Used by the file assignment system to determine which base entity
42
+ * a derived name (like "UserInsert") belongs to.
43
+ */
44
+ export interface InflectionRegistry {
45
+ /** Record an inflected name with its provenance */
46
+ register(info: InflectedName): void;
47
+ /** Look up provenance by inflected name */
48
+ lookup(name: string): InflectedName | undefined;
49
+ /** Get all names registered for a base entity */
50
+ getVariants(baseEntity: string): readonly InflectedName[];
51
+ /** Check if a name has already been registered (potential conflict) */
52
+ hasConflict(name: string): boolean;
53
+ /** Get all registered names (for debugging) */
54
+ getAll(): ReadonlyMap<string, InflectedName>;
55
+ }
56
+ /**
57
+ * Create a new InflectionRegistry instance.
25
58
  */
59
+ export declare function createInflectionRegistry(): InflectionRegistry;
26
60
  export declare const inflect: {
27
61
  /** Convert snake_case to camelCase */
28
62
  readonly camelCase: (self: string) => string;
@@ -30,6 +64,8 @@ export declare const inflect: {
30
64
  readonly pascalCase: (self: string) => string;
31
65
  /** Convert camelCase to snake_case */
32
66
  readonly snakeCase: (self: string) => string;
67
+ /** Convert PascalCase/camelCase to kebab-case */
68
+ readonly kebabCase: (str: string) => string;
33
69
  /** Singularize a word (users → user) */
34
70
  readonly singularize: (word: string) => string;
35
71
  /** Pluralize a word (user → users) */
@@ -44,14 +80,36 @@ export declare const inflect: {
44
80
  readonly uppercase: (s: string) => string;
45
81
  };
46
82
  /**
47
- * Core inflection interface - shared naming transformations
83
+ * Core inflection interface - shared naming transformations.
84
+ *
85
+ * Includes a registry that tracks the provenance of inflected names,
86
+ * allowing file assignment to correctly group derived names (like UserInsert)
87
+ * with their base entity (User).
88
+ *
89
+ * ## Semantic vs Mechanical Methods
90
+ *
91
+ * Plugins should use SEMANTIC methods that express intent:
92
+ * - entityRoutePath(entity) → "/users"
93
+ *
94
+ * NOT mechanical methods that assume casing:
95
+ * - toCamelCase(entityName) + "Create" ❌
96
+ *
97
+ * This allows users to customize naming conventions without plugins
98
+ * having to understand the transformations.
48
99
  */
49
100
  export interface CoreInflection {
50
101
  readonly camelCase: (text: string) => string;
51
102
  readonly pascalCase: (text: string) => string;
103
+ readonly kebabCase: (text: string) => string;
52
104
  readonly pluralize: (text: string) => string;
53
105
  readonly singularize: (text: string) => string;
54
106
  readonly safeIdentifier: (text: string) => string;
107
+ /**
108
+ * Build a variable name from entity and suffix.
109
+ * @example variableName("User", "Router") → "userRouter"
110
+ * @example variableName("User", "ElysiaRoutes") → "userElysiaRoutes"
111
+ */
112
+ readonly variableName: (entityName: string, suffix: string) => string;
55
113
  readonly entityName: (pgClass: PgClass, tags: SmartTags) => string;
56
114
  readonly shapeName: (entityName: string, kind: ShapeKind) => string;
57
115
  readonly fieldName: (pgAttribute: PgAttribute, tags: SmartTags) => string;
@@ -59,6 +117,36 @@ export interface CoreInflection {
59
117
  readonly enumValueName: (value: string) => string;
60
118
  readonly relationName: (name: string) => string;
61
119
  readonly functionName: (pgProc: PgProc, tags: SmartTags) => string;
120
+ readonly folderName: (entityName: string) => string;
121
+ /**
122
+ * Base route path for an entity (plural, kebab-case).
123
+ * @example entityRoutePath("User") → "/users"
124
+ * @example entityRoutePath("BlogPost") → "/blog-posts"
125
+ */
126
+ readonly entityRoutePath: (entityName: string) => string;
127
+ /**
128
+ * Route path segment for cursor pagination.
129
+ * @example cursorRoutePath("created_at") → "/by-created-at"
130
+ * @example cursorRoutePath("updatedAt") → "/by-updated-at"
131
+ */
132
+ readonly cursorRoutePath: (columnName: string) => string;
133
+ /**
134
+ * Route path for indexed column lookup (with param).
135
+ * @example lookupRoutePath("email", "email") → "/by-email/:email"
136
+ * @example lookupRoutePath("user_id", "userId") → "/by-user-id/:userId"
137
+ */
138
+ readonly lookupRoutePath: (columnName: string, paramName: string) => string;
139
+ /**
140
+ * Route path for a custom function.
141
+ * @example functionRoutePath("calculateTotal") → "/calculate-total"
142
+ */
143
+ readonly functionRoutePath: (fnName: string) => string;
144
+ /**
145
+ * Registry tracking the provenance of inflected names.
146
+ * Auto-populated when shapeName(), entityName(), enumName() are called.
147
+ * Used by file assignment to determine base entity for derived names.
148
+ */
149
+ readonly registry: InflectionRegistry;
62
150
  }
63
151
  declare const Inflection_base: Context.TagClass<Inflection, "Inflection", CoreInflection>;
64
152
  /** Service tag */
@@ -140,6 +228,11 @@ export interface InflectionConfig {
140
228
  * Default: camelCase (overloads are warned and skipped)
141
229
  */
142
230
  readonly functionName?: TransformFn;
231
+ /**
232
+ * Transform entity name → folder name for file output.
233
+ * Default: uncapitalize (User → user, UserEmail → userEmail)
234
+ */
235
+ readonly folderName?: TransformFn;
143
236
  }
144
237
  /**
145
238
  * Default inflection transforms - applies common JS/TS naming conventions:
@@ -156,11 +249,11 @@ export interface InflectionConfig {
156
249
  */
157
250
  export declare const defaultTransforms: InflectionConfig;
158
251
  /**
159
- * Default inflection implementation using standard JS/TS naming conventions.
160
- */
161
- export declare const defaultInflection: CoreInflection;
162
- /**
163
- * Create a CoreInflection instance with optional configuration overrides.
252
+ * Create a CoreInflection instance with its own registry and optional config.
253
+ *
254
+ * Each instance gets a fresh InflectionRegistry that tracks name provenance
255
+ * for file assignment purposes. The registry is auto-populated when
256
+ * shapeName(), entityName(), enumName(), and functionName() are called.
164
257
  *
165
258
  * By default, applies standard JS/TS naming conventions (PascalCase entities,
166
259
  * camelCase relations, etc.). User config is merged on top of defaults.
@@ -178,17 +271,20 @@ export declare const defaultInflection: CoreInflection;
178
271
  * fieldName: inflect.camelCase, // Also camelCase fields
179
272
  * })
180
273
  *
181
- * // Use identity (raw DB names) for everything
182
- * const inflection = createInflection({
183
- * entityName: (name) => name,
184
- * fieldName: (name) => name,
185
- * enumName: (name) => name,
186
- * shapeSuffix: (name) => name,
187
- * relationName: (name) => name,
188
- * })
274
+ * // Look up provenance later
275
+ * const info = inflection.registry.lookup("UserInsert")
276
+ * // { name: "UserInsert", baseEntity: "User", variant: "insert", ... }
189
277
  * ```
190
278
  */
191
279
  export declare function createInflection(config?: InflectionConfig): CoreInflection;
280
+ /**
281
+ * Default inflection instance - creates a new instance with standard conventions.
282
+ *
283
+ * Note: This is a getter that returns a fresh instance each time to ensure
284
+ * each usage gets its own registry. For most cases, use createInflection()
285
+ * or makeInflectionLayer() directly.
286
+ */
287
+ export declare const defaultInflection: CoreInflection;
192
288
  /**
193
289
  * Create an Effect Layer that provides inflection with optional configuration overrides.
194
290
  *
@@ -239,6 +335,9 @@ export declare function composeInflectionConfigs(pluginDefaults: InflectionConfi
239
335
  * This is used by PluginRunner to merge plugin's inflectionDefaults
240
336
  * with the user's configured inflection.
241
337
  *
338
+ * The composed inflection shares the base inflection's registry, so all
339
+ * registrations go to the same place regardless of composition.
340
+ *
242
341
  * @param baseInflection - The user's CoreInflection instance
243
342
  * @param pluginDefaults - Plugin's default transforms to apply first
244
343
  * @returns New CoreInflection with composed behavior
@@ -1 +1 @@
1
- {"version":3,"file":"inflection.d.ts","sourceRoot":"","sources":["../../src/services/inflection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inflection.d.ts","sourceRoot":"","sources":["../../src/services/inflection.ts"],"names":[],"mappings":"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"}