@techspokes/typescript-wsdl-client 0.39.0 → 1.0.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/README.md +10 -8
- package/dist/app/generateApp.js +2 -2
- package/dist/cli.js +5 -6
- package/dist/compiler/schemaCompiler.d.ts +2 -2
- package/dist/compiler/shapeResolver.js +1 -1
- package/docs/api-reference.md +4 -4
- package/docs/cli-reference.md +18 -16
- package/docs/gateway-guide.md +5 -5
- package/docs/migration-playbook.md +18 -18
- package/docs/migration.md +35 -0
- package/docs/output-anatomy.md +2 -2
- package/docs/production.md +1 -1
- package/docs/releases/README.md +32 -0
- package/docs/releases/v0.40.0.md +45 -0
- package/docs/releases/v0.40.1.md +34 -0
- package/docs/releases/v1.0.0.md +42 -0
- package/docs/releases/v1.0.1.md +38 -0
- package/docs/releases/v1.0.2.md +51 -0
- package/docs/roadmap/README.md +9 -9
- package/docs/roadmap/v1.0-capability-conformance-framework.md +14 -12
- package/docs/roadmap/v1.0-contract-audit.md +3 -3
- package/docs/roadmap/v1.0-release-candidate-gates.md +10 -6
- package/docs/roadmap/v1.0-wsdl-coverage-matrix.md +12 -2
- package/docs/roadmap/v1.0-xs-anyattribute-wildcard-bag.md +49 -49
- package/docs/start-here.md +8 -8
- package/docs/testing.md +6 -6
- package/package.json +14 -7
package/README.md
CHANGED
|
@@ -43,12 +43,14 @@ Requirements: Node.js 24+ and the `soap` package as a runtime dependency.
|
|
|
43
43
|
|
|
44
44
|
## Quick Start
|
|
45
45
|
|
|
46
|
+
The CLI requires explicit output paths. These examples use the git-ignored `.generated/` directory for disposable consumer output; repository automation uses `tmp/` separately.
|
|
47
|
+
|
|
46
48
|
### Generate a typed client
|
|
47
49
|
|
|
48
50
|
```bash
|
|
49
51
|
npx wsdl-tsc client \
|
|
50
52
|
--wsdl-source examples/minimal/weather.wsdl \
|
|
51
|
-
--client-dir
|
|
53
|
+
--client-dir ./.generated/client
|
|
52
54
|
```
|
|
53
55
|
|
|
54
56
|
This produces `types.ts`, `client.ts`, `operations.ts`, and `utils.ts` in the output directory.
|
|
@@ -58,7 +60,7 @@ This produces `types.ts`, `client.ts`, `operations.ts`, and `utils.ts` in the ou
|
|
|
58
60
|
```bash
|
|
59
61
|
npx wsdl-tsc openapi \
|
|
60
62
|
--wsdl-source examples/minimal/weather.wsdl \
|
|
61
|
-
--openapi-file
|
|
63
|
+
--openapi-file ./.generated/openapi.json
|
|
62
64
|
```
|
|
63
65
|
|
|
64
66
|
### Generate the full stack
|
|
@@ -66,9 +68,9 @@ npx wsdl-tsc openapi \
|
|
|
66
68
|
```bash
|
|
67
69
|
npx wsdl-tsc pipeline \
|
|
68
70
|
--wsdl-source examples/minimal/weather.wsdl \
|
|
69
|
-
--client-dir
|
|
70
|
-
--openapi-file
|
|
71
|
-
--gateway-dir
|
|
71
|
+
--client-dir ./.generated/client \
|
|
72
|
+
--openapi-file ./.generated/openapi.json \
|
|
73
|
+
--gateway-dir ./.generated/gateway \
|
|
72
74
|
--gateway-service-name weather \
|
|
73
75
|
--gateway-version-prefix v1 \
|
|
74
76
|
--init-app
|
|
@@ -77,7 +79,7 @@ npx wsdl-tsc pipeline \
|
|
|
77
79
|
### Run and test
|
|
78
80
|
|
|
79
81
|
```bash
|
|
80
|
-
cd generated/app && npm install && cp .env.example .env && npm start
|
|
82
|
+
cd .generated/app && npm install && cp .env.example .env && npm start
|
|
81
83
|
```
|
|
82
84
|
|
|
83
85
|
```bash
|
|
@@ -165,7 +167,7 @@ See [Core Concepts](docs/concepts.md) and [Supported Patterns](docs/supported-pa
|
|
|
165
167
|
The generated `operations.ts` provides a typed interface for mocking the SOAP client without importing the concrete class or the `soap` package:
|
|
166
168
|
|
|
167
169
|
```typescript
|
|
168
|
-
import type { WeatherOperations } from "
|
|
170
|
+
import type { WeatherOperations } from "./.generated/client/operations.js";
|
|
169
171
|
|
|
170
172
|
const mockClient: WeatherOperations = {
|
|
171
173
|
GetCityWeatherByZIP: async (args) => ({
|
|
@@ -175,7 +177,7 @@ const mockClient: WeatherOperations = {
|
|
|
175
177
|
};
|
|
176
178
|
|
|
177
179
|
import Fastify from "fastify";
|
|
178
|
-
import { weatherGateway } from "
|
|
180
|
+
import { weatherGateway } from "./.generated/gateway/plugin.js";
|
|
179
181
|
|
|
180
182
|
const app = Fastify();
|
|
181
183
|
await app.register(weatherGateway, { client: mockClient, prefix: "/v1/weather" });
|
package/dist/app/generateApp.js
CHANGED
|
@@ -525,13 +525,13 @@ function generatePackageJson(appDir, force) {
|
|
|
525
525
|
dev: "tsx watch server.ts",
|
|
526
526
|
},
|
|
527
527
|
dependencies: {
|
|
528
|
-
fastify: "^5.
|
|
528
|
+
fastify: "^5.10.0",
|
|
529
529
|
"fastify-plugin": "^6.0.0",
|
|
530
530
|
saxes: "^6.0.0",
|
|
531
531
|
soap: "^1.9.3",
|
|
532
532
|
},
|
|
533
533
|
devDependencies: {
|
|
534
|
-
"@types/node": "^26.1.
|
|
534
|
+
"@types/node": "^26.1.1",
|
|
535
535
|
tsx: "^4.23.0",
|
|
536
536
|
typescript: "^6.0.3",
|
|
537
537
|
},
|
package/dist/cli.js
CHANGED
|
@@ -143,7 +143,7 @@ if (rawArgs[0] === "client") {
|
|
|
143
143
|
})
|
|
144
144
|
.option("catalog-file", {
|
|
145
145
|
type: "string",
|
|
146
|
-
desc: "Existing
|
|
146
|
+
desc: "Existing catalog input, or WSDL compilation output (default: {client-dir}/catalog.json)"
|
|
147
147
|
})
|
|
148
148
|
.option("client-dir", {
|
|
149
149
|
type: "string",
|
|
@@ -238,7 +238,7 @@ if (rawArgs[0] === "openapi") {
|
|
|
238
238
|
.scriptName("wsdl-tsc openapi")
|
|
239
239
|
.usage("$0 [--wsdl-source <file|url> | --catalog-file <file>] --openapi-file <path> [options]")
|
|
240
240
|
.option("wsdl-source", { type: "string", desc: "Path or URL to the WSDL (exclusive with --catalog-file)" })
|
|
241
|
-
.option("catalog-file", { type: "string", desc: "Existing
|
|
241
|
+
.option("catalog-file", { type: "string", desc: "Existing catalog input (default: {openapi-file-dir}/catalog.json when --wsdl-source is omitted)" })
|
|
242
242
|
.option("openapi-file", { type: "string", demandOption: true, desc: "Output file or base path for OpenAPI" })
|
|
243
243
|
.option("openapi-format", {
|
|
244
244
|
type: "string",
|
|
@@ -590,7 +590,7 @@ if (rawArgs[0] === "pipeline") {
|
|
|
590
590
|
})
|
|
591
591
|
.option("catalog-file", {
|
|
592
592
|
type: "string",
|
|
593
|
-
desc: "Output path for catalog.json (default:
|
|
593
|
+
desc: "Output path for catalog.json (default: co-located with the first selected output)"
|
|
594
594
|
})
|
|
595
595
|
.option("clean", {
|
|
596
596
|
type: "boolean",
|
|
@@ -737,7 +737,7 @@ if (rawArgs[0] === "pipeline") {
|
|
|
737
737
|
const gatewayOut = pipelineArgv["gateway-dir"];
|
|
738
738
|
const catalogOutArg = pipelineArgv["catalog-file"];
|
|
739
739
|
if (!clientOut && !openapiOut && !gatewayOut) {
|
|
740
|
-
handleCLIError("At least one of --
|
|
740
|
+
handleCLIError("At least one of --client-dir, --openapi-file, or --gateway-dir must be provided for pipeline generation. Use compile for catalog-only output.");
|
|
741
741
|
}
|
|
742
742
|
// Determine catalog output path (always required since we always compile WSDL)
|
|
743
743
|
let catalogOut;
|
|
@@ -758,8 +758,7 @@ if (rawArgs[0] === "pipeline") {
|
|
|
758
758
|
catalogOut = path.join(path.resolve(gatewayOut), "catalog.json");
|
|
759
759
|
}
|
|
760
760
|
else {
|
|
761
|
-
|
|
762
|
-
catalogOut = path.resolve("tmp/catalog.json");
|
|
761
|
+
throw new Error("Pipeline output validation did not select a catalog location.");
|
|
763
762
|
}
|
|
764
763
|
// Handle --clean flag for client output
|
|
765
764
|
if (pipelineArgv.clean && clientOut) {
|
|
@@ -24,13 +24,13 @@ export type QName = {
|
|
|
24
24
|
local: string;
|
|
25
25
|
};
|
|
26
26
|
/**
|
|
27
|
-
* Represents
|
|
27
|
+
* Represents a xs:any wildcard particle retained on a complex type.
|
|
28
28
|
*
|
|
29
29
|
* The base compiler previously dropped wildcards silently. Keeping them as
|
|
30
30
|
* explicit markers lets downstream tools (stream-candidate detection,
|
|
31
31
|
* streaming XML converter) reason honestly about types whose payload lives
|
|
32
32
|
* outside the statically-typed schema — e.g. Escapia's content-service
|
|
33
|
-
* stream wrappers that mix
|
|
33
|
+
* stream wrappers that mix a xs:schema marker with a xs:any payload.
|
|
34
34
|
*/
|
|
35
35
|
export type CompiledWildcard = {
|
|
36
36
|
min: number;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* For stream operations whose record types live in a different WSDL (e.g.
|
|
5
5
|
* Escapia's main EVRN service provides the concrete UnitDescriptiveContentType
|
|
6
|
-
* while the content-service WSDL only exposes
|
|
6
|
+
* while the content-service WSDL only exposes a xs:any-wrapped envelope),
|
|
7
7
|
* load the companion catalog and copy the reachable record-type graph into
|
|
8
8
|
* the current catalog.
|
|
9
9
|
*
|
package/docs/api-reference.md
CHANGED
|
@@ -211,13 +211,13 @@ Programmatic callers opt into choice union mode by passing `compiler: { choice:
|
|
|
211
211
|
```typescript
|
|
212
212
|
await runGenerationPipeline({
|
|
213
213
|
wsdl: "./service.wsdl",
|
|
214
|
-
catalogOut: "
|
|
215
|
-
clientOutDir: "
|
|
214
|
+
catalogOut: "./.generated/catalog.json",
|
|
215
|
+
clientOutDir: "./.generated/client",
|
|
216
216
|
openapi: {
|
|
217
|
-
outFile: "
|
|
217
|
+
outFile: "./.generated/openapi.json"
|
|
218
218
|
},
|
|
219
219
|
gateway: {
|
|
220
|
-
outDir: "
|
|
220
|
+
outDir: "./.generated/gateway",
|
|
221
221
|
serviceSlug: "service",
|
|
222
222
|
versionSlug: "v1"
|
|
223
223
|
},
|
package/docs/cli-reference.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
The `wsdl-tsc` tool generates TypeScript SOAP clients, OpenAPI specifications, and Fastify gateways from WSDL files.
|
|
4
4
|
|
|
5
|
+
Generation paths are explicit. Examples use the git-ignored `.generated/` directory for disposable consumer output, while this repository reserves `tmp/` for its own test and release automation.
|
|
6
|
+
|
|
5
7
|
## Commands Overview
|
|
6
8
|
|
|
7
9
|
The tool provides six commands for different integration scenarios.
|
|
@@ -183,9 +185,9 @@ Complete stack:
|
|
|
183
185
|
```bash
|
|
184
186
|
npx wsdl-tsc pipeline \
|
|
185
187
|
--wsdl-source examples/minimal/weather.wsdl \
|
|
186
|
-
--client-dir
|
|
187
|
-
--openapi-file
|
|
188
|
-
--gateway-dir
|
|
188
|
+
--client-dir ./.generated/client \
|
|
189
|
+
--openapi-file ./.generated/openapi.json \
|
|
190
|
+
--gateway-dir ./.generated/gateway \
|
|
189
191
|
--gateway-service-name weather \
|
|
190
192
|
--gateway-version-prefix v1
|
|
191
193
|
```
|
|
@@ -195,9 +197,9 @@ With app scaffold:
|
|
|
195
197
|
```bash
|
|
196
198
|
npx wsdl-tsc pipeline \
|
|
197
199
|
--wsdl-source https://example.com/weather?wsdl \
|
|
198
|
-
--client-dir
|
|
199
|
-
--openapi-file
|
|
200
|
-
--gateway-dir
|
|
200
|
+
--client-dir ./.generated/client \
|
|
201
|
+
--openapi-file ./.generated/openapi.json \
|
|
202
|
+
--gateway-dir ./.generated/gateway \
|
|
201
203
|
--gateway-service-name weather \
|
|
202
204
|
--gateway-version-prefix v1 \
|
|
203
205
|
--init-app
|
|
@@ -208,9 +210,9 @@ With union-mode choice modeling:
|
|
|
208
210
|
```bash
|
|
209
211
|
npx wsdl-tsc pipeline \
|
|
210
212
|
--wsdl-source ./service.wsdl \
|
|
211
|
-
--client-dir
|
|
212
|
-
--openapi-file
|
|
213
|
-
--gateway-dir
|
|
213
|
+
--client-dir ./.generated/client \
|
|
214
|
+
--openapi-file ./.generated/openapi.json \
|
|
215
|
+
--gateway-dir ./.generated/gateway \
|
|
214
216
|
--gateway-service-name service \
|
|
215
217
|
--gateway-version-prefix v1 \
|
|
216
218
|
--client-choice-mode union
|
|
@@ -221,12 +223,12 @@ With generated test suite:
|
|
|
221
223
|
```bash
|
|
222
224
|
npx wsdl-tsc pipeline \
|
|
223
225
|
--wsdl-source examples/minimal/weather.wsdl \
|
|
224
|
-
--client-dir
|
|
225
|
-
--openapi-file
|
|
226
|
-
--gateway-dir
|
|
226
|
+
--client-dir ./.generated/client \
|
|
227
|
+
--openapi-file ./.generated/openapi.json \
|
|
228
|
+
--gateway-dir ./.generated/gateway \
|
|
227
229
|
--gateway-service-name weather \
|
|
228
230
|
--gateway-version-prefix v1 \
|
|
229
|
-
--test-dir
|
|
231
|
+
--test-dir ./.generated/tests
|
|
230
232
|
```
|
|
231
233
|
|
|
232
234
|
Client and OpenAPI only:
|
|
@@ -294,7 +296,7 @@ Basic:
|
|
|
294
296
|
```bash
|
|
295
297
|
npx wsdl-tsc client \
|
|
296
298
|
--wsdl-source examples/minimal/weather.wsdl \
|
|
297
|
-
--client-dir
|
|
299
|
+
--client-dir ./.generated/client
|
|
298
300
|
```
|
|
299
301
|
|
|
300
302
|
From catalog:
|
|
@@ -521,7 +523,7 @@ app/
|
|
|
521
523
|
| `LOGGER` | true | Fastify logger |
|
|
522
524
|
| `OPENAPI_SERVER_URL` | (empty) | Override OpenAPI spec server URL at runtime |
|
|
523
525
|
|
|
524
|
-
When `--security-config-file` is supplied and it contains an `upstream` profile, `.env.example` also lists the environment variables referenced by that profile.
|
|
526
|
+
When `--security-config-file` is supplied, and it contains an `upstream` profile, `.env.example` also lists the environment variables referenced by that profile.
|
|
525
527
|
|
|
526
528
|
### Endpoints
|
|
527
529
|
|
|
@@ -575,7 +577,7 @@ Default behavior varies by command:
|
|
|
575
577
|
| compile | Always requires explicit `--catalog-file` |
|
|
576
578
|
| client | `{client-dir}/catalog.json` |
|
|
577
579
|
| openapi | `{openapi-file-dir}/catalog.json` |
|
|
578
|
-
| pipeline | Cascade: `{client-dir}` then `{openapi-dir}` then `{gateway-dir}`
|
|
580
|
+
| pipeline | Cascade: `{client-dir}` then `{openapi-dir}` then `{gateway-dir}` |
|
|
579
581
|
|
|
580
582
|
## Common Workflows
|
|
581
583
|
|
package/docs/gateway-guide.md
CHANGED
|
@@ -34,7 +34,7 @@ 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
|
|
37
|
+
Route paths are determined by `--openapi-base-path` during generation. The prefix option adds a runtime prefix on top of generated paths.
|
|
38
38
|
|
|
39
39
|
## Inbound Gateway Enforcement
|
|
40
40
|
|
|
@@ -256,10 +256,10 @@ When integrating multiple SOAP services, each service gets its own client, gatew
|
|
|
256
256
|
|
|
257
257
|
```typescript
|
|
258
258
|
import Fastify from "fastify";
|
|
259
|
-
import weatherPlugin from "
|
|
260
|
-
import inventoryPlugin from "
|
|
261
|
-
import { Weather } from "
|
|
262
|
-
import { Inventory } from "
|
|
259
|
+
import weatherPlugin from "./.generated/weather/gateway/plugin.js";
|
|
260
|
+
import inventoryPlugin from "./.generated/inventory/gateway/plugin.js";
|
|
261
|
+
import { Weather } from "./.generated/weather/client/client.js";
|
|
262
|
+
import { Inventory } from "./.generated/inventory/client/client.js";
|
|
263
263
|
|
|
264
264
|
const app = Fastify({ logger: true });
|
|
265
265
|
|
|
@@ -25,7 +25,7 @@ Start by generating a typed client from your WSDL.
|
|
|
25
25
|
```bash
|
|
26
26
|
npx wsdl-tsc client \
|
|
27
27
|
--wsdl-source https://your-service.example.com/service.svc?wsdl \
|
|
28
|
-
--client-dir
|
|
28
|
+
--client-dir ./.generated/client
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
Inspect the generated `types.ts` to confirm that your WSDL types are represented correctly. Check that operation signatures in `operations.ts` match your expectations.
|
|
@@ -33,7 +33,7 @@ Inspect the generated `types.ts` to confirm that your WSDL types are represented
|
|
|
33
33
|
Test a single operation to verify connectivity:
|
|
34
34
|
|
|
35
35
|
```typescript
|
|
36
|
-
import { YourService } from "
|
|
36
|
+
import { YourService } from "./.generated/client/client.js";
|
|
37
37
|
|
|
38
38
|
const client = new YourService({
|
|
39
39
|
source: "https://your-service.example.com/service.svc?wsdl",
|
|
@@ -51,7 +51,7 @@ Once the client types look correct, generate an OpenAPI 3.1 specification.
|
|
|
51
51
|
```bash
|
|
52
52
|
npx wsdl-tsc openapi \
|
|
53
53
|
--wsdl-source https://your-service.example.com/service.svc?wsdl \
|
|
54
|
-
--openapi-file
|
|
54
|
+
--openapi-file ./.generated/openapi.json
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
Open `openapi.json` and review the paths, request/response schemas, and descriptions. The spec is derived from the same compiled catalog as the TypeScript types, so they stay aligned.
|
|
@@ -80,9 +80,9 @@ Regenerate with `--stream-config`:
|
|
|
80
80
|
```bash
|
|
81
81
|
npx wsdl-tsc pipeline \
|
|
82
82
|
--wsdl-source your-service.wsdl \
|
|
83
|
-
--client-dir
|
|
84
|
-
--openapi-file
|
|
85
|
-
--gateway-dir
|
|
83
|
+
--client-dir ./.generated/client \
|
|
84
|
+
--openapi-file ./.generated/openapi.json \
|
|
85
|
+
--gateway-dir ./.generated/gateway \
|
|
86
86
|
--gateway-service-name your-service \
|
|
87
87
|
--gateway-version-prefix v1 \
|
|
88
88
|
--stream-config ./stream.config.json \
|
|
@@ -97,8 +97,8 @@ Generate Fastify route handlers that translate JSON HTTP requests into SOAP call
|
|
|
97
97
|
|
|
98
98
|
```bash
|
|
99
99
|
npx wsdl-tsc gateway \
|
|
100
|
-
--openapi-file
|
|
101
|
-
--gateway-dir
|
|
100
|
+
--openapi-file ./.generated/openapi.json \
|
|
101
|
+
--gateway-dir ./.generated/gateway \
|
|
102
102
|
--gateway-service-name your-service \
|
|
103
103
|
--gateway-version-prefix v1
|
|
104
104
|
```
|
|
@@ -108,9 +108,9 @@ Or run all stages at once with the `pipeline` command and `--init-app`:
|
|
|
108
108
|
```bash
|
|
109
109
|
npx wsdl-tsc pipeline \
|
|
110
110
|
--wsdl-source https://your-service.example.com/service.svc?wsdl \
|
|
111
|
-
--client-dir
|
|
112
|
-
--openapi-file
|
|
113
|
-
--gateway-dir
|
|
111
|
+
--client-dir ./.generated/client \
|
|
112
|
+
--openapi-file ./.generated/openapi.json \
|
|
113
|
+
--gateway-dir ./.generated/gateway \
|
|
114
114
|
--gateway-service-name your-service \
|
|
115
115
|
--gateway-version-prefix v1 \
|
|
116
116
|
--init-app
|
|
@@ -159,7 +159,7 @@ The security config describes gateway authentication in OpenAPI and can scaffold
|
|
|
159
159
|
|
|
160
160
|
```typescript
|
|
161
161
|
import Fastify from "fastify";
|
|
162
|
-
import { yourServiceGateway } from "
|
|
162
|
+
import { yourServiceGateway } from "./.generated/gateway/plugin.js";
|
|
163
163
|
|
|
164
164
|
const app = Fastify({ logger: true });
|
|
165
165
|
|
|
@@ -177,7 +177,7 @@ await app.listen({ port: 3000 });
|
|
|
177
177
|
The generated `operations.ts` interface lets you test gateway routes without a live SOAP connection.
|
|
178
178
|
|
|
179
179
|
```typescript
|
|
180
|
-
import type { YourServiceOperations } from "
|
|
180
|
+
import type { YourServiceOperations } from "./.generated/client/operations.js";
|
|
181
181
|
|
|
182
182
|
const mockClient: YourServiceOperations = {
|
|
183
183
|
SomeOperation: async (args) => ({
|
|
@@ -191,7 +191,7 @@ Use this mock client when registering the gateway plugin in tests:
|
|
|
191
191
|
|
|
192
192
|
```typescript
|
|
193
193
|
import Fastify from "fastify";
|
|
194
|
-
import { yourServiceGateway } from "
|
|
194
|
+
import { yourServiceGateway } from "./.generated/gateway/plugin.js";
|
|
195
195
|
|
|
196
196
|
const app = Fastify();
|
|
197
197
|
await app.register(yourServiceGateway, { client: mockClient, prefix: "/v1" });
|
|
@@ -230,14 +230,14 @@ NODE_DEBUG=soap node app.js
|
|
|
230
230
|
|
|
231
231
|
### CI/CD regeneration
|
|
232
232
|
|
|
233
|
-
Add a
|
|
233
|
+
Add a generation and validation step to your CI pipeline. The `.generated/` directory is disposable and should be recreated for each build:
|
|
234
234
|
|
|
235
235
|
```bash
|
|
236
236
|
npx wsdl-tsc pipeline --wsdl-source $WSDL_URL ...
|
|
237
|
-
|
|
237
|
+
npx vitest run --config ./.generated/tests/vitest.config.ts
|
|
238
238
|
```
|
|
239
239
|
|
|
240
|
-
If the
|
|
240
|
+
If generation or the generated tests fail, review the WSDL contract change before deployment.
|
|
241
241
|
|
|
242
242
|
See [Production Guide](production.md) for validation, logging, and deployment details.
|
|
243
243
|
|
|
@@ -247,7 +247,7 @@ You do not have to expose all WSDL operations at once.
|
|
|
247
247
|
|
|
248
248
|
### Route-by-route migration
|
|
249
249
|
|
|
250
|
-
Use the operations configuration file to control which operations are included in the OpenAPI spec and gateway. Generate only the operations you are ready to expose, then add more
|
|
250
|
+
Use the operations configuration file to control which operations are included in the OpenAPI spec and gateway. Generate only the operations you are ready to expose, then add more overtime.
|
|
251
251
|
|
|
252
252
|
See [Configuration](configuration.md) for the operations config file format.
|
|
253
253
|
|
package/docs/migration.md
CHANGED
|
@@ -18,6 +18,7 @@ These steps apply to every version upgrade:
|
|
|
18
18
|
|
|
19
19
|
| wsdl-tsc | Node.js | TypeScript | soap | Fastify | saxes |
|
|
20
20
|
|----------|---------|------------|------|---------|-------|
|
|
21
|
+
| 1.0.x | >= 24.0 | >= 6.0 | >= 1.9 | >= 5.10 | >= 6.0 |
|
|
21
22
|
| 0.35.x and later | >= 24.0 | >= 6.0 | >= 1.9 | >= 5.8 | >= 6.0 |
|
|
22
23
|
| 0.17.x | >= 20.0 | >= 6.0 | >= 1.9 | >= 5.8 | >= 6.0 |
|
|
23
24
|
| 0.16.x | >= 20.0 | >= 6.0 | >= 1.9 | >= 5.8 | N/A |
|
|
@@ -30,6 +31,40 @@ These steps apply to every version upgrade:
|
|
|
30
31
|
|
|
31
32
|
Versions 0.11 through 0.16 are additive and non-breaking. See `CHANGELOG.md` for per-version detail rather than dedicated upgrade sections here.
|
|
32
33
|
|
|
34
|
+
## Upgrading to 1.0.0 from 0.40.1
|
|
35
|
+
|
|
36
|
+
Version `1.0.0` stabilizes the public behavior shipped through `0.40.1`. It does not intentionally change generated client, OpenAPI, gateway, app, or runtime contracts.
|
|
37
|
+
|
|
38
|
+
### Stable 1.0 Contract
|
|
39
|
+
|
|
40
|
+
- Node.js 24 is the supported runtime floor.
|
|
41
|
+
- The package and generated code remain ESM-only.
|
|
42
|
+
- `all-optional` remains the default `xs:choice` strategy.
|
|
43
|
+
- Choice union mode remains opt-in through `--client-choice-mode union`.
|
|
44
|
+
- NDJSON remains the default configured stream format.
|
|
45
|
+
- JSON array streaming remains opt-in per operation.
|
|
46
|
+
- Generated output remains replaceable and should be regenerated from WSDL or catalog inputs.
|
|
47
|
+
|
|
48
|
+
### Accepted 1.0 Limitations
|
|
49
|
+
|
|
50
|
+
- Multiple SOAP bindings use deterministic first SOAP binding selection.
|
|
51
|
+
- External `PolicyReference` documents are not fetched or resolved.
|
|
52
|
+
- Abstract complex types fail with a diagnostic.
|
|
53
|
+
- Substitution groups fail with a diagnostic.
|
|
54
|
+
- MTOM/XOP attachments fail with a diagnostic.
|
|
55
|
+
|
|
56
|
+
### Steps to Upgrade to 1.0.0
|
|
57
|
+
|
|
58
|
+
1. Upgrade the development dependency to `@techspokes/typescript-wsdl-client@^1.0.0`.
|
|
59
|
+
2. Confirm the project runs Node.js 24 or newer.
|
|
60
|
+
3. Keep `soap` installed as a runtime dependency.
|
|
61
|
+
4. Regenerate every owned client, OpenAPI, gateway, app, and generated-test artifact.
|
|
62
|
+
5. Review the generated diff and run the consumer TypeScript build and tests.
|
|
63
|
+
|
|
64
|
+
### Is 1.0.0 Breaking?
|
|
65
|
+
|
|
66
|
+
No intentional behavior break is introduced relative to `0.40.1`. The major version declares the documented surface stable, so future incompatible changes require a new major release.
|
|
67
|
+
|
|
33
68
|
## Upgrading to 0.17.x from 0.16.x
|
|
34
69
|
|
|
35
70
|
This upgrade adds opt-in streamable SOAP responses. No breaking changes; generated output is byte-for-byte unchanged when `--stream-config` is not provided.
|
package/docs/output-anatomy.md
CHANGED
|
@@ -151,8 +151,8 @@ The generated plugin exports a Fastify plugin function. Register it with your Fa
|
|
|
151
151
|
|
|
152
152
|
```typescript
|
|
153
153
|
import Fastify from "fastify";
|
|
154
|
-
import { myServiceGateway } from "
|
|
155
|
-
import { createMyServiceClient } from "
|
|
154
|
+
import { myServiceGateway } from "./.generated/gateway/plugin.js";
|
|
155
|
+
import { createMyServiceClient } from "./.generated/client/client.js";
|
|
156
156
|
|
|
157
157
|
const app = Fastify();
|
|
158
158
|
const client = await createMyServiceClient("https://soap-endpoint.example.com");
|
package/docs/production.md
CHANGED
|
@@ -93,7 +93,7 @@ Default strategy: `all-optional`. The opt-in `--client-choice-mode union` mode e
|
|
|
93
93
|
|
|
94
94
|
### Union Types
|
|
95
95
|
|
|
96
|
-
`--client-choice-mode union` is supported as an opt-in strategy.
|
|
96
|
+
`--client-choice-mode union` is supported as an opt-in strategy. The 1.0 conformance matrix backs the released mode across compiler metadata, TypeScript output, OpenAPI constraints, generated mocks, generated validation tests, gateway runtime behavior, and app generation.
|
|
97
97
|
|
|
98
98
|
### WS-Policy
|
|
99
99
|
|
package/docs/releases/README.md
CHANGED
|
@@ -52,3 +52,35 @@ Keep the H1 in the repository file so each release note remains a complete sourc
|
|
|
52
52
|
Write validation as consumer-facing outcomes, not as maintainer command transcripts. Keep exact release operator commands in `.github/copilot-instructions.md` and workflow logs.
|
|
53
53
|
|
|
54
54
|
Write release notes for users and maintainers, not as a file-by-file change log. Use `CHANGELOG.md` for the canonical version history.
|
|
55
|
+
|
|
56
|
+
When an abandoned major or minor candidate contains the complete launch narrative, carry that narrative into the next published corrective release. The corrective release notes must stand alone for users who never saw the abandoned draft.
|
|
57
|
+
|
|
58
|
+
## Candidate Publication
|
|
59
|
+
|
|
60
|
+
The supported release path keeps final-form tags immutable:
|
|
61
|
+
|
|
62
|
+
1. Run release preflight on the final uncommitted tree.
|
|
63
|
+
2. Commit the exact validated tree and create `vX.Y.Z`.
|
|
64
|
+
3. Push the branch and tag so the draft workflow creates the release and skill asset.
|
|
65
|
+
4. Review and publish the unmarked draft through GitHub's Release page.
|
|
66
|
+
5. Let the guarded package workflow publish to npmjs with provenance.
|
|
67
|
+
|
|
68
|
+
Manual package dispatch is a recovery path after the GitHub Release is published. It enforces the same tag, marker, reachability, draft, and prerelease checks.
|
|
69
|
+
|
|
70
|
+
The normal path uses GitHub UI publication because a workflow publishing with its standard `GITHUB_TOKEN` does not trigger another workflow from the resulting event. Do not rely on recursive workflow delivery for package publication.
|
|
71
|
+
|
|
72
|
+
## Abandoned Candidates
|
|
73
|
+
|
|
74
|
+
Run the `Abandon Release Candidate` workflow before publishing a rejected draft. Supply the final-form tag, a permanent reason, and optional failed-validation evidence.
|
|
75
|
+
|
|
76
|
+
The workflow creates annotated marker `abandoned/vX.Y.Z` on the same commit as `vX.Y.Z`, verifies the remote marker, and then deletes only the draft release and its candidate assets. The marker preserves the durable reason and release identity. The operation is idempotent when the marker already matches and the draft is absent. A marker on another commit fails for maintainer review.
|
|
77
|
+
|
|
78
|
+
Drafting, abandonment, and package publication are serialized per release tag so abandonment cannot race package delivery.
|
|
79
|
+
|
|
80
|
+
Never move, delete for reuse, or force-update either tag. The rejected version is consumed, and the correction uses the next version.
|
|
81
|
+
|
|
82
|
+
The marker cannot disable GitHub's Publish button before draft retirement. Draft and package automation enforce the marker, and abandonment removes the rejected draft after verifying the marker. Never use release deletion with tag cleanup.
|
|
83
|
+
|
|
84
|
+
## Tag Ruleset Proposal
|
|
85
|
+
|
|
86
|
+
Protect `v*` and `abandoned/v*` against updates and deletions. Consider restricted creation after testing the intended maintainer or GitHub App bypass identity. Repository settings remain a maintainer decision and are not changed by release automation.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# TypeScript WSDL Client v0.40.0
|
|
2
|
+
|
|
3
|
+
## Current Dependency Baseline
|
|
4
|
+
|
|
5
|
+
This release refreshes maintained dependency floors after the merged dependency updates and keeps generated app scaffolds aligned with the package baseline.
|
|
6
|
+
|
|
7
|
+
## What This Improves
|
|
8
|
+
|
|
9
|
+
Developers get current compatible dependency minimums in both the published package and newly scaffolded Fastify gateway apps. The XML parser, test stack, Fastify development dependency, and Node type definitions move to their maintained releases without changing the generated SOAP, OpenAPI, or gateway contracts. TypeScript remains on the maintained 6.x line because the repository documentation validator uses compiler-library APIs not exposed by TypeScript 7.
|
|
10
|
+
|
|
11
|
+
Release preparation is also more direct: run targeted checks while editing, run release preflight once on the final uncommitted candidate, then commit and tag the exact validated tree without repeating the full gates.
|
|
12
|
+
|
|
13
|
+
Generated output paths are clearer. Public examples use an explicit, git-ignored `.generated/` directory, while repository automation keeps smoke output, caches, and release work isolated under owned `tmp/` subfolders.
|
|
14
|
+
|
|
15
|
+
The 1.0 roadmap remains focused on confirming explicit capability decisions and completing the release-candidate gates.
|
|
16
|
+
|
|
17
|
+
## Highlights
|
|
18
|
+
|
|
19
|
+
- Updates `fast-xml-parser` to `5.10.0`.
|
|
20
|
+
- Updates Fastify to `5.10.0`.
|
|
21
|
+
- Retains TypeScript `6.0.3` compatibility in the package and generated app.
|
|
22
|
+
- Updates Vitest to `4.1.10`.
|
|
23
|
+
- Updates `@types/node` to `26.1.1`.
|
|
24
|
+
- Updates generated app scaffold pins for matching dependency floors.
|
|
25
|
+
- Confirms zero known vulnerabilities in the root package and generated app dependency trees.
|
|
26
|
+
- Aligns catalog help with the actual co-located output behavior.
|
|
27
|
+
- Uses `.generated/` consistently for disposable consumer output examples.
|
|
28
|
+
- Prevents smoke cleanup from deleting caches and unrelated automation workspaces.
|
|
29
|
+
- Keeps release preflight helper declarations aligned across tests, TypeScript, and IDE inspections.
|
|
30
|
+
- Defines a single final-candidate release preflight before the release commit.
|
|
31
|
+
|
|
32
|
+
## Upgrade Notes
|
|
33
|
+
|
|
34
|
+
No special upgrade steps.
|
|
35
|
+
|
|
36
|
+
## Validation
|
|
37
|
+
|
|
38
|
+
- CI passed.
|
|
39
|
+
- NPM package contents were validated.
|
|
40
|
+
- Agent skill artifact was validated and packaged.
|
|
41
|
+
- Release preflight passed against the target tag.
|
|
42
|
+
|
|
43
|
+
## Notes
|
|
44
|
+
|
|
45
|
+
Release tag: `v0.40.0`.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# TypeScript WSDL Client v0.40.1
|
|
2
|
+
|
|
3
|
+
## Faster Conformance Feedback Before 1.0
|
|
4
|
+
|
|
5
|
+
This maintenance release makes the capability conformance suite easier to run and diagnose while closing the remaining scope decisions before the stable 1.0 release candidate.
|
|
6
|
+
|
|
7
|
+
## What This Improves
|
|
8
|
+
|
|
9
|
+
Maintainers and contributors can run contracts, compile, client, OpenAPI, gateway, generated-test, or app conformance independently instead of waiting for every evidence layer after a focused change. The complete release-blocking suite remains intact and now reports visible per-capability progress during its longer generated-project checks.
|
|
10
|
+
|
|
11
|
+
The 1.0 boundary is also explicit. Multiple bindings retain deterministic first SOAP binding selection, external policy documents remain unresolved, abstract types and substitution groups remain diagnostic, and MTOM/XOP attachments remain outside the typed SOAP-to-REST transport contract.
|
|
12
|
+
|
|
13
|
+
## Highlights
|
|
14
|
+
|
|
15
|
+
- Adds stage-specific conformance commands for focused maintainer feedback.
|
|
16
|
+
- Keeps all 123 capability checks in the canonical full suite.
|
|
17
|
+
- Documents the expected full-suite duration and agent timeout guidance.
|
|
18
|
+
- Records the accepted partial and terminal capability boundaries for 1.0.
|
|
19
|
+
- Defers the public WSDL inspector until after 1.0.
|
|
20
|
+
|
|
21
|
+
## Upgrade Notes
|
|
22
|
+
|
|
23
|
+
No special upgrade steps. Generated client, OpenAPI, gateway, app, and runtime contracts are unchanged.
|
|
24
|
+
|
|
25
|
+
## Validation
|
|
26
|
+
|
|
27
|
+
- CI passed.
|
|
28
|
+
- NPM package contents were validated.
|
|
29
|
+
- Agent skill artifact was validated and packaged.
|
|
30
|
+
- Release preflight passed against the target tag.
|
|
31
|
+
|
|
32
|
+
## Notes
|
|
33
|
+
|
|
34
|
+
Release tag: `v0.40.1`.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# TypeScript WSDL Client v1.0.0
|
|
2
|
+
|
|
3
|
+
## A Stable Typed SOAP Modernization Contract
|
|
4
|
+
|
|
5
|
+
Version 1.0 declares the documented TypeScript client, OpenAPI 3.1, Fastify gateway, runnable app, test generation, and programmatic APIs stable after the complete 0.x implementation and conformance program.
|
|
6
|
+
|
|
7
|
+
## What This Improves
|
|
8
|
+
|
|
9
|
+
Teams can adopt the generator with an explicit compatibility baseline. Default generated behavior remains aligned with `0.40.1`, supported WSDL patterns have fixture-backed evidence through every generated stage, and unsupported polymorphic or attachment constructs stop with diagnostics instead of producing misleading contracts.
|
|
10
|
+
|
|
11
|
+
The migration contract also makes opt-in behavior clear. Choice unions remain optional, NDJSON remains the default streaming format, JSON arrays remain available per operation, and multiple SOAP bindings continue using deterministic first-binding selection.
|
|
12
|
+
|
|
13
|
+
Release delivery now preserves rejected candidate evidence. An annotated abandonment marker blocks draft mutation and package publication while consuming the rejected version permanently.
|
|
14
|
+
|
|
15
|
+
## Highlights
|
|
16
|
+
|
|
17
|
+
- Stabilizes typed SOAP clients, OpenAPI specifications, Fastify gateways, apps, and generated tests.
|
|
18
|
+
- Requires Node.js 24 or newer and keeps Node 26 compatibility coverage.
|
|
19
|
+
- Preserves `all-optional` as the default `xs:choice` strategy.
|
|
20
|
+
- Preserves NDJSON as the default configured streaming format.
|
|
21
|
+
- Carries fixture-backed conformance evidence across compile and generated consumer stages.
|
|
22
|
+
- Rejects abstract types, substitution groups, and MTOM/XOP attachments with explicit diagnostics.
|
|
23
|
+
- Documents deterministic multi-binding behavior and unresolved external policy references.
|
|
24
|
+
- Keeps the public WSDL inspector as a post-1.0 candidate.
|
|
25
|
+
- Blocks GitHub Packages and npm publication for permanently abandoned release candidates.
|
|
26
|
+
|
|
27
|
+
## Upgrade Notes
|
|
28
|
+
|
|
29
|
+
No intentional behavior break is introduced relative to `0.40.1`. Consumers must run Node.js 24 or newer, regenerate owned output, review the generated diff, and run their TypeScript build and tests.
|
|
30
|
+
|
|
31
|
+
## Validation
|
|
32
|
+
|
|
33
|
+
- CI passed.
|
|
34
|
+
- NPM package contents were validated.
|
|
35
|
+
- Agent skill artifact was validated and packaged.
|
|
36
|
+
- Release preflight passed against the target tag.
|
|
37
|
+
|
|
38
|
+
## Notes
|
|
39
|
+
|
|
40
|
+
Release tag: `v1.0.0`.
|
|
41
|
+
|
|
42
|
+
Release candidate abandonment guards address [GitHub issue #117](https://github.com/TechSpokes/typescript-wsdl-client/issues/117).
|