@techspokes/typescript-wsdl-client 0.21.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -219,7 +219,7 @@ See [CLI Reference](docs/cli-reference.md) for all flags and examples.
219
219
 
220
220
  | Guide | Description |
221
221
  |-------|-------------|
222
- | [Gateway Guide](docs/gateway-guide.md) | Fastify integration and error handling |
222
+ | [Gateway Guide](docs/gateway-guide.md) | Fastify integration, inbound enforcement, and error handling |
223
223
  | [Testing Guide](docs/testing.md) | Testing patterns and mock client examples |
224
224
  | [Production Guide](docs/production.md) | CI/CD, validation, logging |
225
225
  | [Troubleshooting](docs/troubleshooting.md) | Common issues and debugging |
@@ -512,11 +512,11 @@ function generatePackageJson(appDir, force) {
512
512
  fastify: "^5.8.5",
513
513
  "fastify-plugin": "^5.1.0",
514
514
  saxes: "^6.0.0",
515
- soap: "^1.9.2",
515
+ soap: "^1.9.3",
516
516
  },
517
517
  devDependencies: {
518
- "@types/node": "^25.9.0",
519
- tsx: "^4.22.2",
518
+ "@types/node": "^25.9.1",
519
+ tsx: "^4.22.3",
520
520
  typescript: "^6.0.3",
521
521
  },
522
522
  };
@@ -1 +1 @@
1
- {"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../src/gateway/generators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../src/gateway/generators.ts"],"names":[],"mappings":"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"}
@@ -701,7 +701,6 @@ export function emitPluginModule(outDir, versionSlug, serviceSlug, clientMeta, i
701
701
  */
702
702
  import fp from "fastify-plugin";
703
703
  import type { FastifyInstance, FastifyPluginOptions } from "fastify";
704
- import type { ${clientMeta.className} } from "${clientMeta.pluginImportPath}";
705
704
  import type { ${clientMeta.className}Operations } from "${clientMeta.operationsImportPath}";
706
705
  import { registerSchemas_${vSlug}_${sSlug} } from "./schemas${suffix}";
707
706
  import { registerRoutes_${vSlug}_${sSlug} } from "./routes${suffix}";
package/docs/README.md CHANGED
@@ -37,6 +37,7 @@ Human-maintained reference documents for `@techspokes/typescript-wsdl-client`. T
37
37
  - Each document opens with an H1 title and a one-line description.
38
38
  - Cross-reference related documents and the root README where relevant.
39
39
  - Use fenced code blocks for CLI examples; format flags as inline code (`` `--flag-name` ``).
40
+ - Run `npm run docs:validate` to check local links and TypeScript fenced snippets.
40
41
  - Keep language direct and task-oriented; architecture.md targets contributors, all others target users.
41
42
 
42
43
  ## Related
@@ -46,6 +46,21 @@ The older OpenAPI-only shape with top-level `global` and `overrides` is still ac
46
46
 
47
47
  The generated app scaffold reads upstream secrets from environment variables. It does not embed secret values in generated source and does not implement production JWT, OAuth, or API-key verification for inbound gateway requests. Add that verification in app hooks or your platform gateway.
48
48
 
49
+ ### Runtime Enforcement Boundaries
50
+
51
+ The `gateway` security settings describe the generated REST API and add request header schema validation. They do not authenticate callers or authorize access to operations.
52
+
53
+ The `upstream` security settings configure how the generated app creates `node-soap` runtime security for calls from the gateway to the SOAP service. They do not enforce inbound REST gateway access.
54
+
55
+ | Concern | Configured In | Generated Behavior | Consumer Responsibility |
56
+ |---------|---------------|--------------------|-------------------------|
57
+ | OpenAPI security schemes | `gateway.global` and `gateway.operations` | Emits OpenAPI security metadata | Keep API documentation aligned with runtime policy |
58
+ | Required inbound headers | `gateway.global.headers` | Adds Fastify schema validation | Verify header values in host app hooks |
59
+ | Inbound JWT verification | Host app or platform gateway | No generated verifier | Validate issuer, audience, signature, and claims |
60
+ | Inbound API key verification | Host app or platform gateway | No generated key lookup | Compare keys against a trusted secret store |
61
+ | Inbound mutual TLS | TLS terminator or host app | No generated certificate validation | Verify client certificate signals from trusted infrastructure |
62
+ | Upstream SOAP credentials | `upstream` | Builds `node-soap` security from environment variables | Provide secrets through deployment environment variables |
63
+
49
64
  ## Tags Configuration
50
65
 
51
66
  Pass via `--openapi-tags-file`.
@@ -34,7 +34,107 @@ await app.listen({ port: 3000 });
34
34
 
35
35
  The plugin automatically decorates Fastify with the SOAP client, registers JSON schemas, installs a centralized error handler, and registers all routes.
36
36
 
37
- Route paths are determined by --openapi-base-path during generation. The prefix option adds an additional runtime prefix on top of generated paths.
37
+ Route paths are determined by `--openapi-base-path` during generation. The prefix option adds an additional runtime prefix on top of generated paths.
38
+
39
+ ## Inbound Gateway Enforcement
40
+
41
+ Install inbound authentication, authorization, logging, and request correlation in the host Fastify app before registering the generated gateway plugin. Generated route files are safe to regenerate because custom policy stays outside the generated directory.
42
+
43
+ The example below accepts either a trusted API key or a bearer token. Replace `verifyJwt` and `principalCanCallWeather` with application-specific policy code.
44
+
45
+ ```typescript
46
+ import { randomUUID } from "node:crypto";
47
+ import Fastify from "fastify";
48
+ import weatherGateway from "./gateway/plugin.js";
49
+ import { Weather } from "./client/client.js";
50
+
51
+ interface GatewayPrincipal {
52
+ subject: string;
53
+ scopes: string[];
54
+ }
55
+
56
+ declare module "fastify" {
57
+ interface FastifyRequest {
58
+ correlationId: string;
59
+ principal?: GatewayPrincipal;
60
+ }
61
+ }
62
+
63
+ declare function verifyJwt(token: string): Promise<GatewayPrincipal>;
64
+ declare function principalCanCallWeather(principal: GatewayPrincipal): boolean;
65
+
66
+ const app = Fastify({ logger: true });
67
+
68
+ app.addHook("onRequest", async (request, reply) => {
69
+ const header = request.headers["x-correlation-id"];
70
+ request.correlationId = typeof header === "string" && header.length > 0 ? header : randomUUID();
71
+ reply.header("x-correlation-id", request.correlationId);
72
+ request.log.info({ correlationId: request.correlationId }, "gateway request started");
73
+ });
74
+
75
+ app.addHook("preHandler", async (request, reply) => {
76
+ const expectedApiKey = process.env.GATEWAY_API_KEY;
77
+ const apiKey = request.headers["x-api-key"];
78
+ if (expectedApiKey && apiKey === expectedApiKey) return;
79
+
80
+ const authorization = request.headers.authorization;
81
+ if (!authorization?.startsWith("Bearer ")) {
82
+ return reply.code(401).send({ error: "missing gateway credentials" });
83
+ }
84
+
85
+ const principal = await verifyJwt(authorization.slice("Bearer ".length));
86
+ if (!principalCanCallWeather(principal)) {
87
+ return reply.code(403).send({ error: "gateway access denied" });
88
+ }
89
+
90
+ request.principal = principal;
91
+ });
92
+
93
+ const weatherClient = new Weather({
94
+ source: "https://example.com/weather.wsdl",
95
+ });
96
+
97
+ await app.register(weatherGateway, {
98
+ client: weatherClient,
99
+ });
100
+ ```
101
+
102
+ ### Mutual TLS Signals
103
+
104
+ When Fastify terminates TLS directly, inspect the peer certificate before generated handlers run.
105
+
106
+ ```typescript
107
+ import type { TLSSocket } from "node:tls";
108
+
109
+ app.addHook("preHandler", async (request, reply) => {
110
+ const socket = request.raw.socket as TLSSocket;
111
+ const cert = socket.getPeerCertificate();
112
+ if (!cert || Object.keys(cert).length === 0) {
113
+ return reply.code(401).send({ error: "client certificate required" });
114
+ }
115
+
116
+ request.log.info({ subject: cert.subject }, "client certificate accepted");
117
+ });
118
+ ```
119
+
120
+ When TLS terminates at a load balancer or platform gateway, verify a trusted internal signal instead of reading the socket certificate. Strip public client-supplied certificate headers at ingress and inject trusted headers only after certificate validation succeeds.
121
+
122
+ ```typescript
123
+ app.addHook("preHandler", async (request, reply) => {
124
+ const subject = request.headers["x-client-cert-subject"];
125
+ if (typeof subject !== "string" || subject.length === 0) {
126
+ return reply.code(401).send({ error: "client certificate signal required" });
127
+ }
128
+
129
+ request.log.info({ subject }, "trusted client certificate signal accepted");
130
+ });
131
+ ```
132
+
133
+ ### Where To Put Custom Logic
134
+
135
+ Use host app hooks for authentication, authorization, logging, request correlation, and platform headers. Register hooks before `app.register(weatherGateway, ...)` so they run before generated route handlers.
136
+
137
+ Use Fastify encapsulation when different generated services need different policies. Do not edit generated route files because regeneration overwrites them.
38
138
 
39
139
  ## Using Individual Components (Advanced)
40
140
 
@@ -115,7 +215,7 @@ export async function registerRoute_v1_weather_getweatherinformation(fastify: Fa
115
215
  The client method returns `StreamOperationResponse<RecordType>` with a
116
216
  `records: AsyncIterable<RecordType>`. Errors raised before the first record
117
217
  use the normal error envelope; errors raised mid-stream trip the chunked
118
- response's truncation consumers detect these via the absence of a clean
218
+ response's truncation. Consumers detect these via the absence of a clean
119
219
  terminating zero-chunk.
120
220
 
121
221
  ## Error Handling
@@ -0,0 +1,30 @@
1
+ # TypeScript WSDL Client v0.22.0
2
+
3
+ ## Release Workflow And Dependency Refresh
4
+
5
+ This release refreshes dependency pins from the recent bot merges and carries forward release documentation improvements for the packaged agent skill workflow.
6
+
7
+ ## What This Improves
8
+
9
+ Maintainers get a release flow whose generated draft bodies use validated release-note subtitles and consumer-facing validation language. Consumer projects generated by the app scaffold also receive newer SOAP runtime and TypeScript execution pins without manual dependency editing.
10
+
11
+ ## Highlights
12
+
13
+ - Updates root pins to `@types/node` 25.9.1, `soap` 1.9.3, `tsx` 4.22.3, and `vitest` 4.1.7.
14
+ - Updates app scaffold pins to `@types/node` 25.9.1, `soap` 1.9.3, and `tsx` 4.22.3.
15
+ - Renders draft release bodies from validated release-note subtitles.
16
+ - Describes release validation as consumer-facing outcomes and surfaces the standalone agent skill artifact in docs.
17
+
18
+ ## Upgrade Notes
19
+
20
+ No special upgrade steps.
21
+
22
+ ## Validation
23
+
24
+ - CI passed.
25
+ - NPM package contents were validated.
26
+ - Agent skill artifact was validated and packaged.
27
+
28
+ ## Notes
29
+
30
+ Release tag: `v0.22.0`.
@@ -0,0 +1,31 @@
1
+ # TypeScript WSDL Client v0.23.0
2
+
3
+ ## Documentation Validation And Gateway Boundaries
4
+
5
+ This release adds portable documentation validation and clarifies where generated gateways expect applications or platform gateways to enforce inbound security controls.
6
+
7
+ ## What This Improves
8
+
9
+ Maintainers now have a repeatable check for local Markdown links and TypeScript fenced snippets before release. Gateway adopters get clearer guidance for adding authentication, authorization, logging, and request correlation around generated route files without editing generated output.
10
+
11
+ ## Highlights
12
+
13
+ - Adds `npm run docs:validate` for repository-maintained Markdown links and TypeScript fenced snippets.
14
+ - Includes documentation validation in `npm run ci`.
15
+ - Documents inbound gateway enforcement extension points for generated Fastify apps.
16
+ - Updates the roadmap to reflect the shipped documentation validator and current release-health priorities.
17
+
18
+ ## Upgrade Notes
19
+
20
+ No special upgrade steps.
21
+
22
+ ## Validation
23
+
24
+ - CI passed.
25
+ - NPM package contents were validated.
26
+ - Documentation links and TypeScript fenced snippets were validated.
27
+ - Agent skill artifact was validated and packaged.
28
+
29
+ ## Notes
30
+
31
+ Release tag: `v0.23.0`.
@@ -0,0 +1,38 @@
1
+ # TypeScript WSDL Client v0.24.0
2
+
3
+ ## Local Release Preflight Verification
4
+
5
+ This release adds a local preflight script that mirrors the release-draft workflow's gates and adds checks the workflow cannot see, so maintainers catch release issues before tagging instead of after.
6
+
7
+ ## What This Improves
8
+
9
+ Maintainers now have a single command that verifies tag, version, changelog, release notes, dependency pin freshness, lockfile sync, committed-examples drift, the full CI pipeline, and the agent skill artifact before pushing a tag. Failures surface locally with the same messages the draft-release workflow would print, so a fix that satisfies the local check also satisfies the workflow.
10
+
11
+ Generated gateway plugins also avoid importing concrete client classes when only the operations interface is needed, keeping IDE inspections clean for release candidates.
12
+
13
+ The preflight example comparison now ignores committed explanatory files and normalizes catalog paths that vary by temporary regeneration directory, so it reports real generated drift instead of environment-specific metadata.
14
+
15
+ ## Highlights
16
+
17
+ - Adds `npm run release:preflight -- vX.Y.Z` with 13 ordered checks across release metadata, dependency state, generated examples, full CI, and skill packaging.
18
+ - Adds `--skip-ci`, `--skip-examples`, and `--skip-deps` flags for fast iteration on metadata-only changes.
19
+ - Extracts shared dependency helpers into `scripts/lib/deps.mjs` so `release:preflight` and `maint:deps` share one source of truth for pin verification.
20
+ - Extracts release-notes structural verification into `scripts/lib/release-notes.mjs` as a pure, CLI-runnable verifier mirroring the draft-release workflow rules.
21
+ - Stops generated `plugin.ts` files from importing unused concrete client classes.
22
+ - Normalizes generated example freshness checks to avoid false drift on `README.md` and `catalog.json` paths.
23
+
24
+ ## Upgrade Notes
25
+
26
+ No runtime upgrade steps. Maintainers can adopt the preflight by running `npm run release:preflight -- v<version>` before tagging; the existing release workflow continues to work unchanged.
27
+
28
+ ## Validation
29
+
30
+ - CI passed.
31
+ - NPM package contents were validated.
32
+ - Documentation links and TypeScript fenced snippets were validated.
33
+ - Agent skill artifact was validated and packaged.
34
+ - Release preflight passed against the target tag.
35
+
36
+ ## Notes
37
+
38
+ Release tag: `v0.24.0`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techspokes/typescript-wsdl-client",
3
- "version": "0.21.0",
3
+ "version": "0.24.0",
4
4
  "description": "Turn legacy WSDL/SOAP services into typed TypeScript clients, OpenAPI 3.1 specs, and production-ready Fastify REST gateways. Built for enterprise SOAP modernization.",
5
5
  "keywords": [
6
6
  "wsdl",
@@ -80,29 +80,31 @@
80
80
  "smoke:pipeline": "npm run smoke:reset && tsx src/cli.ts pipeline --wsdl-source examples/minimal/weather.wsdl --client-dir tmp/client --openapi-file tmp/openapi.json --gateway-dir tmp/gateway --gateway-service-name weather --gateway-version-prefix v1 --openapi-format json --init-app && tsc -p tsconfig.smoke.json",
81
81
  "smoke:app": "npm run smoke:reset && tsx src/cli.ts pipeline --wsdl-source examples/minimal/weather.wsdl --client-dir tmp/client --openapi-file tmp/openapi.json --gateway-dir tmp/gateway --gateway-service-name weather --gateway-version-prefix v1 --openapi-format json --openapi-servers https://example.com/api && tsx src/cli.ts app --client-dir tmp/client --gateway-dir tmp/gateway --openapi-file tmp/openapi.json --app-dir tmp/app --port 8080 && tsc -p tsconfig.smoke.json",
82
82
  "maint:deps": "node scripts/maint-deps.mjs",
83
+ "docs:validate": "node scripts/validate-docs.mjs",
83
84
  "skill:validate": "node scripts/validate-agent-skill.mjs",
84
85
  "skill:package": "node scripts/build-agent-skill.mjs",
85
86
  "package:validate": "node scripts/validate-npm-package.mjs",
86
- "ci": "npm run clean && npm run build && npm run typecheck && npm run skill:validate && npm run package:validate && vitest run && npm run smoke:pipeline",
87
+ "release:preflight": "node scripts/release-preflight.mjs",
88
+ "ci": "npm run clean && npm run build && npm run typecheck && npm run skill:validate && npm run package:validate && npm run docs:validate && vitest run && npm run smoke:pipeline",
87
89
  "examples:regenerate": "tsx src/cli.ts pipeline --wsdl-source examples/minimal/weather.wsdl --client-dir examples/generated-output/client --openapi-file examples/generated-output/openapi.json --gateway-dir examples/generated-output/gateway --gateway-service-name weather --gateway-version-prefix v1 --openapi-format json"
88
90
  },
89
91
  "devDependencies": {
90
92
  "@types/js-yaml": "^4.0.9",
91
- "@types/node": "^25.9.0",
93
+ "@types/node": "^25.9.1",
92
94
  "@types/yargs": "^17.0.35",
93
95
  "fastify": "^5.8.5",
94
96
  "fastify-plugin": "^5.1.0",
95
97
  "rimraf": "^6.1.3",
96
- "tsx": "^4.22.2",
98
+ "tsx": "^4.22.3",
97
99
  "typescript": "^6.0.3",
98
- "vitest": "^4.1.6"
100
+ "vitest": "^4.1.7"
99
101
  },
100
102
  "dependencies": {
101
103
  "@apidevtools/swagger-parser": "^12.1.0",
102
104
  "fast-xml-parser": "^5.8.0",
103
105
  "js-yaml": "^4.1.1",
104
106
  "saxes": "^6.0.0",
105
- "soap": "^1.9.2",
107
+ "soap": "^1.9.3",
106
108
  "yargs": "^18.0.0"
107
109
  },
108
110
  "funding": {