11import type { WorkspaceExports } from '../actions' ;
22import type { WorkspaceBlobs } from '../blobs' ;
33import type { Tables } from '../db/core' ;
4- import type {
5- Provider ,
6- ProviderExports ,
7- WorkspaceProviderMap ,
8- } from '../provider' ;
4+ import type { InferProviderExports , Provider } from '../provider' ;
95import type { WorkspaceSchema , WorkspaceValidators } from '../schema' ;
106import type { EpicenterDir , StorageDir } from '../types' ;
117
@@ -103,17 +99,11 @@ export function defineWorkspace<
10399 const TDeps extends readonly AnyWorkspaceConfig [ ] ,
104100 const TId extends string ,
105101 TWorkspaceSchema extends WorkspaceSchema ,
106- const TProviderResults extends WorkspaceProviderMap ,
102+ const TProviders extends Record < string , Provider < TWorkspaceSchema > > ,
107103 TExports extends WorkspaceExports ,
108104> (
109- workspace : WorkspaceConfig <
110- TDeps ,
111- TId ,
112- TWorkspaceSchema ,
113- TProviderResults ,
114- TExports
115- > ,
116- ) : WorkspaceConfig < TDeps , TId , TWorkspaceSchema , TProviderResults , TExports > {
105+ workspace : WorkspaceConfig < TDeps , TId , TWorkspaceSchema , TProviders , TExports > ,
106+ ) : WorkspaceConfig < TDeps , TId , TWorkspaceSchema , TProviders , TExports > {
117107 // Validate workspace ID
118108 if ( ! workspace . id || typeof workspace . id !== 'string' ) {
119109 throw new Error ( 'Workspace must have a valid string ID' ) ;
@@ -142,6 +132,14 @@ export function defineWorkspace<
142132 *
143133 * Fully-featured workspace configuration used for defining workspaces and their dependencies.
144134 *
135+ * ## Provider Type Inference
136+ *
137+ * The `TProviders` type parameter captures the actual provider functions you pass.
138+ * The `exports` factory receives provider exports derived via `InferProviderExports`:
139+ * - Provider returns `{ db: Db }` → exports receives `{ db: Db }`
140+ * - Provider returns `void` → exports receives `Record<string, never>` (empty object)
141+ * - Provider returns `Promise<{ db: Db }>` → exports receives `{ db: Db }` (unwrapped)
142+ *
145143 * ## Dependency Constraint
146144 *
147145 * The `dependencies` field uses `AnyWorkspaceConfig[]` as a minimal constraint.
@@ -161,18 +159,16 @@ export type WorkspaceConfig<
161159 TDeps extends readonly AnyWorkspaceConfig [ ] = readonly AnyWorkspaceConfig [ ] ,
162160 TId extends string = string ,
163161 TWorkspaceSchema extends WorkspaceSchema = WorkspaceSchema ,
164- TProviderResults extends WorkspaceProviderMap = WorkspaceProviderMap ,
162+ TProviders extends Record < string , Provider < TWorkspaceSchema > > = Record <
163+ string ,
164+ Provider < TWorkspaceSchema >
165+ > ,
165166 TExports extends WorkspaceExports = WorkspaceExports ,
166167> = {
167168 id : TId ;
168169 tables : TWorkspaceSchema ;
169170 dependencies ?: TDeps ;
170- providers : {
171- [ K in keyof TProviderResults ] : Provider <
172- TWorkspaceSchema ,
173- TProviderResults [ K ] extends ProviderExports ? TProviderResults [ K ] : ProviderExports
174- > ;
175- } ;
171+ providers : TProviders ;
176172 /**
177173 * Factory function that creates workspace exports (actions, utilities, etc.)
178174 *
@@ -213,7 +209,7 @@ export type WorkspaceConfig<
213209 schema : TWorkspaceSchema ;
214210 validators : WorkspaceValidators < TWorkspaceSchema > ;
215211 workspaces : WorkspacesToExports < TDeps > ;
216- providers : TProviderResults ;
212+ providers : { [ K in keyof TProviders ] : InferProviderExports < TProviders [ K ] > } ;
217213 blobs : WorkspaceBlobs < TWorkspaceSchema > ;
218214 storageDir : StorageDir | undefined ;
219215 epicenterDir : EpicenterDir | undefined ;
0 commit comments