@techspokes/typescript-wsdl-client 0.39.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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 ./generated/client
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 ./generated/openapi.json
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 ./generated/client \
70
- --openapi-file ./generated/openapi.json \
71
- --gateway-dir ./generated/gateway \
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 "./generated/client/operations.js";
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 "./generated/gateway/plugin.js";
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" });
@@ -525,13 +525,13 @@ function generatePackageJson(appDir, force) {
525
525
  dev: "tsx watch server.ts",
526
526
  },
527
527
  dependencies: {
528
- fastify: "^5.9.0",
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.0",
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 compiled catalog.json (for input), or output path when compiling from WSDL (default: tmp/catalog.json)"
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 compiled catalog.json (default: tmp/catalog.json if --wsdl-source not provided)" })
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: tmp/catalog.json)"
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 --catalog-file, --client-dir, --openapi-file, or --gateway-dir must be provided for pipeline generation.");
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
- // Fallback to tmp/catalog.json (should rarely happen due to validation above)
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 an xs:any wildcard particle retained on a complex type.
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 an xs:schema marker with an xs:any payload.
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 an xs:any-wrapped envelope),
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
  *
@@ -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: "./generated/catalog.json",
215
- clientOutDir: "./generated/client",
214
+ catalogOut: "./.generated/catalog.json",
215
+ clientOutDir: "./.generated/client",
216
216
  openapi: {
217
- outFile: "./generated/openapi.json"
217
+ outFile: "./.generated/openapi.json"
218
218
  },
219
219
  gateway: {
220
- outDir: "./generated/gateway",
220
+ outDir: "./.generated/gateway",
221
221
  serviceSlug: "service",
222
222
  versionSlug: "v1"
223
223
  },
@@ -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 tmp/client \
187
- --openapi-file tmp/openapi.json \
188
- --gateway-dir tmp/gateway \
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 ./generated/client \
199
- --openapi-file ./generated/openapi.json \
200
- --gateway-dir ./generated/gateway \
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 ./generated/client \
212
- --openapi-file ./generated/openapi.json \
213
- --gateway-dir ./generated/gateway \
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 tmp/client \
225
- --openapi-file tmp/openapi.json \
226
- --gateway-dir tmp/gateway \
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 tmp/tests
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 tmp/client
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}` then `tmp/` |
580
+ | pipeline | Cascade: `{client-dir}` then `{openapi-dir}` then `{gateway-dir}` |
579
581
 
580
582
  ## Common Workflows
581
583
 
@@ -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 an additional runtime prefix on top of generated paths.
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 "./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";
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 ./generated/client
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 "./generated/client/client.js";
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 ./generated/openapi.json
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 ./generated/client \
84
- --openapi-file ./generated/openapi.json \
85
- --gateway-dir ./generated/gateway \
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 ./generated/openapi.json \
101
- --gateway-dir ./generated/gateway \
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 ./generated/client \
112
- --openapi-file ./generated/openapi.json \
113
- --gateway-dir ./generated/gateway \
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 "./generated/gateway/plugin.js";
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 "./generated/client/operations.js";
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 "./generated/gateway/plugin.js";
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 regeneration step to your CI pipeline. Because output is deterministic, you can regenerate and check for unexpected diffs:
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
- git diff --exit-code generated/
237
+ npx vitest run --config ./.generated/tests/vitest.config.ts
238
238
  ```
239
239
 
240
- If the diff is non-empty, the WSDL contract has changed. Review and commit the updated files.
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 over time.
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.
@@ -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 "./generated/gateway/plugin.js";
155
- import { createMyServiceClient } from "./generated/client/client.js";
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");
@@ -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. Future WSDL coverage matrix work will broaden fixture evidence for edge cases, but the released union mode is test-backed for compiler metadata, TypeScript output, OpenAPI constraints, generated mocks, and generated validation tests.
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
 
@@ -52,3 +52,33 @@ 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
+ ## Candidate Publication
57
+
58
+ The supported release path keeps final-form tags immutable:
59
+
60
+ 1. Run release preflight on the final uncommitted tree.
61
+ 2. Commit the exact validated tree and create `vX.Y.Z`.
62
+ 3. Push the branch and tag so the draft workflow creates the release and skill asset.
63
+ 4. Review and publish the unmarked draft through GitHub's Release page.
64
+ 5. Let the guarded package workflow publish to npmjs with provenance.
65
+
66
+ Manual package dispatch is a recovery path after the GitHub Release is published. It enforces the same tag, marker, reachability, draft, and prerelease checks.
67
+
68
+ 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.
69
+
70
+ ## Abandoned Candidates
71
+
72
+ Run the `Abandon Release Candidate` workflow before publishing a rejected draft. Supply the final-form tag, a permanent reason, and optional failed-validation evidence.
73
+
74
+ The workflow creates annotated marker `abandoned/vX.Y.Z` on the same commit as `vX.Y.Z`, marks the draft visibly abandoned, and preserves its assets and evidence. The operation is idempotent when the marker already matches. A marker on another commit fails for maintainer review.
75
+
76
+ Drafting, abandonment, and package publication are serialized per release tag so abandonment cannot race package delivery.
77
+
78
+ Never move, delete for reuse, or force-update either tag. The rejected version is consumed, and the correction uses the next version.
79
+
80
+ The marker cannot disable GitHub's Publish button. Draft and package automation enforce it, but a maintainer must still avoid publishing an abandoned draft through the GitHub UI.
81
+
82
+ ## Tag Ruleset Proposal
83
+
84
+ 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).