ts-procedures 10.1.2 → 10.2.1
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.
- package/CHANGELOG.md +33 -86
- package/README.md +11 -6
- package/agent_config/bin/postinstall.mjs +20 -89
- package/agent_config/bin/setup.mjs +51 -264
- package/agent_config/lib/install-skills.mjs +108 -0
- package/agent_config/{claude-code/skills → skills}/ts-procedures/anti-patterns.md +8 -0
- package/agent_config/{claude-code/skills → skills}/ts-procedures/api-reference.md +25 -22
- package/agent_config/{claude-code/skills → skills}/ts-procedures/patterns.md +24 -13
- package/build/adapters/hono/envelope-parity.test.js +6 -17
- package/build/adapters/hono/envelope-parity.test.js.map +1 -1
- package/build/adapters/hono/handlers/http-stream.d.ts +2 -1
- package/build/adapters/hono/handlers/http-stream.js +9 -2
- package/build/adapters/hono/handlers/http-stream.js.map +1 -1
- package/build/adapters/hono/handlers/http.d.ts +2 -1
- package/build/adapters/hono/handlers/http.js +9 -2
- package/build/adapters/hono/handlers/http.js.map +1 -1
- package/build/adapters/hono/handlers/rpc.d.ts +2 -1
- package/build/adapters/hono/handlers/rpc.js +9 -2
- package/build/adapters/hono/handlers/rpc.js.map +1 -1
- package/build/adapters/hono/handlers/stream.d.ts +2 -1
- package/build/adapters/hono/handlers/stream.js +9 -2
- package/build/adapters/hono/handlers/stream.js.map +1 -1
- package/build/adapters/hono/index.d.ts +14 -7
- package/build/adapters/hono/index.js +45 -5
- package/build/adapters/hono/index.js.map +1 -1
- package/build/adapters/hono/index.test.js +55 -0
- package/build/adapters/hono/index.test.js.map +1 -1
- package/build/adapters/hono/request.d.ts +7 -0
- package/build/adapters/hono/request.js +15 -0
- package/build/adapters/hono/request.js.map +1 -1
- package/build/adapters/hono/types.d.ts +31 -0
- package/build/adapters/hono/types.js.map +1 -1
- package/build/codegen/bin/cli.js +1 -1
- package/build/codegen/bin/cli.js.map +1 -1
- package/build/codegen/constants.js +2 -2
- package/build/codegen/constants.js.map +1 -1
- package/build/codegen/emit/api-route.js +1 -1
- package/build/codegen/emit/api-route.js.map +1 -1
- package/build/codegen/emit/scope-file.js +1 -1
- package/build/codegen/emit/scope-file.js.map +1 -1
- package/build/codegen/emit-errors.integration.test.js +2 -2
- package/build/codegen/emit-errors.integration.test.js.map +1 -1
- package/build/codegen/resolve-envelope.js +1 -1
- package/build/codegen/resolve-envelope.js.map +1 -1
- package/build/codegen/test-helpers/run-tsc.js +1 -1
- package/build/codegen/test-helpers/run-tsc.js.map +1 -1
- package/build/core/create-http-stream.d.ts +3 -14
- package/build/core/create-http-stream.js +4 -2
- package/build/core/create-http-stream.js.map +1 -1
- package/build/core/create-http.d.ts +2 -9
- package/build/core/create-http.js +3 -2
- package/build/core/create-http.js.map +1 -1
- package/build/core/create-http.test-d.js +104 -0
- package/build/core/create-http.test-d.js.map +1 -0
- package/build/core/create-stream.js +6 -2
- package/build/core/create-stream.js.map +1 -1
- package/build/core/create.js +5 -4
- package/build/core/create.js.map +1 -1
- package/build/core/create.test.js +63 -0
- package/build/core/create.test.js.map +1 -1
- package/build/core/internal.d.ts +16 -0
- package/build/core/internal.js +22 -0
- package/build/core/internal.js.map +1 -1
- package/build/core/procedures.d.ts +9 -16
- package/build/core/procedures.js +4 -0
- package/build/core/procedures.js.map +1 -1
- package/build/core/types.d.ts +85 -4
- package/build/errors.d.ts +33 -0
- package/build/errors.js +91 -0
- package/build/errors.js.map +1 -0
- package/build/errors.test.d.ts +1 -0
- package/build/errors.test.js +122 -0
- package/build/errors.test.js.map +1 -0
- package/build/exports.d.ts +1 -2
- package/build/exports.js +0 -4
- package/build/exports.js.map +1 -1
- package/build/implementations/http/doc-registry.d.ts +28 -0
- package/build/implementations/http/doc-registry.js +96 -0
- package/build/implementations/http/doc-registry.js.map +1 -0
- package/build/implementations/http/doc-registry.test.d.ts +1 -0
- package/build/implementations/http/doc-registry.test.js +516 -0
- package/build/implementations/http/doc-registry.test.js.map +1 -0
- package/build/implementations/http/error-taxonomy.d.ts +249 -0
- package/build/implementations/http/error-taxonomy.js +252 -0
- package/build/implementations/http/error-taxonomy.js.map +1 -0
- package/build/implementations/http/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/error-taxonomy.test.js +399 -0
- package/build/implementations/http/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/express-rpc/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/express-rpc/error-taxonomy.test.js +83 -0
- package/build/implementations/http/express-rpc/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/express-rpc/index.d.ts +125 -0
- package/build/implementations/http/express-rpc/index.js +216 -0
- package/build/implementations/http/express-rpc/index.js.map +1 -0
- package/build/implementations/http/express-rpc/index.test.d.ts +1 -0
- package/build/implementations/http/express-rpc/index.test.js +684 -0
- package/build/implementations/http/express-rpc/index.test.js.map +1 -0
- package/build/implementations/http/express-rpc/types.d.ts +11 -0
- package/build/implementations/http/express-rpc/types.js +2 -0
- package/build/implementations/http/express-rpc/types.js.map +1 -0
- package/build/implementations/http/hono-api/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/hono-api/error-taxonomy.test.js +137 -0
- package/build/implementations/http/hono-api/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/hono-api/index.d.ts +151 -0
- package/build/implementations/http/hono-api/index.js +344 -0
- package/build/implementations/http/hono-api/index.js.map +1 -0
- package/build/implementations/http/hono-api/index.test.d.ts +1 -0
- package/build/implementations/http/hono-api/index.test.js +992 -0
- package/build/implementations/http/hono-api/index.test.js.map +1 -0
- package/build/implementations/http/hono-api/types.d.ts +13 -0
- package/build/implementations/http/hono-api/types.js +2 -0
- package/build/implementations/http/hono-api/types.js.map +1 -0
- package/build/implementations/http/hono-rpc/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/hono-rpc/error-taxonomy.test.js +64 -0
- package/build/implementations/http/hono-rpc/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/hono-rpc/index.d.ts +130 -0
- package/build/implementations/http/hono-rpc/index.js +209 -0
- package/build/implementations/http/hono-rpc/index.js.map +1 -0
- package/build/implementations/http/hono-rpc/index.test.d.ts +1 -0
- package/build/implementations/http/hono-rpc/index.test.js +828 -0
- package/build/implementations/http/hono-rpc/index.test.js.map +1 -0
- package/build/implementations/http/hono-rpc/types.d.ts +11 -0
- package/build/implementations/http/hono-rpc/types.js +2 -0
- package/build/implementations/http/hono-rpc/types.js.map +1 -0
- package/build/implementations/http/hono-stream/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/hono-stream/error-taxonomy.test.js +159 -0
- package/build/implementations/http/hono-stream/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/hono-stream/index.d.ts +171 -0
- package/build/implementations/http/hono-stream/index.js +415 -0
- package/build/implementations/http/hono-stream/index.js.map +1 -0
- package/build/implementations/http/hono-stream/index.test.d.ts +1 -0
- package/build/implementations/http/hono-stream/index.test.js +1383 -0
- package/build/implementations/http/hono-stream/index.test.js.map +1 -0
- package/build/implementations/http/hono-stream/types.d.ts +15 -0
- package/build/implementations/http/hono-stream/types.js +2 -0
- package/build/implementations/http/hono-stream/types.js.map +1 -0
- package/build/implementations/http/on-request-error.test.d.ts +1 -0
- package/build/implementations/http/on-request-error.test.js +173 -0
- package/build/implementations/http/on-request-error.test.js.map +1 -0
- package/build/implementations/http/route-errors.test.d.ts +1 -0
- package/build/implementations/http/route-errors.test.js +139 -0
- package/build/implementations/http/route-errors.test.js.map +1 -0
- package/build/implementations/types.d.ts +192 -0
- package/build/implementations/types.js +2 -0
- package/build/implementations/types.js.map +1 -0
- package/build/index.d.ts +165 -0
- package/build/index.js +258 -0
- package/build/index.js.map +1 -0
- package/build/index.test.d.ts +1 -0
- package/build/index.test.js +920 -0
- package/build/index.test.js.map +1 -0
- package/build/schema/compute-schema.js +1 -5
- package/build/schema/compute-schema.js.map +1 -1
- package/build/schema/compute-schema.test.js +0 -13
- package/build/schema/compute-schema.test.js.map +1 -1
- package/build/schema/extract-json-schema.d.ts +2 -0
- package/build/schema/extract-json-schema.js +12 -0
- package/build/schema/extract-json-schema.js.map +1 -0
- package/build/schema/extract-json-schema.test.d.ts +1 -0
- package/build/schema/extract-json-schema.test.js +23 -0
- package/build/schema/extract-json-schema.test.js.map +1 -0
- package/build/schema/parser.d.ts +28 -0
- package/build/schema/parser.js +170 -0
- package/build/schema/parser.js.map +1 -0
- package/build/schema/parser.test.d.ts +1 -0
- package/build/schema/parser.test.js +120 -0
- package/build/schema/parser.test.js.map +1 -0
- package/build/schema/resolve-schema-lib.d.ts +12 -0
- package/build/schema/resolve-schema-lib.js +11 -0
- package/build/schema/resolve-schema-lib.js.map +1 -0
- package/build/schema/resolve-schema-lib.test.d.ts +1 -0
- package/build/schema/resolve-schema-lib.test.js +17 -0
- package/build/schema/resolve-schema-lib.test.js.map +1 -0
- package/build/schema/typebox.d.ts +1 -1
- package/build/schema/typebox.js +2 -20
- package/build/schema/typebox.js.map +1 -1
- package/build/schema/typebox.test.js +0 -10
- package/build/schema/typebox.test.js.map +1 -1
- package/build/schema/types.d.ts +8 -0
- package/build/schema/types.js +2 -0
- package/build/schema/types.js.map +1 -0
- package/build/server/context.d.ts +12 -2
- package/build/server/context.js +49 -4
- package/build/server/context.js.map +1 -1
- package/build/server/context.test.js +32 -1
- package/build/server/context.test.js.map +1 -1
- package/build/server/doc-registry.js +0 -3
- package/build/server/doc-registry.js.map +1 -1
- package/build/server/doc-registry.test.js +0 -31
- package/build/server/doc-registry.test.js.map +1 -1
- package/build/server/index.d.ts +0 -1
- package/build/server/index.js +0 -1
- package/build/server/index.js.map +1 -1
- package/build/server/types.d.ts +6 -27
- package/build/stack-utils.d.ts +25 -0
- package/build/stack-utils.js +95 -0
- package/build/stack-utils.js.map +1 -0
- package/build/stack-utils.test.d.ts +1 -0
- package/build/stack-utils.test.js +80 -0
- package/build/stack-utils.test.js.map +1 -0
- package/docs/ai-agent-setup.md +19 -27
- package/docs/client-error-handling.md +1 -1
- package/docs/core.md +8 -0
- package/docs/http-integrations.md +42 -28
- package/package.json +8 -8
- package/src/adapters/astro/README.md +2 -0
- package/src/adapters/hono/envelope-parity.test.ts +6 -18
- package/src/adapters/hono/handlers/http-stream.ts +12 -3
- package/src/adapters/hono/handlers/http.ts +12 -3
- package/src/adapters/hono/handlers/rpc.ts +12 -3
- package/src/adapters/hono/handlers/stream.ts +12 -3
- package/src/adapters/hono/index.test.ts +70 -0
- package/src/adapters/hono/index.ts +53 -11
- package/src/adapters/hono/request.ts +18 -0
- package/src/adapters/hono/types.ts +37 -0
- package/src/codegen/bin/cli.ts +1 -1
- package/src/codegen/constants.ts +2 -2
- package/src/codegen/emit/api-route.ts +1 -1
- package/src/codegen/emit/scope-file.ts +1 -2
- package/src/codegen/emit-errors.integration.test.ts +2 -2
- package/src/codegen/resolve-envelope.ts +1 -1
- package/src/codegen/test-helpers/run-tsc.ts +0 -1
- package/src/core/create-http-stream.ts +20 -13
- package/src/core/create-http.test-d.ts +154 -0
- package/src/core/create-http.ts +19 -8
- package/src/core/create-stream.ts +12 -4
- package/src/core/create.test.ts +74 -0
- package/src/core/create.ts +10 -5
- package/src/core/internal.ts +35 -0
- package/src/core/procedures.ts +4 -0
- package/src/core/types.ts +99 -4
- package/src/exports.ts +6 -4
- package/src/schema/compute-schema.test.ts +0 -16
- package/src/schema/compute-schema.ts +1 -5
- package/src/schema/typebox.test.ts +0 -12
- package/src/schema/typebox.ts +2 -21
- package/src/server/context.test.ts +39 -1
- package/src/server/context.ts +54 -4
- package/src/server/doc-registry.test.ts +0 -34
- package/src/server/doc-registry.ts +0 -3
- package/src/server/index.ts +0 -1
- package/src/server/types.ts +8 -27
- package/agent_config/claude-code/.claude-plugin/plugin.json +0 -5
- package/agent_config/claude-code/agents/ts-procedures-architect.md +0 -138
- package/agent_config/copilot/copilot-instructions.md +0 -521
- package/agent_config/cursor/cursorrules +0 -521
- package/agent_config/lib/install-claude.mjs +0 -57
- package/build/schema/strip-internal-keywords.d.ts +0 -18
- package/build/schema/strip-internal-keywords.js +0 -33
- package/build/schema/strip-internal-keywords.js.map +0 -1
- package/build/schema/strip-internal-keywords.test.js +0 -38
- package/build/schema/strip-internal-keywords.test.js.map +0 -1
- package/build/server/spec-version.d.ts +0 -24
- package/build/server/spec-version.js +0 -26
- package/build/server/spec-version.js.map +0 -1
- package/build/version.d.ts +0 -9
- package/build/version.js +0 -11
- package/build/version.js.map +0 -1
- package/docs/doc-envelope-spec-v1.md +0 -296
- package/docs/doc-envelope-v1.schema.json +0 -253
- package/src/schema/strip-internal-keywords.test.ts +0 -43
- package/src/schema/strip-internal-keywords.ts +0 -36
- package/src/server/spec-version.ts +0 -27
- package/src/version.ts +0 -11
- /package/agent_config/{claude-code/skills → skills}/ts-procedures/SKILL.md +0 -0
- /package/agent_config/{claude-code/skills → skills}/ts-procedures/checklist.md +0 -0
- /package/agent_config/{claude-code/skills → skills}/ts-procedures/templates/astro-catchall.md +0 -0
- /package/agent_config/{claude-code/skills → skills}/ts-procedures/templates/client.md +0 -0
- /package/agent_config/{claude-code/skills → skills}/ts-procedures/templates/hono.md +0 -0
- /package/agent_config/{claude-code/skills → skills}/ts-procedures/templates/procedure.md +0 -0
- /package/agent_config/{claude-code/skills → skills}/ts-procedures/templates/stream-procedure.md +0 -0
- /package/build/{schema/strip-internal-keywords.test.d.ts → core/create-http.test-d.d.ts} +0 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { cpSync, mkdirSync, readdirSync, readFileSync, existsSync, statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
|
|
4
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
5
|
+
// Generic, project-agnostic skill installer.
|
|
6
|
+
//
|
|
7
|
+
// This file is intentionally free of any ts-procedures specifics so it can be
|
|
8
|
+
// dropped verbatim into any library that ships Agent Skills. The only
|
|
9
|
+
// per-project surface is the config object the caller passes in (see
|
|
10
|
+
// bin/setup.mjs / bin/postinstall.mjs).
|
|
11
|
+
//
|
|
12
|
+
// A "skill" is a spec-compliant directory containing a SKILL.md (name +
|
|
13
|
+
// description frontmatter) plus optional references/templates. The same
|
|
14
|
+
// directory is read by 30+ agent tools from `.agents/skills/<name>/` and by
|
|
15
|
+
// Claude Code from `.claude/skills/<name>/`, so we fan the one source out to
|
|
16
|
+
// every configured target root.
|
|
17
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
/** Recursively list file paths under `dir`, relative to `dir`. */
|
|
20
|
+
export function listFilesRecursive(dir) {
|
|
21
|
+
const out = [];
|
|
22
|
+
for (const entry of readdirSync(dir)) {
|
|
23
|
+
const full = join(dir, entry);
|
|
24
|
+
if (statSync(full).isDirectory()) {
|
|
25
|
+
for (const nested of listFilesRecursive(full)) out.push(join(entry, nested));
|
|
26
|
+
} else {
|
|
27
|
+
out.push(entry);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Enumerate the install plan without touching the filesystem.
|
|
35
|
+
*
|
|
36
|
+
* @param {object} cfg
|
|
37
|
+
* @param {string} cfg.projectRoot — consuming project root (absolute)
|
|
38
|
+
* @param {string} cfg.sourceDir — dir containing the source skill folders (absolute)
|
|
39
|
+
* @param {string[]} cfg.skills — skill folder names under sourceDir
|
|
40
|
+
* @param {string[]} cfg.targetRoots — install roots relative to projectRoot
|
|
41
|
+
* (e.g. ['.agents/skills', '.claude/skills'])
|
|
42
|
+
* @returns {Array<{ skill: string, root: string, rel: string, src: string, dest: string }>}
|
|
43
|
+
*/
|
|
44
|
+
export function planSkills({ projectRoot, sourceDir, skills, targetRoots }) {
|
|
45
|
+
const plan = [];
|
|
46
|
+
for (const skill of skills) {
|
|
47
|
+
const skillSrc = join(sourceDir, skill);
|
|
48
|
+
for (const rel of listFilesRecursive(skillSrc)) {
|
|
49
|
+
for (const root of targetRoots) {
|
|
50
|
+
plan.push({
|
|
51
|
+
skill,
|
|
52
|
+
root,
|
|
53
|
+
rel: join(root, skill, rel),
|
|
54
|
+
src: join(skillSrc, rel),
|
|
55
|
+
dest: join(projectRoot, root, skill, rel),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return plan;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Copy each source skill into every target root (force-overwrite).
|
|
65
|
+
*
|
|
66
|
+
* @param {object} cfg — same shape as planSkills
|
|
67
|
+
* @returns {{ files: string[] }} — installed paths relative to projectRoot
|
|
68
|
+
*/
|
|
69
|
+
export function installSkills({ projectRoot, sourceDir, skills, targetRoots }) {
|
|
70
|
+
const files = [];
|
|
71
|
+
for (const root of targetRoots) {
|
|
72
|
+
const rootDest = join(projectRoot, root);
|
|
73
|
+
mkdirSync(rootDest, { recursive: true });
|
|
74
|
+
for (const skill of skills) {
|
|
75
|
+
cpSync(join(sourceDir, skill), join(rootDest, skill), { recursive: true, force: true });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
for (const { rel } of planSkills({ projectRoot, sourceDir, skills, targetRoots })) {
|
|
79
|
+
files.push(rel);
|
|
80
|
+
}
|
|
81
|
+
return { files };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Report which planned files are missing or differ from source (for --check).
|
|
86
|
+
*
|
|
87
|
+
* @param {object} cfg — same shape as planSkills
|
|
88
|
+
* @returns {string[]} — relative paths that are outdated (empty == up to date)
|
|
89
|
+
*/
|
|
90
|
+
export function outdatedSkillFiles(cfg) {
|
|
91
|
+
const outdated = [];
|
|
92
|
+
for (const { rel, src, dest } of planSkills(cfg)) {
|
|
93
|
+
if (!existsSync(dest) || readFileSync(dest, 'utf-8') !== readFileSync(src, 'utf-8')) {
|
|
94
|
+
outdated.push(rel);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return outdated;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** True if any skill was previously installed into any target root. */
|
|
101
|
+
export function isInstalled({ projectRoot, skills, targetRoots }) {
|
|
102
|
+
for (const root of targetRoots) {
|
|
103
|
+
for (const skill of skills) {
|
|
104
|
+
if (existsSync(join(projectRoot, root, skill))) return true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
@@ -725,6 +725,14 @@ const { CreateUser } = CreateHttp('CreateUser', {
|
|
|
725
725
|
|
|
726
726
|
**Fix:** Leave validation on for any factory whose handlers can be reached from untrusted callers. Only opt out when the factory is purely internal (e.g., a back-of-house procedure registry called from another already-validated procedure or a fully type-checked compile step).
|
|
727
727
|
|
|
728
|
+
---
|
|
729
|
+
|
|
730
|
+
## Raw `app.use` + stashing for auth/tenant (instead of builder middleware)
|
|
731
|
+
|
|
732
|
+
**Problem:** Manually doing `app.use('/api/*', authenticate(...))` before `HonoAppBuilder` + having ctx factories read "stashed" values leads to ordering issues, duplicated path logic, and hard-to-follow public vs protected surfaces.
|
|
733
|
+
|
|
734
|
+
**Fix:** Declare auth/tenant as `middleware` on the builder (config, `.use(mw)`, or per-`register({ middleware })`). Use `register(..., { context: extraLayer })` for augmentation. The old separate-factory + raw use style still works but is no longer the recommended default for this concern.
|
|
735
|
+
|
|
728
736
|
```typescript
|
|
729
737
|
// GOOD — public factory keeps runtime validation
|
|
730
738
|
const { Create: CreatePublic } = Procedures()
|
|
@@ -183,26 +183,15 @@ Registers a unary HTTP procedure (v8+). First-class surface for REST-style route
|
|
|
183
183
|
```typescript
|
|
184
184
|
function CreateHttp<
|
|
185
185
|
TName extends string,
|
|
186
|
-
TReq extends
|
|
187
|
-
TRes extends
|
|
186
|
+
TReq extends THttpReqInput | undefined = undefined,
|
|
187
|
+
TRes extends THttpResInput | undefined = undefined,
|
|
188
188
|
TErrorKey extends string = string
|
|
189
189
|
>(
|
|
190
190
|
name: TName,
|
|
191
|
-
config:
|
|
192
|
-
path: string
|
|
193
|
-
method: HttpMethod
|
|
194
|
-
successStatus?: number
|
|
195
|
-
scope?: string
|
|
196
|
-
errors?: TErrorKey[]
|
|
197
|
-
description?: string
|
|
198
|
-
schema: {
|
|
199
|
-
req?: TReq
|
|
200
|
-
res?: TRes
|
|
201
|
-
}
|
|
202
|
-
},
|
|
191
|
+
config: TCreateHttpConfig<TReq, TRes, TErrorKey>,
|
|
203
192
|
handler: (
|
|
204
193
|
ctx: TContext & TLocalContext,
|
|
205
|
-
req:
|
|
194
|
+
req: HttpReq<TReq>
|
|
206
195
|
) => Promise<HttpReturn<TRes>>
|
|
207
196
|
): {
|
|
208
197
|
[K in TName]: typeof handler
|
|
@@ -215,7 +204,7 @@ function CreateHttp<
|
|
|
215
204
|
|
|
216
205
|
- `config.path` — Route path. Supports Hono-style path params (`:id`).
|
|
217
206
|
- `config.method` — HTTP method.
|
|
218
|
-
- `config.schema.req` — Per-channel input schemas.
|
|
207
|
+
- `config.schema.req` — Per-channel input schemas. The keys `pathParams`, `query`, `body`, `headers` are surfaced by `THttpReqInput` (and `APIInput`) for autocomplete and `satisfies` checks. Each channel independently validated.
|
|
219
208
|
- `config.schema.res.body` — Response body schema (documentation; not runtime-validated).
|
|
220
209
|
- `config.schema.res.headers` — When declared, handler **must** return `{ body, headers }` instead of the body bare. The builder reads `headers` and forwards them to the HTTP response.
|
|
221
210
|
- `config.errors` — Taxonomy keys this route may emit (populates DocEnvelope for codegen).
|
|
@@ -1010,26 +999,40 @@ interface StreamHttpRouteDoc extends RPCConfig {
|
|
|
1010
999
|
}
|
|
1011
1000
|
```
|
|
1012
1001
|
|
|
1013
|
-
### TCreateHttpConfig
|
|
1002
|
+
### TCreateHttpConfig
|
|
1014
1003
|
|
|
1015
1004
|
Config type for `CreateHttp`. HTTP fields are first-class — no `APIConfig` type parameter needed on the factory.
|
|
1016
1005
|
|
|
1006
|
+
The `schema.req` and `schema.res` use special input shapes (`THttpReqInput`, `THttpResInput`) so that object literals get autocomplete for the channel keys (`pathParams`, `query`, `body`, `headers`). `TReq` / `TRes` carry the user's concrete schema types for inference.
|
|
1007
|
+
|
|
1017
1008
|
```typescript
|
|
1018
|
-
type TCreateHttpConfig<
|
|
1009
|
+
type TCreateHttpConfig<
|
|
1010
|
+
TReq extends THttpReqInput | undefined = undefined,
|
|
1011
|
+
TRes extends THttpResInput | undefined = undefined,
|
|
1012
|
+
TErrorKey extends string = string,
|
|
1013
|
+
> = {
|
|
1019
1014
|
path: string
|
|
1020
1015
|
method: HttpMethod
|
|
1021
1016
|
successStatus?: number
|
|
1022
1017
|
scope?: string
|
|
1023
1018
|
errors?: TErrorKey[]
|
|
1024
1019
|
description?: string
|
|
1025
|
-
schema
|
|
1026
|
-
req?: TReq
|
|
1027
|
-
res?: TRes
|
|
1020
|
+
schema?: {
|
|
1021
|
+
req?: HttpSchemaInput<THttpReqInput, TReq>
|
|
1022
|
+
res?: HttpSchemaInput<THttpResInput, TRes>
|
|
1028
1023
|
}
|
|
1029
1024
|
}
|
|
1030
1025
|
```
|
|
1031
1026
|
|
|
1032
|
-
|
|
1027
|
+
`APIInput` (re-exported from `ts-procedures/http`) is an alias for `THttpReqInput` and is the recommended type for `satisfies` checks on `req`:
|
|
1028
|
+
|
|
1029
|
+
```ts
|
|
1030
|
+
req: { pathParams: ..., query: ... } satisfies APIInput
|
|
1031
|
+
```
|
|
1032
|
+
|
|
1033
|
+
See also `THttpReqInput`, `THttpResInput`, `HttpSchemaInput`, and `APIInput`.
|
|
1034
|
+
|
|
1035
|
+
### APIHttpRouteDoc
|
|
1033
1036
|
|
|
1034
1037
|
```typescript
|
|
1035
1038
|
interface APIHttpRouteDoc {
|
|
@@ -796,28 +796,39 @@ const docs = getProcedures().map(proc => ({
|
|
|
796
796
|
|
|
797
797
|
---
|
|
798
798
|
|
|
799
|
-
##
|
|
799
|
+
## Access Control with Middleware + Layered Context (preferred)
|
|
800
|
+
|
|
801
|
+
Use builder middleware (`.use()`, config `middleware`, or per-register) + context composition for cross-cutting concerns like auth/tenant. This keeps surfaces on fewer factories/builders and makes ordering explicit.
|
|
800
802
|
|
|
801
803
|
```typescript
|
|
802
|
-
|
|
803
|
-
type AuthContext = { userId: string; requestId: string }
|
|
804
|
+
import { HonoAppBuilder, type HonoRequestMiddleware } from 'ts-procedures/hono'
|
|
804
805
|
|
|
805
|
-
|
|
806
|
-
|
|
806
|
+
type Base = { requestId: string }
|
|
807
|
+
type Authed = Base & { userId: string; tenant: string }
|
|
807
808
|
|
|
808
|
-
|
|
809
|
-
AuthRPC.Create('GetProfile', { scope: 'users', version: 1 }, async (ctx) => fetchProfile(ctx.userId))
|
|
809
|
+
const RPC = Procedures<Authed | Base, RPCConfig>()
|
|
810
810
|
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
811
|
+
RPC.Create('HealthCheck', { scope: 'health', version: 1 }, async () => ({ status: 'ok' }))
|
|
812
|
+
RPC.Create('GetProfile', { scope: 'users', version: 1 }, async (ctx) => fetchProfile(ctx.userId))
|
|
813
|
+
|
|
814
|
+
const authenticate: HonoRequestMiddleware = async (c, next) => {
|
|
815
|
+
const token = c.req.header('authorization')
|
|
816
|
+
if (!token) throw new Error('unauthorized')
|
|
817
|
+
;(c as any).set?.('tenant', 'acme')
|
|
818
|
+
await next()
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
const app = new HonoAppBuilder({ pathPrefix: '/api', middleware: [authenticate] })
|
|
822
|
+
.register(RPC, (c) => ({
|
|
823
|
+
requestId: c.req.header('x-request-id') || 'req',
|
|
824
|
+
tenant: (c as any).get?.('tenant') ?? 'public',
|
|
825
|
+
userId: 'u-123',
|
|
817
826
|
}))
|
|
818
827
|
.build()
|
|
819
828
|
```
|
|
820
829
|
|
|
830
|
+
Separate factories remain valid for truly disjoint context shapes.
|
|
831
|
+
|
|
821
832
|
---
|
|
822
833
|
|
|
823
834
|
## Documentation Generation with extendProcedureDoc
|
|
@@ -3,10 +3,8 @@ import { dirname, resolve } from 'node:path';
|
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
import { describe, expect, it } from 'vitest';
|
|
5
5
|
import { Type } from 'typebox';
|
|
6
|
-
import pkg from '../../../package.json' with { type: 'json' };
|
|
7
6
|
import { Procedures } from '../../core/procedures.js';
|
|
8
7
|
import { HonoAppBuilder, defineErrorTaxonomy } from './index.js';
|
|
9
|
-
import { DOC_ENVELOPE_SPEC_VERSION } from '../../server/spec-version.js';
|
|
10
8
|
/**
|
|
11
9
|
* THE envelope contract test: the v9 builder must emit a DocEnvelope
|
|
12
10
|
* deep-equal to what v8.6.0 emitted for the same procedure set. The fixture
|
|
@@ -16,15 +14,12 @@ import { DOC_ENVELOPE_SPEC_VERSION } from '../../server/spec-version.js';
|
|
|
16
14
|
* The envelope is codegen's input; if this test fails, generated client output
|
|
17
15
|
* WILL drift.
|
|
18
16
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* never emitted. These are asserted explicitly below, then stripped before
|
|
26
|
-
* the deep-equal so the rest stays byte-for-byte with the v8 capture.
|
|
27
|
-
* Everything else is the untouched v8 capture.
|
|
17
|
+
* ONE documented deviation from the raw v8 capture: v8's CreateHttpStream
|
|
18
|
+
* dropped the `yield` schema (and `res.headers`) from http-stream route docs —
|
|
19
|
+
* the registration stored `yieldType` while the doc builder read `yield`. v9
|
|
20
|
+
* fixes that, so the fixture's TailUser route was patched to include the
|
|
21
|
+
* `yield` schema the builder now (correctly) emits. Everything else is the
|
|
22
|
+
* untouched v8 capture.
|
|
28
23
|
*/
|
|
29
24
|
class TeapotError extends Error {
|
|
30
25
|
}
|
|
@@ -97,12 +92,6 @@ describe('DocEnvelope parity with v8.6.0', () => {
|
|
|
97
92
|
const fixturePath = resolve(dirname(fileURLToPath(import.meta.url)), '__fixtures__/parity-envelope.json');
|
|
98
93
|
const expected = JSON.parse(await readFile(fixturePath, 'utf-8'));
|
|
99
94
|
const actual = JSON.parse(JSON.stringify(builder.toDocEnvelope()));
|
|
100
|
-
// Deviation #2: assert the new v9 envelope metadata, then strip it so the
|
|
101
|
-
// remaining shape matches the untouched v8 capture.
|
|
102
|
-
expect(actual.specVersion).toBe(DOC_ENVELOPE_SPEC_VERSION);
|
|
103
|
-
expect(actual.generatorVersion).toBe(pkg.version);
|
|
104
|
-
delete actual.specVersion;
|
|
105
|
-
delete actual.generatorVersion;
|
|
106
95
|
expect(actual).toEqual(expected);
|
|
107
96
|
});
|
|
108
97
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope-parity.test.js","sourceRoot":"","sources":["../../../src/adapters/hono/envelope-parity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,
|
|
1
|
+
{"version":3,"file":"envelope-parity.test.js","sourceRoot":"","sources":["../../../src/adapters/hono/envelope-parity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { Hono } from 'hono';
|
|
2
2
|
import type { THttpStreamProcedureRegistration } from '../../../core/types.js';
|
|
3
|
-
import type { DocAccumulator, HonoAppBuilderConfig, HonoFactoryItem } from '../types.js';
|
|
3
|
+
import type { DocAccumulator, HonoAppBuilderConfig, HonoFactoryItem, HonoRequestMiddleware } from '../types.js';
|
|
4
4
|
export declare function installHttpStreamRoute(params: {
|
|
5
5
|
app: Hono;
|
|
6
6
|
procedure: THttpStreamProcedureRegistration<any>;
|
|
7
7
|
factoryItem: HonoFactoryItem;
|
|
8
8
|
cfg: HonoAppBuilderConfig;
|
|
9
9
|
docs: DocAccumulator;
|
|
10
|
+
builderMiddleware?: HonoRequestMiddleware[];
|
|
10
11
|
}): void;
|
|
@@ -5,16 +5,23 @@ import { resolveFactoryContext } from '../../../server/context.js';
|
|
|
5
5
|
import { extractReqChannels } from '../../../server/request/params.js';
|
|
6
6
|
import { parseQueryNative } from '../../../server/request/query.js';
|
|
7
7
|
import { SseEventSequencer } from '../../../server/sse.js';
|
|
8
|
-
import { honoRequestSource, respondToDispatch } from '../request.js';
|
|
8
|
+
import { honoRequestSource, respondToDispatch, runMiddlewareList } from '../request.js';
|
|
9
9
|
import { midStreamErrorConfig, preStreamErrorConfig } from '../types.js';
|
|
10
10
|
export function installHttpStreamRoute(params) {
|
|
11
|
-
const { app, procedure, factoryItem, cfg, docs } = params;
|
|
11
|
+
const { app, procedure, factoryItem, cfg, docs, builderMiddleware } = params;
|
|
12
12
|
const queryParser = cfg.api?.queryParser ?? parseQueryNative;
|
|
13
13
|
const route = buildHttpStreamRouteDoc(procedure, cfg.pathPrefix, factoryItem.extendProcedureDoc);
|
|
14
14
|
docs.push(route);
|
|
15
15
|
const reqSchema = procedure.config.schema?.req;
|
|
16
|
+
const combinedMw = [
|
|
17
|
+
...(builderMiddleware ?? []),
|
|
18
|
+
...(factoryItem.middleware ?? []),
|
|
19
|
+
];
|
|
16
20
|
app.on(procedure.config.method.toUpperCase(), route.fullPath, async (c) => {
|
|
17
21
|
try {
|
|
22
|
+
const early = await runMiddlewareList(c, combinedMw);
|
|
23
|
+
if (early)
|
|
24
|
+
return early;
|
|
18
25
|
const context = await resolveFactoryContext(factoryItem.factoryContext, c);
|
|
19
26
|
const reqParams = reqSchema
|
|
20
27
|
? await extractReqChannels(honoRequestSource(c), procedure.config.method, reqSchema, queryParser)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-stream.js","sourceRoot":"","sources":["../../../../src/adapters/hono/handlers/http-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AACnG,OAAO,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAA;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"http-stream.js","sourceRoot":"","sources":["../../../../src/adapters/hono/handlers/http-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { Hono } from 'hono';
|
|
2
2
|
import type { THttpProcedureRegistration } from '../../../core/types.js';
|
|
3
|
-
import type { DocAccumulator, HonoAppBuilderConfig, HonoFactoryItem } from '../types.js';
|
|
3
|
+
import type { DocAccumulator, HonoAppBuilderConfig, HonoFactoryItem, HonoRequestMiddleware } from '../types.js';
|
|
4
4
|
export declare function installHttpRoute(params: {
|
|
5
5
|
app: Hono;
|
|
6
6
|
procedure: THttpProcedureRegistration<any>;
|
|
7
7
|
factoryItem: HonoFactoryItem;
|
|
8
8
|
cfg: HonoAppBuilderConfig;
|
|
9
9
|
docs: DocAccumulator;
|
|
10
|
+
builderMiddleware?: HonoRequestMiddleware[];
|
|
10
11
|
}): void;
|
|
@@ -3,17 +3,24 @@ import { buildHttpRouteDoc } from '../../../server/docs/http-doc.js';
|
|
|
3
3
|
import { resolveFactoryContext } from '../../../server/context.js';
|
|
4
4
|
import { defaultSuccessStatus, extractReqChannels } from '../../../server/request/params.js';
|
|
5
5
|
import { parseQueryNative } from '../../../server/request/query.js';
|
|
6
|
-
import { honoRequestSource, respondToDispatch } from '../request.js';
|
|
6
|
+
import { honoRequestSource, respondToDispatch, runMiddlewareList } from '../request.js';
|
|
7
7
|
import { preStreamErrorConfig } from '../types.js';
|
|
8
8
|
export function installHttpRoute(params) {
|
|
9
|
-
const { app, procedure, factoryItem, cfg, docs } = params;
|
|
9
|
+
const { app, procedure, factoryItem, cfg, docs, builderMiddleware } = params;
|
|
10
10
|
const queryParser = cfg.api?.queryParser ?? parseQueryNative;
|
|
11
11
|
const route = buildHttpRouteDoc(procedure, cfg.pathPrefix, factoryItem.extendProcedureDoc);
|
|
12
12
|
docs.push(route);
|
|
13
13
|
const successStatus = procedure.config.successStatus ?? defaultSuccessStatus(procedure.config.method);
|
|
14
14
|
const reqSchema = procedure.config.schema?.req;
|
|
15
|
+
const combinedMw = [
|
|
16
|
+
...(builderMiddleware ?? []),
|
|
17
|
+
...(factoryItem.middleware ?? []),
|
|
18
|
+
];
|
|
15
19
|
app.on(procedure.config.method.toUpperCase(), route.fullPath, async (c) => {
|
|
16
20
|
try {
|
|
21
|
+
const early = await runMiddlewareList(c, combinedMw);
|
|
22
|
+
if (early)
|
|
23
|
+
return early;
|
|
17
24
|
const context = await resolveFactoryContext(factoryItem.factoryContext, c);
|
|
18
25
|
const reqParams = reqSchema
|
|
19
26
|
? await extractReqChannels(honoRequestSource(c), procedure.config.method, reqSchema, queryParser)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../../src/adapters/hono/handlers/http.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAC5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../../src/adapters/hono/handlers/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { Hono } from 'hono';
|
|
2
2
|
import type { TProcedureRegistration } from '../../../core/types.js';
|
|
3
3
|
import type { RPCConfig } from '../../../server/types.js';
|
|
4
|
-
import type { DocAccumulator, HonoAppBuilderConfig, HonoFactoryItem } from '../types.js';
|
|
4
|
+
import type { DocAccumulator, HonoAppBuilderConfig, HonoFactoryItem, HonoRequestMiddleware } from '../types.js';
|
|
5
5
|
export declare function installRpcRoute(params: {
|
|
6
6
|
app: Hono;
|
|
7
7
|
procedure: TProcedureRegistration<any, RPCConfig>;
|
|
8
8
|
factoryItem: HonoFactoryItem;
|
|
9
9
|
cfg: HonoAppBuilderConfig;
|
|
10
10
|
docs: DocAccumulator;
|
|
11
|
+
builderMiddleware?: HonoRequestMiddleware[];
|
|
11
12
|
}): void;
|
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import { dispatchPreStreamError } from '../../../server/errors/dispatch.js';
|
|
2
2
|
import { buildRpcRouteDoc } from '../../../server/docs/rpc-doc.js';
|
|
3
3
|
import { resolveFactoryContext } from '../../../server/context.js';
|
|
4
|
-
import { respondToDispatch } from '../request.js';
|
|
4
|
+
import { respondToDispatch, runMiddlewareList } from '../request.js';
|
|
5
5
|
import { preStreamErrorConfig } from '../types.js';
|
|
6
6
|
export function installRpcRoute(params) {
|
|
7
|
-
const { app, procedure, factoryItem, cfg, docs } = params;
|
|
7
|
+
const { app, procedure, factoryItem, cfg, docs, builderMiddleware } = params;
|
|
8
8
|
const route = buildRpcRouteDoc(procedure, cfg.pathPrefix, factoryItem.extendProcedureDoc);
|
|
9
9
|
docs.push(route);
|
|
10
|
+
const combinedMw = [
|
|
11
|
+
...(builderMiddleware ?? []),
|
|
12
|
+
...(factoryItem.middleware ?? []),
|
|
13
|
+
];
|
|
10
14
|
app.post(route.path, async (c) => {
|
|
11
15
|
try {
|
|
16
|
+
const early = await runMiddlewareList(c, combinedMw);
|
|
17
|
+
if (early)
|
|
18
|
+
return early;
|
|
12
19
|
const context = await resolveFactoryContext(factoryItem.factoryContext, c);
|
|
13
20
|
const body = await c.req.json().catch(() => ({}));
|
|
14
21
|
const result = await procedure.handler({ ...context, signal: c.req.raw.signal }, body);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../../src/adapters/hono/handlers/rpc.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../../../src/adapters/hono/handlers/rpc.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAGlD,MAAM,UAAU,eAAe,CAAC,MAO/B;IACC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAAA;IAE5E,MAAM,KAAK,GAAG,gBAAgB,CAAC,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,kBAAyB,CAAC,CAAA;IAChG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAEhB,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;QAC5B,GAAG,CAAC,WAAW,CAAC,UAAU,IAAI,EAAE,CAAC;KAClC,CAAA;IAED,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAU,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;YACpD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;YAEvB,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC,CAAC,CAAA;YAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACjD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;YAEtF,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;YAElC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CACtB,CAAC,EACD,MAAM,sBAAsB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAChG,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Hono } from 'hono';
|
|
2
2
|
import type { TStreamProcedureRegistration } from '../../../core/types.js';
|
|
3
3
|
import type { RPCConfig, StreamMode } from '../../../server/types.js';
|
|
4
|
-
import type { DocAccumulator, HonoAppBuilderConfig, HonoFactoryItem } from '../types.js';
|
|
4
|
+
import type { DocAccumulator, HonoAppBuilderConfig, HonoFactoryItem, HonoRequestMiddleware } from '../types.js';
|
|
5
5
|
export declare function installRpcStreamRoute(params: {
|
|
6
6
|
app: Hono;
|
|
7
7
|
procedure: TStreamProcedureRegistration<any, RPCConfig>;
|
|
@@ -9,4 +9,5 @@ export declare function installRpcStreamRoute(params: {
|
|
|
9
9
|
cfg: HonoAppBuilderConfig;
|
|
10
10
|
docs: DocAccumulator;
|
|
11
11
|
streamMode: StreamMode;
|
|
12
|
+
builderMiddleware?: HonoRequestMiddleware[];
|
|
12
13
|
}): void;
|
|
@@ -4,14 +4,21 @@ import { dispatchMidStreamError, dispatchPreStreamError } from '../../../server/
|
|
|
4
4
|
import { buildStreamRouteDoc } from '../../../server/docs/stream-doc.js';
|
|
5
5
|
import { resolveFactoryContext } from '../../../server/context.js';
|
|
6
6
|
import { SseEventSequencer } from '../../../server/sse.js';
|
|
7
|
-
import { respondToDispatch } from '../request.js';
|
|
7
|
+
import { respondToDispatch, runMiddlewareList } from '../request.js';
|
|
8
8
|
import { midStreamErrorConfig, preStreamErrorConfig } from '../types.js';
|
|
9
9
|
export function installRpcStreamRoute(params) {
|
|
10
|
-
const { app, procedure, factoryItem, cfg, docs, streamMode } = params;
|
|
10
|
+
const { app, procedure, factoryItem, cfg, docs, streamMode, builderMiddleware } = params;
|
|
11
11
|
const route = buildStreamRouteDoc(procedure, streamMode, cfg.pathPrefix, factoryItem.extendProcedureDoc);
|
|
12
12
|
docs.push(route);
|
|
13
|
+
const combinedMw = [
|
|
14
|
+
...(builderMiddleware ?? []),
|
|
15
|
+
...(factoryItem.middleware ?? []),
|
|
16
|
+
];
|
|
13
17
|
const handler = async (c) => {
|
|
14
18
|
try {
|
|
19
|
+
const early = await runMiddlewareList(c, combinedMw);
|
|
20
|
+
if (early)
|
|
21
|
+
return early;
|
|
15
22
|
const context = await resolveFactoryContext(factoryItem.factoryContext, c);
|
|
16
23
|
const reqParams = c.req.method === 'GET'
|
|
17
24
|
? Object.fromEntries(new URL(c.req.url).searchParams)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../src/adapters/hono/handlers/stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAGtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../src/adapters/hono/handlers/stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Hono } from 'hono';
|
|
2
|
-
import type { AnyHttpRouteDoc, ProceduresFactory, ExtractContext,
|
|
2
|
+
import type { AnyHttpRouteDoc, ProceduresFactory, ExtractContext, DocEnvelope, ErrorDoc, HeaderDoc } from '../../server/types.js';
|
|
3
3
|
import type { ErrorTaxonomy } from '../../server/errors/taxonomy.js';
|
|
4
4
|
import type { FactoryContextInit } from '../../server/context.js';
|
|
5
5
|
import { makeRoutePath as _makeRoutePath } from '../../server/paths.js';
|
|
6
6
|
import type { Context } from 'hono';
|
|
7
|
-
import type { HonoAppBuilderConfig,
|
|
8
|
-
export type { HonoAppBuilderConfig, ExtendProcedureDoc, QueryParser } from './types.js';
|
|
7
|
+
import type { HonoAppBuilderConfig, HonoRequestMiddleware, RegisterOptions } from './types.js';
|
|
8
|
+
export type { HonoAppBuilderConfig, ExtendProcedureDoc, QueryParser, HonoRequestMiddleware, RegisterOptions } from './types.js';
|
|
9
9
|
export type { OnRequestErrorContext } from './types.js';
|
|
10
10
|
export { sse } from '../../server/sse.js';
|
|
11
11
|
export type { SSEOptions } from '../../server/sse.js';
|
|
@@ -27,10 +27,20 @@ export declare class HonoAppBuilder<TStreamErrorData = unknown> {
|
|
|
27
27
|
readonly config?: HonoAppBuilderConfig<TStreamErrorData> | undefined;
|
|
28
28
|
private readonly _app;
|
|
29
29
|
private readonly factories;
|
|
30
|
+
private readonly builderMiddleware;
|
|
30
31
|
private _docs;
|
|
31
32
|
private _skipped;
|
|
32
33
|
private _built;
|
|
33
34
|
constructor(config?: HonoAppBuilderConfig<TStreamErrorData> | undefined);
|
|
35
|
+
/**
|
|
36
|
+
* Register Hono middleware to run for routes on this builder.
|
|
37
|
+
* If no pattern is provided, uses the builder's pathPrefix (or '*').
|
|
38
|
+
*
|
|
39
|
+
* The middleware is installed on the underlying Hono app immediately
|
|
40
|
+
* (classic Hono behavior) and is also available for per-procedure
|
|
41
|
+
* sequencing inside handlers.
|
|
42
|
+
*/
|
|
43
|
+
use(patternOrMw?: string | HonoRequestMiddleware, maybeMw?: HonoRequestMiddleware): this;
|
|
34
44
|
static makeRoutePath: typeof _makeRoutePath;
|
|
35
45
|
get app(): Hono;
|
|
36
46
|
/**
|
|
@@ -42,10 +52,7 @@ export declare class HonoAppBuilder<TStreamErrorData = unknown> {
|
|
|
42
52
|
name: string;
|
|
43
53
|
reason: string;
|
|
44
54
|
}[];
|
|
45
|
-
register<TFactory extends ProceduresFactory>(factory: TFactory, factoryContext: FactoryContextInit<ExtractContext<TFactory>, Context>, options?:
|
|
46
|
-
streamMode?: StreamMode;
|
|
47
|
-
extendProcedureDoc?: ExtendProcedureDoc;
|
|
48
|
-
}): this;
|
|
55
|
+
register<TFactory extends ProceduresFactory>(factory: TFactory, factoryContext: FactoryContextInit<ExtractContext<TFactory>, Context>, options?: RegisterOptions<TFactory>): this;
|
|
49
56
|
private computeDocs;
|
|
50
57
|
/**
|
|
51
58
|
* Mounts every registered procedure on the Hono app and returns it.
|