refactor: projection-key home moves to src/types.ts with /types + /client/types dual outlets

This commit is contained in:
imccyu
2026-07-27 22:22:33 +08:00
parent 75ea589976
commit 38ffb78e1c
9 changed files with 58 additions and 31 deletions

View File

@@ -15,9 +15,13 @@
"types": "./lib/types/invariant.d.ts",
"default": "./lib/invariant.js"
},
"./types": {
"types": "./lib/types/types.d.ts",
"default": "./lib/types/types.js"
},
"./client/types": {
"types": "./lib/types/client/types.d.ts",
"default": "./lib/types/client/types.js"
"types": "./lib/types/client/index.d.ts",
"default": "./lib/types/client/index.js"
},
"./src/*": "./src/*",
"./package.json": "./package.json"

View File

@@ -0,0 +1,10 @@
/**
* Browser half-entry of the todo domain: a pure re-export of the package's
* types outlet. Client code imports ONLY the client namespace (repo
* discipline), so `./client/types` projects the same single-source content
* `./types` serves to host consumers — zero duplication.
*
* @module @deepseek-ai/dsh-tool-todo/client/types
*/
export type * from '../types.ts'

View File

@@ -12,12 +12,11 @@ import { defineTool } from '@deepseek-ai/dsh-tools'
import type { TodoItem } from '@deepseek-ai/dsh-session'
// Type-only: resolves ctx.sessionProjections for the optional unit child.
import type {} from '@deepseek-ai/dsh-session-projection'
// The `todos` projection-key declaration lives in the client outlet (its one
// home). A PLAIN side-effect import, not `import type`: declaration emit
// elides type-only imports, and the aggregate programs resolve this package
// through its emitted declarations — the merge must survive in index.d.ts.
// The imported module is types-only, so the runtime edge is an empty module.
import './client/types.ts'
// The `todos` projection-key declaration lives in src/types.ts (its one home);
// this re-export projects the type face onto the package root AND keeps the
// module edge in the emitted index.d.ts, so aggregate programs consuming the
// declarations still receive the SessionProjectionMap merge.
export type * from './types.ts'
export const name = 'tool-todo'
export const inject = ['tools']

View File

@@ -1,11 +1,11 @@
/**
* Pure-type client outlet of the todo domain: the ONE home of the `todos`
* projection-key declaration, importable from client aggregates without
* dragging this package's host-side value imports (dsh-tools, zod). The host
* entry (`index.ts`) imports this module type-only to reuse the same merge
* one declaration serves both program sides.
* Pure types of the todo domain: the ONE home of the `todos` projection-key
* declaration plus its payload types, free of this package's host-side value
* imports (dsh-tools, zod). Two namespace projections serve it `./types`
* for host consumers, `./client/types` (the browser half-entry's re-export)
* for client aggregates with zero content duplication.
*
* @module @deepseek-ai/dsh-tool-todo/client/types
* @module @deepseek-ai/dsh-tool-todo/types
*/
import type { TodoItem } from '@deepseek-ai/dsh-session/types'