ts-procedures 5.10.0 → 5.10.2
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/agent_config/bin/postinstall.mjs +3 -3
- package/agent_config/bin/setup.mjs +22 -11
- package/agent_config/claude-code/agents/ts-procedures-architect.md +2 -2
- package/agent_config/claude-code/skills/{guide → ts-procedures}/SKILL.md +1 -1
- package/agent_config/claude-code/skills/{review → ts-procedures-review}/SKILL.md +3 -3
- package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/SKILL.md +2 -2
- package/agent_config/lib/install-claude.mjs +35 -87
- package/build/src/client/call.d.ts +14 -0
- package/build/src/client/call.js +47 -0
- package/build/src/client/call.js.map +1 -0
- package/build/src/client/call.test.d.ts +1 -0
- package/build/src/client/call.test.js +124 -0
- package/build/src/client/call.test.js.map +1 -0
- package/build/src/client/errors.d.ts +25 -0
- package/build/src/client/errors.js +33 -0
- package/build/src/client/errors.js.map +1 -0
- package/build/src/client/errors.test.d.ts +1 -0
- package/build/src/client/errors.test.js +41 -0
- package/build/src/client/errors.test.js.map +1 -0
- package/build/src/client/fetch-adapter.d.ts +12 -0
- package/build/src/client/fetch-adapter.js +156 -0
- package/build/src/client/fetch-adapter.js.map +1 -0
- package/build/src/client/fetch-adapter.test.d.ts +1 -0
- package/build/src/client/fetch-adapter.test.js +271 -0
- package/build/src/client/fetch-adapter.test.js.map +1 -0
- package/build/src/client/hooks.d.ts +17 -0
- package/build/src/client/hooks.js +40 -0
- package/build/src/client/hooks.js.map +1 -0
- package/build/src/client/hooks.test.d.ts +1 -0
- package/build/src/client/hooks.test.js +163 -0
- package/build/src/client/hooks.test.js.map +1 -0
- package/build/src/client/index.d.ts +22 -0
- package/build/src/client/index.js +67 -0
- package/build/src/client/index.js.map +1 -0
- package/build/src/client/index.test.d.ts +1 -0
- package/build/src/client/index.test.js +231 -0
- package/build/src/client/index.test.js.map +1 -0
- package/build/src/client/request-builder.d.ts +13 -0
- package/build/src/client/request-builder.js +53 -0
- package/build/src/client/request-builder.js.map +1 -0
- package/build/src/client/request-builder.test.d.ts +1 -0
- package/build/src/client/request-builder.test.js +160 -0
- package/build/src/client/request-builder.test.js.map +1 -0
- package/build/src/client/stream.d.ts +27 -0
- package/build/src/client/stream.js +118 -0
- package/build/src/client/stream.js.map +1 -0
- package/build/src/client/stream.test.d.ts +1 -0
- package/build/src/client/stream.test.js +228 -0
- package/build/src/client/stream.test.js.map +1 -0
- package/build/src/client/types.d.ts +78 -0
- package/build/src/client/types.js +3 -0
- package/build/src/client/types.js.map +1 -0
- package/build/src/codegen/bin/cli.d.ts +45 -0
- package/build/src/codegen/bin/cli.js +246 -0
- package/build/src/codegen/bin/cli.js.map +1 -0
- package/build/src/codegen/bin/cli.test.d.ts +1 -0
- package/build/src/codegen/bin/cli.test.js +220 -0
- package/build/src/codegen/bin/cli.test.js.map +1 -0
- package/build/src/codegen/constants.d.ts +1 -0
- package/build/src/codegen/constants.js +2 -0
- package/build/src/codegen/constants.js.map +1 -0
- package/build/src/codegen/e2e.test.d.ts +1 -0
- package/build/src/codegen/e2e.test.js +464 -0
- package/build/src/codegen/e2e.test.js.map +1 -0
- package/build/src/codegen/emit-client-runtime.d.ts +9 -0
- package/build/src/codegen/emit-client-runtime.js +99 -0
- package/build/src/codegen/emit-client-runtime.js.map +1 -0
- package/build/src/codegen/emit-client-runtime.test.d.ts +1 -0
- package/build/src/codegen/emit-client-runtime.test.js +78 -0
- package/build/src/codegen/emit-client-runtime.test.js.map +1 -0
- package/build/src/codegen/emit-client-types.d.ts +8 -0
- package/build/src/codegen/emit-client-types.js +25 -0
- package/build/src/codegen/emit-client-types.js.map +1 -0
- package/build/src/codegen/emit-client-types.test.d.ts +1 -0
- package/build/src/codegen/emit-client-types.test.js +33 -0
- package/build/src/codegen/emit-client-types.test.js.map +1 -0
- package/build/src/codegen/emit-errors.d.ts +19 -0
- package/build/src/codegen/emit-errors.js +59 -0
- package/build/src/codegen/emit-errors.js.map +1 -0
- package/build/src/codegen/emit-errors.test.d.ts +1 -0
- package/build/src/codegen/emit-errors.test.js +175 -0
- package/build/src/codegen/emit-errors.test.js.map +1 -0
- package/build/src/codegen/emit-index.d.ts +12 -0
- package/build/src/codegen/emit-index.js +41 -0
- package/build/src/codegen/emit-index.js.map +1 -0
- package/build/src/codegen/emit-index.test.d.ts +1 -0
- package/build/src/codegen/emit-index.test.js +106 -0
- package/build/src/codegen/emit-index.test.js.map +1 -0
- package/build/src/codegen/emit-scope.d.ts +15 -0
- package/build/src/codegen/emit-scope.js +299 -0
- package/build/src/codegen/emit-scope.js.map +1 -0
- package/build/src/codegen/emit-scope.test.d.ts +1 -0
- package/build/src/codegen/emit-scope.test.js +559 -0
- package/build/src/codegen/emit-scope.test.js.map +1 -0
- package/build/src/codegen/emit-types.d.ts +43 -0
- package/build/src/codegen/emit-types.js +111 -0
- package/build/src/codegen/emit-types.js.map +1 -0
- package/build/src/codegen/emit-types.test.d.ts +1 -0
- package/build/src/codegen/emit-types.test.js +184 -0
- package/build/src/codegen/emit-types.test.js.map +1 -0
- package/build/src/codegen/group-routes.d.ts +23 -0
- package/build/src/codegen/group-routes.js +46 -0
- package/build/src/codegen/group-routes.js.map +1 -0
- package/build/src/codegen/group-routes.test.d.ts +1 -0
- package/build/src/codegen/group-routes.test.js +131 -0
- package/build/src/codegen/group-routes.test.js.map +1 -0
- package/build/src/codegen/index.d.ts +15 -0
- package/build/src/codegen/index.js +16 -0
- package/build/src/codegen/index.js.map +1 -0
- package/build/src/codegen/naming.d.ts +7 -0
- package/build/src/codegen/naming.js +21 -0
- package/build/src/codegen/naming.js.map +1 -0
- package/build/src/codegen/naming.test.d.ts +1 -0
- package/build/src/codegen/naming.test.js +40 -0
- package/build/src/codegen/naming.test.js.map +1 -0
- package/build/src/codegen/pipeline.d.ts +17 -0
- package/build/src/codegen/pipeline.js +78 -0
- package/build/src/codegen/pipeline.js.map +1 -0
- package/build/src/codegen/pipeline.test.d.ts +1 -0
- package/build/src/codegen/pipeline.test.js +269 -0
- package/build/src/codegen/pipeline.test.js.map +1 -0
- package/build/src/codegen/resolve-envelope.d.ts +7 -0
- package/build/src/codegen/resolve-envelope.js +46 -0
- package/build/src/codegen/resolve-envelope.js.map +1 -0
- package/build/src/codegen/resolve-envelope.test.d.ts +1 -0
- package/build/src/codegen/resolve-envelope.test.js +69 -0
- package/build/src/codegen/resolve-envelope.test.js.map +1 -0
- package/build/src/errors.d.ts +33 -0
- package/build/src/errors.js +91 -0
- package/build/src/errors.js.map +1 -0
- package/build/src/errors.test.d.ts +1 -0
- package/build/src/errors.test.js +122 -0
- package/build/src/errors.test.js.map +1 -0
- package/build/src/exports.d.ts +7 -0
- package/build/src/exports.js +8 -0
- package/build/src/exports.js.map +1 -0
- package/build/src/implementations/http/doc-registry.d.ts +12 -0
- package/build/src/implementations/http/doc-registry.js +114 -0
- package/build/src/implementations/http/doc-registry.js.map +1 -0
- package/build/src/implementations/http/doc-registry.test.d.ts +1 -0
- package/build/src/implementations/http/doc-registry.test.js +347 -0
- package/build/src/implementations/http/doc-registry.test.js.map +1 -0
- package/build/src/implementations/http/express-rpc/index.d.ts +94 -0
- package/build/src/implementations/http/express-rpc/index.js +185 -0
- package/build/src/implementations/http/express-rpc/index.js.map +1 -0
- package/build/src/implementations/http/express-rpc/index.test.d.ts +1 -0
- package/build/src/implementations/http/express-rpc/index.test.js +684 -0
- package/build/src/implementations/http/express-rpc/index.test.js.map +1 -0
- package/build/src/implementations/http/express-rpc/types.d.ts +11 -0
- package/build/src/implementations/http/express-rpc/types.js +2 -0
- package/build/src/implementations/http/express-rpc/types.js.map +1 -0
- package/build/src/implementations/http/hono-api/index.d.ts +102 -0
- package/build/src/implementations/http/hono-api/index.js +341 -0
- package/build/src/implementations/http/hono-api/index.js.map +1 -0
- package/build/src/implementations/http/hono-api/index.test.d.ts +1 -0
- package/build/src/implementations/http/hono-api/index.test.js +992 -0
- package/build/src/implementations/http/hono-api/index.test.js.map +1 -0
- package/build/src/implementations/http/hono-api/types.d.ts +13 -0
- package/build/src/implementations/http/hono-api/types.js +2 -0
- package/build/src/implementations/http/hono-api/types.js.map +1 -0
- package/build/src/implementations/http/hono-rpc/index.d.ts +92 -0
- package/build/src/implementations/http/hono-rpc/index.js +161 -0
- package/build/src/implementations/http/hono-rpc/index.js.map +1 -0
- package/build/src/implementations/http/hono-rpc/index.test.d.ts +1 -0
- package/build/src/implementations/http/hono-rpc/index.test.js +803 -0
- package/build/src/implementations/http/hono-rpc/index.test.js.map +1 -0
- package/build/src/implementations/http/hono-rpc/types.d.ts +11 -0
- package/build/src/implementations/http/hono-rpc/types.js +2 -0
- package/build/src/implementations/http/hono-rpc/types.js.map +1 -0
- package/build/src/implementations/http/hono-stream/index.d.ts +120 -0
- package/build/src/implementations/http/hono-stream/index.js +309 -0
- package/build/src/implementations/http/hono-stream/index.js.map +1 -0
- package/build/src/implementations/http/hono-stream/index.test.d.ts +1 -0
- package/build/src/implementations/http/hono-stream/index.test.js +1356 -0
- package/build/src/implementations/http/hono-stream/index.test.js.map +1 -0
- package/build/src/implementations/http/hono-stream/types.d.ts +15 -0
- package/build/src/implementations/http/hono-stream/types.js +2 -0
- package/build/src/implementations/http/hono-stream/types.js.map +1 -0
- package/build/src/implementations/types.d.ts +142 -0
- package/build/src/implementations/types.js +2 -0
- package/build/src/implementations/types.js.map +1 -0
- package/build/src/index.d.ts +165 -0
- package/build/src/index.js +253 -0
- package/build/src/index.js.map +1 -0
- package/build/src/index.test.d.ts +1 -0
- package/build/src/index.test.js +890 -0
- package/build/src/index.test.js.map +1 -0
- package/build/src/schema/compute-schema.d.ts +35 -0
- package/build/src/schema/compute-schema.js +41 -0
- package/build/src/schema/compute-schema.js.map +1 -0
- package/build/src/schema/compute-schema.test.d.ts +1 -0
- package/build/src/schema/compute-schema.test.js +107 -0
- package/build/src/schema/compute-schema.test.js.map +1 -0
- package/build/src/schema/extract-json-schema.d.ts +2 -0
- package/build/src/schema/extract-json-schema.js +12 -0
- package/build/src/schema/extract-json-schema.js.map +1 -0
- package/build/src/schema/extract-json-schema.test.d.ts +1 -0
- package/build/src/schema/extract-json-schema.test.js +23 -0
- package/build/src/schema/extract-json-schema.test.js.map +1 -0
- package/build/src/schema/parser.d.ts +28 -0
- package/build/src/schema/parser.js +170 -0
- package/build/src/schema/parser.js.map +1 -0
- package/build/src/schema/parser.test.d.ts +1 -0
- package/build/src/schema/parser.test.js +120 -0
- package/build/src/schema/parser.test.js.map +1 -0
- package/build/src/schema/resolve-schema-lib.d.ts +12 -0
- package/build/src/schema/resolve-schema-lib.js +11 -0
- package/build/src/schema/resolve-schema-lib.js.map +1 -0
- package/build/src/schema/resolve-schema-lib.test.d.ts +1 -0
- package/build/src/schema/resolve-schema-lib.test.js +17 -0
- package/build/src/schema/resolve-schema-lib.test.js.map +1 -0
- package/build/src/schema/types.d.ts +8 -0
- package/build/src/schema/types.js +2 -0
- package/build/src/schema/types.js.map +1 -0
- package/build/src/stack-utils.d.ts +25 -0
- package/build/src/stack-utils.js +95 -0
- package/build/src/stack-utils.js.map +1 -0
- package/build/src/stack-utils.test.d.ts +1 -0
- package/build/src/stack-utils.test.js +80 -0
- package/build/src/stack-utils.test.js.map +1 -0
- package/docs/ai-agent-setup.md +7 -6
- package/package.json +1 -1
- /package/agent_config/claude-code/skills/{guide → ts-procedures}/anti-patterns.md +0 -0
- /package/agent_config/claude-code/skills/{guide → ts-procedures}/api-reference.md +0 -0
- /package/agent_config/claude-code/skills/{guide → ts-procedures}/patterns.md +0 -0
- /package/agent_config/claude-code/skills/{review → ts-procedures-review}/checklist.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/client.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/express-rpc.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/hono-api.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/hono-rpc.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/hono-stream.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/procedure.md +0 -0
- /package/agent_config/claude-code/skills/{scaffold → ts-procedures-scaffold}/templates/stream-procedure.md +0 -0
|
@@ -64,19 +64,19 @@ function updateMarkedFile(targetPath, sourceRelativePath) {
|
|
|
64
64
|
|
|
65
65
|
// ─── Auto-update ──────────────────────────────────────────
|
|
66
66
|
|
|
67
|
-
const
|
|
67
|
+
const claudeSkillDir = join(projectRoot, '.claude', 'skills', 'ts-procedures');
|
|
68
68
|
const cursorFile = join(projectRoot, '.cursorrules');
|
|
69
69
|
const copilotFile = join(projectRoot, '.github', 'copilot-instructions.md');
|
|
70
70
|
|
|
71
71
|
// Check if any target was previously set up
|
|
72
|
-
const hasAnySetup = existsSync(
|
|
72
|
+
const hasAnySetup = existsSync(claudeSkillDir) || existsSync(cursorFile) || existsSync(copilotFile);
|
|
73
73
|
|
|
74
74
|
if (hasAnySetup) {
|
|
75
75
|
try {
|
|
76
76
|
const updated = [];
|
|
77
77
|
|
|
78
78
|
// Auto-update Claude Code files
|
|
79
|
-
if (existsSync(
|
|
79
|
+
if (existsSync(claudeSkillDir)) {
|
|
80
80
|
const { installClaude } = await import('../lib/install-claude.mjs');
|
|
81
81
|
installClaude(projectRoot);
|
|
82
82
|
updated.push('Claude Code');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
3
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, statSync } from 'node:fs';
|
|
4
4
|
import { join, dirname, resolve } from 'node:path';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { createInterface } from 'node:readline';
|
|
@@ -23,7 +23,7 @@ function printUsage() {
|
|
|
23
23
|
Usage: npx ts-procedures-setup [targets...] [options]
|
|
24
24
|
|
|
25
25
|
Targets:
|
|
26
|
-
claude Install Claude Code
|
|
26
|
+
claude Install Claude Code skills and architect agent into .claude/
|
|
27
27
|
cursor Copy ts-procedures rules to .cursorrules
|
|
28
28
|
copilot Copy ts-procedures instructions to .github/copilot-instructions.md
|
|
29
29
|
all Set up all targets (default)
|
|
@@ -89,12 +89,24 @@ function isFileOutdated(targetPath, expectedContent) {
|
|
|
89
89
|
|
|
90
90
|
function setupClaude({ dryRun, check } = {}) {
|
|
91
91
|
if (dryRun) {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
92
|
+
// Mirror install-claude.mjs: copy every file under each source skill dir, plus the agent.
|
|
93
|
+
const claudeFiles = [];
|
|
94
|
+
const skillsSrc = join(AGENT_CONFIG_DIR, 'claude-code', 'skills');
|
|
95
|
+
for (const skill of ['ts-procedures', 'ts-procedures-review', 'ts-procedures-scaffold']) {
|
|
96
|
+
const walk = (dir, prefix) => {
|
|
97
|
+
for (const entry of readdirSync(dir)) {
|
|
98
|
+
const full = join(dir, entry);
|
|
99
|
+
if (statSync(full).isDirectory()) {
|
|
100
|
+
walk(full, `${prefix}/${entry}`);
|
|
101
|
+
} else {
|
|
102
|
+
claudeFiles.push(`${prefix}/${entry}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
walk(join(skillsSrc, skill), `.claude/skills/${skill}`);
|
|
107
|
+
}
|
|
108
|
+
claudeFiles.push('.claude/agents/ts-procedures-architect.md');
|
|
109
|
+
|
|
98
110
|
console.log('\n Claude Code (dry run)');
|
|
99
111
|
console.log(' ─────────────────────');
|
|
100
112
|
for (const f of claudeFiles) {
|
|
@@ -116,9 +128,8 @@ function setupClaude({ dryRun, check } = {}) {
|
|
|
116
128
|
console.log(` ${f}`);
|
|
117
129
|
}
|
|
118
130
|
console.log('');
|
|
119
|
-
console.log('
|
|
120
|
-
console.log(' Agent:
|
|
121
|
-
console.log(' Reference: Auto-loaded via .claude/rules/ts-procedures.md\n');
|
|
131
|
+
console.log(' Skills: ts-procedures, ts-procedures-scaffold, ts-procedures-review');
|
|
132
|
+
console.log(' Agent: ts-procedures-architect (architecture planning)\n');
|
|
122
133
|
return false;
|
|
123
134
|
}
|
|
124
135
|
|
|
@@ -4,14 +4,14 @@ description: "Architecture planning agent for ts-procedures RPC applications. Us
|
|
|
4
4
|
model: sonnet
|
|
5
5
|
disallowedTools: Write, Edit
|
|
6
6
|
skills:
|
|
7
|
-
-
|
|
7
|
+
- ts-procedures
|
|
8
8
|
color: blue
|
|
9
9
|
effort: high
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
You are an architecture planning agent for applications built with **ts-procedures**, a TypeScript RPC framework that creates type-safe, schema-validated procedure calls. You help developers plan APIs by deciding procedure structure, schema design, context shape, and HTTP integration strategy.
|
|
13
13
|
|
|
14
|
-
The full ts-procedures framework reference is preloaded via the
|
|
14
|
+
The full ts-procedures framework reference is preloaded via the `ts-procedures` skill — use it for API details, schema rules, error classes, and HTTP builder specifics.
|
|
15
15
|
|
|
16
16
|
## Your Process
|
|
17
17
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: ts-procedures
|
|
3
3
|
description: "TypeScript RPC framework reference for ts-procedures — schema validation, error handling, HTTP builders, streaming, and code generation. Use when writing, reviewing, or debugging procedures, configuring HTTP builders, or designing schemas."
|
|
4
4
|
user-invocable: false
|
|
5
5
|
---
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: review
|
|
2
|
+
name: ts-procedures-review
|
|
3
3
|
description: "Review ts-procedures code for pattern adherence, schema correctness, error handling, and signal propagation."
|
|
4
4
|
argument-hint: "<path>"
|
|
5
5
|
allowed-tools: Read Grep Glob
|
|
@@ -16,7 +16,7 @@ Parse `$ARGUMENTS` as a file or directory path. If a directory, review all `.ts`
|
|
|
16
16
|
1. Read the target file(s).
|
|
17
17
|
2. Identify ts-procedures imports (`ts-procedures`, `ts-procedures/express-rpc`, `ts-procedures/hono-rpc`, `ts-procedures/hono-stream`, `ts-procedures/hono-api`, `ts-procedures/http`, `ts-procedures/http-docs`) to determine file types.
|
|
18
18
|
3. Check each file against the categorized checklist in [checklist.md](checklist.md).
|
|
19
|
-
4. For detailed code examples of each violation pattern, reference [anti-patterns.md](../
|
|
19
|
+
4. For detailed code examples of each violation pattern, reference [anti-patterns.md](../ts-procedures/anti-patterns.md) — it shows 20 common mistakes with before/after code fixes and severity ratings.
|
|
20
20
|
5. Output findings grouped by severity.
|
|
21
21
|
|
|
22
22
|
## Output Format
|
|
@@ -45,4 +45,4 @@ After individual findings, provide:
|
|
|
45
45
|
## Reference
|
|
46
46
|
|
|
47
47
|
See [checklist.md](checklist.md) for the complete categorized checklist by file type.
|
|
48
|
-
See [anti-patterns.md](../
|
|
48
|
+
See [anti-patterns.md](../ts-procedures/anti-patterns.md) for detailed code examples of each violation.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: scaffold
|
|
2
|
+
name: ts-procedures-scaffold
|
|
3
3
|
description: "Generate ts-procedures implementations with correct patterns — procedures, streams, Express RPC, Hono RPC, Hono streaming, REST APIs, and client setup."
|
|
4
4
|
argument-hint: "<type> <Name>"
|
|
5
5
|
allowed-tools: Read Write
|
|
@@ -19,7 +19,7 @@ If either argument is missing, ask the user for `<type>` and `<Name>`.
|
|
|
19
19
|
- `{{Name}}` — PascalCase as given (e.g., `UserProfile`)
|
|
20
20
|
- `{{name}}` — camelCase (e.g., `userProfile`)
|
|
21
21
|
- For URL scopes and file paths, use kebab-case (e.g., `user-profile`)
|
|
22
|
-
4. Read the template file from
|
|
22
|
+
4. Read the template file from `templates/$0.md` (relative to this skill directory).
|
|
23
23
|
5. Replace all `{{Name}}` and `{{name}}` placeholders with the appropriate variants.
|
|
24
24
|
6. Generate the implementation file(s) following the template exactly.
|
|
25
25
|
7. Also generate a colocated test file following ts-procedures test conventions.
|
|
@@ -1,109 +1,57 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cpSync, mkdirSync, readdirSync, statSync } from 'node:fs';
|
|
2
2
|
import { join, dirname } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
4
|
|
|
5
5
|
const __filename = fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = dirname(__filename);
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return `<!-- Auto-generated by ts-procedures@${version}. Updated on npm install/update. Do not edit. -->\n\n`;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function stripFrontmatter(content) {
|
|
25
|
-
const match = content.match(/^---\n[\s\S]*?\n---\n([\s\S]*)$/);
|
|
26
|
-
return match ? match[1].trim() : content.trim();
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function ensureDir(dir) {
|
|
30
|
-
if (!existsSync(dir)) {
|
|
31
|
-
mkdirSync(dir, { recursive: true });
|
|
7
|
+
const SOURCE_DIR = join(__dirname, '..', 'claude-code');
|
|
8
|
+
|
|
9
|
+
const SKILL_NAMES = ['ts-procedures', 'ts-procedures-review', 'ts-procedures-scaffold'];
|
|
10
|
+
const AGENT_FILES = ['ts-procedures-architect.md'];
|
|
11
|
+
|
|
12
|
+
function listFilesRecursive(dir) {
|
|
13
|
+
const out = [];
|
|
14
|
+
for (const entry of readdirSync(dir)) {
|
|
15
|
+
const full = join(dir, entry);
|
|
16
|
+
if (statSync(full).isDirectory()) {
|
|
17
|
+
for (const nested of listFilesRecursive(full)) out.push(join(entry, nested));
|
|
18
|
+
} else {
|
|
19
|
+
out.push(entry);
|
|
20
|
+
}
|
|
32
21
|
}
|
|
22
|
+
return out;
|
|
33
23
|
}
|
|
34
24
|
|
|
35
25
|
/**
|
|
36
26
|
* Install Claude Code integration files into a project's .claude/ directory.
|
|
37
27
|
*
|
|
38
28
|
* Creates:
|
|
39
|
-
* .claude/
|
|
40
|
-
* .claude/
|
|
41
|
-
* .claude/
|
|
42
|
-
* .claude/agents/ts-procedures-architect.md
|
|
29
|
+
* .claude/skills/ts-procedures/ — Framework reference skill
|
|
30
|
+
* .claude/skills/ts-procedures-scaffold/ — Scaffold skill (templates included)
|
|
31
|
+
* .claude/skills/ts-procedures-review/ — Review skill
|
|
32
|
+
* .claude/agents/ts-procedures-architect.md — Architecture planning agent
|
|
43
33
|
*
|
|
44
34
|
* @param {string} projectRoot — Absolute path to the consuming project's root
|
|
45
35
|
* @returns {{ files: string[] }} — List of created/updated file paths (relative to projectRoot)
|
|
46
36
|
*/
|
|
47
37
|
export function installClaude(projectRoot) {
|
|
48
38
|
const claudeDir = join(projectRoot, '.claude');
|
|
49
|
-
const
|
|
50
|
-
const
|
|
51
|
-
|
|
39
|
+
const skillsDest = join(claudeDir, 'skills');
|
|
40
|
+
const agentsDest = join(claudeDir, 'agents');
|
|
41
|
+
mkdirSync(skillsDest, { recursive: true });
|
|
42
|
+
mkdirSync(agentsDest, { recursive: true });
|
|
52
43
|
|
|
53
|
-
ensureDir(rulesDir);
|
|
54
|
-
ensureDir(commandsDir);
|
|
55
|
-
ensureDir(agentsDir);
|
|
56
|
-
|
|
57
|
-
const autoHeader = makeAutoHeader();
|
|
58
44
|
const files = [];
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
writeFileSync(join(rulesDir, 'ts-procedures.md'), autoHeader + guideBody, 'utf-8');
|
|
72
|
-
files.push('.claude/rules/ts-procedures.md');
|
|
73
|
-
|
|
74
|
-
// 2. Scaffold command
|
|
75
|
-
const scaffoldSkill = readFileSync(join(SKILLS_DIR, 'scaffold', 'SKILL.md'), 'utf-8');
|
|
76
|
-
const scaffoldBasePath = 'node_modules/ts-procedures/agent_config/claude-code/skills/scaffold';
|
|
77
|
-
const scaffoldBody = stripFrontmatter(scaffoldSkill)
|
|
78
|
-
// Replace ${CLAUDE_SKILL_DIR} template path with node_modules path
|
|
79
|
-
.replace(
|
|
80
|
-
'`${CLAUDE_SKILL_DIR}/templates/$0.md`',
|
|
81
|
-
`\`${scaffoldBasePath}/templates/$0.md\``
|
|
82
|
-
)
|
|
83
|
-
// Replace Workflow section — skill cross-references don't apply outside the plugin
|
|
84
|
-
.replace(/\n## Workflow[\s\S]*$/, '');
|
|
85
|
-
|
|
86
|
-
writeFileSync(join(commandsDir, 'ts-procedures-scaffold.md'), autoHeader + scaffoldBody, 'utf-8');
|
|
87
|
-
files.push('.claude/commands/ts-procedures-scaffold.md');
|
|
88
|
-
|
|
89
|
-
// 3. Review command
|
|
90
|
-
const reviewSkill = readFileSync(join(SKILLS_DIR, 'review', 'SKILL.md'), 'utf-8');
|
|
91
|
-
const reviewBasePath = 'node_modules/ts-procedures/agent_config/claude-code/skills/review';
|
|
92
|
-
const reviewBody = stripFrontmatter(reviewSkill)
|
|
93
|
-
// Replace relative markdown links with node_modules paths
|
|
94
|
-
.replace(/\[checklist\.md\]\(checklist\.md\)/g, `\`${reviewBasePath}/checklist.md\``)
|
|
95
|
-
.replace(
|
|
96
|
-
/\[anti-patterns\.md\]\(\.\.\/guide\/anti-patterns\.md\)/g,
|
|
97
|
-
`\`${guideBasePath}/anti-patterns.md\``
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
writeFileSync(join(commandsDir, 'ts-procedures-review.md'), autoHeader + reviewBody, 'utf-8');
|
|
101
|
-
files.push('.claude/commands/ts-procedures-review.md');
|
|
102
|
-
|
|
103
|
-
// 4. Architect agent
|
|
104
|
-
const architectAgent = readFileSync(join(AGENTS_DIR, 'ts-procedures-architect.md'), 'utf-8');
|
|
105
|
-
writeFileSync(join(agentsDir, 'ts-procedures-architect.md'), autoHeader + architectAgent, 'utf-8');
|
|
106
|
-
files.push('.claude/agents/ts-procedures-architect.md');
|
|
107
|
-
|
|
45
|
+
for (const skill of SKILL_NAMES) {
|
|
46
|
+
const src = join(SOURCE_DIR, 'skills', skill);
|
|
47
|
+
cpSync(src, join(skillsDest, skill), { recursive: true, force: true });
|
|
48
|
+
for (const rel of listFilesRecursive(src)) {
|
|
49
|
+
files.push(`.claude/skills/${skill}/${rel}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (const agent of AGENT_FILES) {
|
|
53
|
+
cpSync(join(SOURCE_DIR, 'agents', agent), join(agentsDest, agent), { force: true });
|
|
54
|
+
files.push(`.claude/agents/${agent}`);
|
|
55
|
+
}
|
|
108
56
|
return { files };
|
|
109
57
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ClientAdapter, ClientHooks, CallDescriptor } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Executes a single procedure call through the adapter.
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 1. Build AdapterRequest from descriptor
|
|
7
|
+
* 2. Run onBeforeRequest hooks (global then local)
|
|
8
|
+
* 3. Call adapter.request()
|
|
9
|
+
* 4. On adapter error: run onError hooks, re-throw
|
|
10
|
+
* 5. Run onAfterResponse hooks (hooks may mutate response.status)
|
|
11
|
+
* 6. If response status is non-2xx: throw ClientRequestError
|
|
12
|
+
* 7. Return response.body as TResponse
|
|
13
|
+
*/
|
|
14
|
+
export declare function executeCall<TResponse>(descriptor: CallDescriptor, basePath: string, adapter: ClientAdapter, globalHooks: ClientHooks, localHooks: ClientHooks | undefined): Promise<TResponse>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { buildAdapterRequest } from './request-builder.js';
|
|
2
|
+
import { runBeforeRequest, runAfterResponse, runOnError } from './hooks.js';
|
|
3
|
+
import { ClientRequestError } from './errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Executes a single procedure call through the adapter.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. Build AdapterRequest from descriptor
|
|
9
|
+
* 2. Run onBeforeRequest hooks (global then local)
|
|
10
|
+
* 3. Call adapter.request()
|
|
11
|
+
* 4. On adapter error: run onError hooks, re-throw
|
|
12
|
+
* 5. Run onAfterResponse hooks (hooks may mutate response.status)
|
|
13
|
+
* 6. If response status is non-2xx: throw ClientRequestError
|
|
14
|
+
* 7. Return response.body as TResponse
|
|
15
|
+
*/
|
|
16
|
+
export async function executeCall(descriptor, basePath, adapter, globalHooks, localHooks) {
|
|
17
|
+
// 1. Build the initial request
|
|
18
|
+
let request = buildAdapterRequest(descriptor, basePath);
|
|
19
|
+
// 2. Run before-request hooks — they may mutate the request
|
|
20
|
+
const beforeCtx = await runBeforeRequest({ procedureName: descriptor.name, scope: descriptor.scope, request }, globalHooks, localHooks);
|
|
21
|
+
request = beforeCtx.request;
|
|
22
|
+
// 3. Call the adapter
|
|
23
|
+
let response;
|
|
24
|
+
try {
|
|
25
|
+
response = await adapter.request(request);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
// 4. On adapter error: run error hooks, re-throw
|
|
29
|
+
await runOnError({ procedureName: descriptor.name, scope: descriptor.scope, request, error: err }, globalHooks, localHooks);
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
// 5. Run after-response hooks — they may mutate response.status to swallow errors
|
|
33
|
+
await runAfterResponse({ procedureName: descriptor.name, scope: descriptor.scope, request, response }, globalHooks, localHooks);
|
|
34
|
+
// 6. Check status AFTER hooks (hooks may have swallowed the error by mutating status)
|
|
35
|
+
if (response.status < 200 || response.status >= 300) {
|
|
36
|
+
throw new ClientRequestError({
|
|
37
|
+
status: response.status,
|
|
38
|
+
headers: response.headers,
|
|
39
|
+
body: response.body,
|
|
40
|
+
procedureName: descriptor.name,
|
|
41
|
+
scope: descriptor.scope,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// 7. Return the body
|
|
45
|
+
return response.body;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../../src/client/call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAOhD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAA0B,EAC1B,QAAgB,EAChB,OAAsB,EACtB,WAAwB,EACxB,UAAmC;IAEnC,+BAA+B;IAC/B,IAAI,OAAO,GAAG,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAEvD,4DAA4D;IAC5D,MAAM,SAAS,GAAG,MAAM,gBAAgB,CACtC,EAAE,aAAa,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,EACpE,WAAW,EACX,UAAU,CACX,CAAA;IACD,OAAO,GAAG,SAAS,CAAC,OAAO,CAAA;IAE3B,sBAAsB;IACtB,IAAI,QAAQ,CAAA;IACZ,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,iDAAiD;QACjD,MAAM,UAAU,CACd,EAAE,aAAa,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAChF,WAAW,EACX,UAAU,CACX,CAAA;QACD,MAAM,GAAG,CAAA;IACX,CAAC;IAED,kFAAkF;IAClF,MAAM,gBAAgB,CACpB,EAAE,aAAa,EAAE,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAC9E,WAAW,EACX,UAAU,CACX,CAAA;IAED,sFAAsF;IACtF,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACpD,MAAM,IAAI,kBAAkB,CAAC;YAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,aAAa,EAAE,UAAU,CAAC,IAAI;YAC9B,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAC,CAAA;IACJ,CAAC;IAED,qBAAqB;IACrB,OAAO,QAAQ,CAAC,IAAiB,CAAA;AACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { executeCall } from './call.js';
|
|
3
|
+
import { ClientRequestError } from './errors.js';
|
|
4
|
+
// ── helpers ───────────────────────────────────────────────
|
|
5
|
+
function makeDescriptor(overrides) {
|
|
6
|
+
return {
|
|
7
|
+
name: 'GetUser',
|
|
8
|
+
scope: 'users',
|
|
9
|
+
path: '/users',
|
|
10
|
+
method: 'GET',
|
|
11
|
+
kind: 'rpc',
|
|
12
|
+
params: { id: '42' },
|
|
13
|
+
...overrides,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function makeAdapter(response) {
|
|
17
|
+
return {
|
|
18
|
+
request: vi.fn(async (_req) => ({
|
|
19
|
+
status: 200,
|
|
20
|
+
headers: {},
|
|
21
|
+
body: { id: '42', name: 'Alice' },
|
|
22
|
+
...response,
|
|
23
|
+
})),
|
|
24
|
+
stream: vi.fn(async () => {
|
|
25
|
+
throw new Error('stream not expected in call tests');
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// ── executeCall ───────────────────────────────────────────
|
|
30
|
+
describe('executeCall', () => {
|
|
31
|
+
it('calls adapter.request and returns body', async () => {
|
|
32
|
+
const adapter = makeAdapter({ body: { id: '1', name: 'Bob' } });
|
|
33
|
+
const result = await executeCall(makeDescriptor(), 'https://api.example.com', adapter, {}, undefined);
|
|
34
|
+
expect(adapter.request).toHaveBeenCalledOnce();
|
|
35
|
+
expect(result).toEqual({ id: '1', name: 'Bob' });
|
|
36
|
+
});
|
|
37
|
+
it('throws ClientRequestError on 4xx response', async () => {
|
|
38
|
+
const adapter = makeAdapter({ status: 404, body: { message: 'Not Found' } });
|
|
39
|
+
await expect(executeCall(makeDescriptor(), 'https://api.example.com', adapter, {}, undefined)).rejects.toThrow(ClientRequestError);
|
|
40
|
+
});
|
|
41
|
+
it('throws ClientRequestError on 5xx response', async () => {
|
|
42
|
+
const adapter = makeAdapter({ status: 500, body: { message: 'Server Error' } });
|
|
43
|
+
await expect(executeCall(makeDescriptor(), 'https://api.example.com', adapter, {}, undefined)).rejects.toThrow(ClientRequestError);
|
|
44
|
+
});
|
|
45
|
+
it('throws ClientRequestError on 199 response (below 200)', async () => {
|
|
46
|
+
const adapter = makeAdapter({ status: 199, body: null });
|
|
47
|
+
await expect(executeCall(makeDescriptor(), 'https://api.example.com', adapter, {}, undefined)).rejects.toThrow(ClientRequestError);
|
|
48
|
+
});
|
|
49
|
+
it('does not throw on 2xx boundary responses (200, 201, 299)', async () => {
|
|
50
|
+
for (const status of [200, 201, 204, 299]) {
|
|
51
|
+
const adapter = makeAdapter({ status, body: null });
|
|
52
|
+
await expect(executeCall(makeDescriptor(), 'https://api.example.com', adapter, {}, undefined)).resolves.not.toThrow();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
it('runs onBeforeRequest before calling adapter (headers are modified)', async () => {
|
|
56
|
+
const capturedHeaders = [];
|
|
57
|
+
const adapter = {
|
|
58
|
+
request: vi.fn(async (req) => {
|
|
59
|
+
capturedHeaders.push(req.headers ?? {});
|
|
60
|
+
return { status: 200, headers: {}, body: {} };
|
|
61
|
+
}),
|
|
62
|
+
stream: vi.fn(async () => { throw new Error('not expected'); }),
|
|
63
|
+
};
|
|
64
|
+
const globalHooks = {
|
|
65
|
+
onBeforeRequest: (ctx) => ({
|
|
66
|
+
...ctx,
|
|
67
|
+
request: {
|
|
68
|
+
...ctx.request,
|
|
69
|
+
headers: { ...ctx.request.headers, 'x-auth': 'token-123' },
|
|
70
|
+
},
|
|
71
|
+
}),
|
|
72
|
+
};
|
|
73
|
+
await executeCall(makeDescriptor(), 'https://api.example.com', adapter, globalHooks, undefined);
|
|
74
|
+
expect(capturedHeaders[0]?.['x-auth']).toBe('token-123');
|
|
75
|
+
});
|
|
76
|
+
it('runs onAfterResponse after adapter returns', async () => {
|
|
77
|
+
const order = [];
|
|
78
|
+
const adapter = {
|
|
79
|
+
request: vi.fn(async () => {
|
|
80
|
+
order.push('adapter');
|
|
81
|
+
return { status: 200, headers: {}, body: {} };
|
|
82
|
+
}),
|
|
83
|
+
stream: vi.fn(async () => { throw new Error('not expected'); }),
|
|
84
|
+
};
|
|
85
|
+
const globalHooks = {
|
|
86
|
+
onAfterResponse: () => { order.push('afterResponse'); },
|
|
87
|
+
};
|
|
88
|
+
await executeCall(makeDescriptor(), 'https://api.example.com', adapter, globalHooks, undefined);
|
|
89
|
+
expect(order).toEqual(['adapter', 'afterResponse']);
|
|
90
|
+
});
|
|
91
|
+
it('does not throw when onAfterResponse swallows non-2xx by mutating status', async () => {
|
|
92
|
+
const adapter = makeAdapter({ status: 401, body: { message: 'Unauthorized' } });
|
|
93
|
+
const globalHooks = {
|
|
94
|
+
onAfterResponse: (ctx) => {
|
|
95
|
+
// Swallow the error by setting status to 200
|
|
96
|
+
ctx.response.status = 200;
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
await expect(executeCall(makeDescriptor(), 'https://api.example.com', adapter, globalHooks, undefined)).resolves.not.toThrow();
|
|
100
|
+
});
|
|
101
|
+
it('runs onError on adapter failure and re-throws', async () => {
|
|
102
|
+
const adapterError = new Error('Network failure');
|
|
103
|
+
const adapter = {
|
|
104
|
+
request: vi.fn(async () => { throw adapterError; }),
|
|
105
|
+
stream: vi.fn(async () => { throw new Error('not expected'); }),
|
|
106
|
+
};
|
|
107
|
+
const receivedErrors = [];
|
|
108
|
+
const globalHooks = {
|
|
109
|
+
onError: (ctx) => { receivedErrors.push(ctx.error); },
|
|
110
|
+
};
|
|
111
|
+
await expect(executeCall(makeDescriptor(), 'https://api.example.com', adapter, globalHooks, undefined)).rejects.toThrow('Network failure');
|
|
112
|
+
expect(receivedErrors[0]).toBe(adapterError);
|
|
113
|
+
});
|
|
114
|
+
it('passes per-procedure hooks as local hooks', async () => {
|
|
115
|
+
const adapter = makeAdapter();
|
|
116
|
+
const localOrder = [];
|
|
117
|
+
const localHooks = {
|
|
118
|
+
onBeforeRequest: (ctx) => { localOrder.push('local-before'); return ctx; },
|
|
119
|
+
};
|
|
120
|
+
await executeCall(makeDescriptor(), 'https://api.example.com', adapter, {}, localHooks);
|
|
121
|
+
expect(localOrder).toContain('local-before');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=call.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call.test.js","sourceRoot":"","sources":["../../../src/client/call.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare class ClientRequestError extends Error {
|
|
2
|
+
readonly name = "ClientRequestError";
|
|
3
|
+
readonly status: number;
|
|
4
|
+
readonly headers: Record<string, string>;
|
|
5
|
+
readonly body: unknown;
|
|
6
|
+
readonly procedureName: string;
|
|
7
|
+
readonly scope: string;
|
|
8
|
+
constructor(opts: {
|
|
9
|
+
status: number;
|
|
10
|
+
headers: Record<string, string>;
|
|
11
|
+
body: unknown;
|
|
12
|
+
procedureName: string;
|
|
13
|
+
scope: string;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export declare class ClientPathParamError extends Error {
|
|
17
|
+
readonly name = "ClientPathParamError";
|
|
18
|
+
constructor(param: string, path: string, procedureName: string);
|
|
19
|
+
}
|
|
20
|
+
export declare class ClientStreamError extends Error {
|
|
21
|
+
readonly name = "ClientStreamError";
|
|
22
|
+
readonly procedureName: string;
|
|
23
|
+
readonly scope: string;
|
|
24
|
+
constructor(message: string, procedureName: string, scope: string);
|
|
25
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export class ClientRequestError extends Error {
|
|
2
|
+
name = 'ClientRequestError';
|
|
3
|
+
status;
|
|
4
|
+
headers;
|
|
5
|
+
body;
|
|
6
|
+
procedureName;
|
|
7
|
+
scope;
|
|
8
|
+
constructor(opts) {
|
|
9
|
+
super(`${opts.procedureName} (${opts.scope}) failed with status ${opts.status}`);
|
|
10
|
+
this.status = opts.status;
|
|
11
|
+
this.headers = opts.headers;
|
|
12
|
+
this.body = opts.body;
|
|
13
|
+
this.procedureName = opts.procedureName;
|
|
14
|
+
this.scope = opts.scope;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class ClientPathParamError extends Error {
|
|
18
|
+
name = 'ClientPathParamError';
|
|
19
|
+
constructor(param, path, procedureName) {
|
|
20
|
+
super(`Missing path parameter "${param}" in "${path}" for procedure ${procedureName}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class ClientStreamError extends Error {
|
|
24
|
+
name = 'ClientStreamError';
|
|
25
|
+
procedureName;
|
|
26
|
+
scope;
|
|
27
|
+
constructor(message, procedureName, scope) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.procedureName = procedureName;
|
|
30
|
+
this.scope = scope;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/client/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,oBAAoB,CAAA;IAC3B,MAAM,CAAQ;IACd,OAAO,CAAwB;IAC/B,IAAI,CAAS;IACb,aAAa,CAAQ;IACrB,KAAK,CAAQ;IAEtB,YAAY,IAMX;QACC,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,KAAK,wBAAwB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAChF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACzB,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,IAAI,GAAG,sBAAsB,CAAA;IAEtC,YAAY,KAAa,EAAE,IAAY,EAAE,aAAqB;QAC5D,KAAK,CAAC,2BAA2B,KAAK,SAAS,IAAI,mBAAmB,aAAa,EAAE,CAAC,CAAA;IACxF,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,IAAI,GAAG,mBAAmB,CAAA;IAC1B,aAAa,CAAQ;IACrB,KAAK,CAAQ;IAEtB,YAAY,OAAe,EAAE,aAAqB,EAAE,KAAa;QAC/D,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { ClientRequestError, ClientPathParamError, ClientStreamError } from './errors.js';
|
|
3
|
+
describe('ClientRequestError', () => {
|
|
4
|
+
it('includes status, headers, and body', () => {
|
|
5
|
+
const err = new ClientRequestError({
|
|
6
|
+
status: 401,
|
|
7
|
+
headers: { 'x-request-id': 'abc' },
|
|
8
|
+
body: { message: 'Unauthorized' },
|
|
9
|
+
procedureName: 'GetUser',
|
|
10
|
+
scope: 'users',
|
|
11
|
+
});
|
|
12
|
+
expect(err).toBeInstanceOf(Error);
|
|
13
|
+
expect(err.name).toBe('ClientRequestError');
|
|
14
|
+
expect(err.status).toBe(401);
|
|
15
|
+
expect(err.headers['x-request-id']).toBe('abc');
|
|
16
|
+
expect(err.body).toEqual({ message: 'Unauthorized' });
|
|
17
|
+
expect(err.procedureName).toBe('GetUser');
|
|
18
|
+
expect(err.scope).toBe('users');
|
|
19
|
+
expect(err.message).toBe('GetUser (users) failed with status 401');
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe('ClientPathParamError', () => {
|
|
23
|
+
it('reports missing param', () => {
|
|
24
|
+
const err = new ClientPathParamError('id', '/users/:id', 'GetUser');
|
|
25
|
+
expect(err).toBeInstanceOf(Error);
|
|
26
|
+
expect(err.name).toBe('ClientPathParamError');
|
|
27
|
+
expect(err.message).toContain('id');
|
|
28
|
+
expect(err.message).toContain('/users/:id');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('ClientStreamError', () => {
|
|
32
|
+
it('includes procedure context', () => {
|
|
33
|
+
const err = new ClientStreamError('stream interrupted', 'Watch', 'events');
|
|
34
|
+
expect(err).toBeInstanceOf(Error);
|
|
35
|
+
expect(err.name).toBe('ClientStreamError');
|
|
36
|
+
expect(err.procedureName).toBe('Watch');
|
|
37
|
+
expect(err.scope).toBe('events');
|
|
38
|
+
expect(err.message).toBe('stream interrupted');
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=errors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../../src/client/errors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEzF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,GAAG,GAAG,IAAI,kBAAkB,CAAC;YACjC,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE;YAClC,IAAI,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE;YACjC,aAAa,EAAE,SAAS;YACxB,KAAK,EAAE,OAAO;SACf,CAAC,CAAA;QACF,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QAC3C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAA;QACrD,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACzC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,CAAA;QACnE,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;QAC7C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,oBAAoB,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;QAC1E,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAC1C,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAChC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ClientAdapter } from './types.js';
|
|
2
|
+
export interface FetchAdapterConfig {
|
|
3
|
+
headers?: Record<string, string>;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Creates a fetch-based ClientAdapter.
|
|
7
|
+
*
|
|
8
|
+
* - `config.headers` are default headers applied to every request.
|
|
9
|
+
* - Per-request headers override config headers (spread order).
|
|
10
|
+
* - Works in Node.js 18+ and browsers (uses standard fetch + ReadableStream).
|
|
11
|
+
*/
|
|
12
|
+
export declare function createFetchAdapter(config?: FetchAdapterConfig): ClientAdapter;
|