@techspokes/typescript-wsdl-client 0.34.0 → 0.35.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
@@ -39,7 +39,7 @@ npm install --save-dev @techspokes/typescript-wsdl-client
39
39
  npm install soap
40
40
  ```
41
41
 
42
- Requirements: Node.js 20+ and the `soap` package as a runtime dependency.
42
+ Requirements: Node.js 24+ and the `soap` package as a runtime dependency.
43
43
 
44
44
  ## Quick Start
45
45
 
@@ -1 +1 @@
1
- {"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../src/test/generators.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,UAAU,EAAE,qBAAqB,EAAC,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAA0C,KAAK,eAAe,EAAC,MAAM,eAAe,CAAC;AAG5F,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AA6FrF;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAkBzC;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAgFR;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,UAAU,GACrB,MAAM,CAsCR;AAED;;;;;;;GAOG;AAEH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,EAAE,iBAAiB,GACvB,MAAM,CA8FR;AAED;;;;;;;GAOG;AAEH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAiIR;AAED;;GAEG;AAEH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAuER;AAED;;GAEG;AAEH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,CAAC,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAwDR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAChC,MAAM,CAgFR;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAChC,MAAM,CAgDR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,OAAO,EAAE,eAAe,GACvB,MAAM,GAAG,IAAI,CAkEf"}
1
+ {"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../src/test/generators.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,UAAU,EAAE,qBAAqB,EAAC,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAA0C,KAAK,eAAe,EAAC,MAAM,eAAe,CAAC;AAG5F,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAsGrF;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAkBzC;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAgFR;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,UAAU,GACrB,MAAM,CAsCR;AAED;;;;;;;GAOG;AAEH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,EAAE,iBAAiB,GACvB,MAAM,CA8FR;AAED;;;;;;;GAOG;AAEH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAiIR;AAED;;GAEG;AAEH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAuER;AAED;;GAEG;AAEH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,UAAU,EAAE,qBAAqB,EAAE,EACnC,KAAK,CAAC,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAwDR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAChC,MAAM,CAgFR;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAChC,MAAM,CAgDR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EACjC,OAAO,EAAE,eAAe,GACvB,MAAM,GAAG,IAAI,CAkEf"}
@@ -29,6 +29,13 @@ function isRecord(value) {
29
29
  function cloneRecord(value) {
30
30
  return JSON.parse(JSON.stringify(value));
31
31
  }
32
+ function formatInjectPayloadFields(value) {
33
+ if (value == null || typeof value !== "object") {
34
+ return ` headers: {"content-type": "application/json"},
35
+ payload: JSON.stringify(${JSON.stringify(value)}),`;
36
+ }
37
+ return ` payload: ${JSON.stringify(value, null, 4).replace(/\n/g, "\n ")},`;
38
+ }
32
39
  function mockChoiceBranchValue(branch, catalog) {
33
40
  const isArray = branch.max === "unbounded" || (typeof branch.max === "number" && branch.max > 1);
34
41
  const value = branch.tsType === "string" || branch.tsType === "number" || branch.tsType === "boolean"
@@ -253,7 +260,7 @@ export function emitRoutesTest(testDir, importsMode, operations, mocks) {
253
260
  const sortedOps = [...operations].sort((a, b) => a.operationId.localeCompare(b.operationId));
254
261
  const testCases = sortedOps.map((op) => {
255
262
  const mockData = mocks.get(op.operationId);
256
- const requestPayload = JSON.stringify(mockData?.request ?? {}, null, 4).replace(/\n/g, "\n ");
263
+ const requestPayloadFields = formatInjectPayloadFields(mockData?.request ?? {});
257
264
  const hint = formatOperationHint(op.summary, op.description);
258
265
  const hintComment = hint ? ` // ${hint}\n` : "";
259
266
  if (op.stream?.format === "json-array") {
@@ -264,7 +271,7 @@ export function emitRoutesTest(testDir, importsMode, operations, mocks) {
264
271
  const res = await app.inject({
265
272
  method: "${op.method.toUpperCase()}",
266
273
  url: "${op.path}",
267
- payload: ${requestPayload},
274
+ ${requestPayloadFields}
268
275
  });
269
276
  expect(res.statusCode).toBe(200);
270
277
  expect(String(res.headers["content-type"] ?? "")).toContain(${JSON.stringify(op.stream.mediaType)});
@@ -287,7 +294,7 @@ export function emitRoutesTest(testDir, importsMode, operations, mocks) {
287
294
  const res = await app.inject({
288
295
  method: "${op.method.toUpperCase()}",
289
296
  url: "${op.path}",
290
- payload: ${requestPayload},
297
+ ${requestPayloadFields}
291
298
  });
292
299
  expect(res.statusCode).toBe(200);
293
300
  expect(String(res.headers["content-type"] ?? "")).toContain(${JSON.stringify(op.stream.mediaType)});
@@ -308,7 +315,7 @@ export function emitRoutesTest(testDir, importsMode, operations, mocks) {
308
315
  const res = await app.inject({
309
316
  method: "${op.method.toUpperCase()}",
310
317
  url: "${op.path}",
311
- payload: ${requestPayload},
318
+ ${requestPayloadFields}
312
319
  });
313
320
  expect(res.statusCode).toBe(200);
314
321
  const body = res.json();
@@ -354,7 +361,7 @@ export function emitErrorsTest(testDir, importsMode, operations, mocks) {
354
361
  if (!op)
355
362
  return "// No operations found\n";
356
363
  const mockData = mocks.get(op.operationId);
357
- const requestPayload = JSON.stringify(mockData?.request ?? {}, null, 4).replace(/\n/g, "\n ");
364
+ const requestPayloadFields = formatInjectPayloadFields(mockData?.request ?? {});
358
365
  return `/**
359
366
  * Gateway Error Handling Tests
360
367
  *
@@ -379,7 +386,7 @@ describe("gateway routes — error handling", () => {
379
386
  const res = await app.inject({
380
387
  method: "${op.method.toUpperCase()}",
381
388
  url: "${op.path}",
382
- payload: ${requestPayload},
389
+ ${requestPayloadFields}
383
390
  });
384
391
  expect(res.statusCode).toBe(500);
385
392
  const body = res.json();
@@ -413,7 +420,7 @@ describe("gateway routes — error handling", () => {
413
420
  const res = await app.inject({
414
421
  method: "${op.method.toUpperCase()}",
415
422
  url: "${op.path}",
416
- payload: ${requestPayload},
423
+ ${requestPayloadFields}
417
424
  });
418
425
  expect(res.statusCode).toBe(502);
419
426
  const body = res.json();
@@ -436,7 +443,7 @@ describe("gateway routes — error handling", () => {
436
443
  const res = await app.inject({
437
444
  method: "${op.method.toUpperCase()}",
438
445
  url: "${op.path}",
439
- payload: ${requestPayload},
446
+ ${requestPayloadFields}
440
447
  });
441
448
  expect(res.statusCode).toBe(503);
442
449
  const body = res.json();
@@ -459,7 +466,7 @@ describe("gateway routes — error handling", () => {
459
466
  const res = await app.inject({
460
467
  method: "${op.method.toUpperCase()}",
461
468
  url: "${op.path}",
462
- payload: ${requestPayload},
469
+ ${requestPayloadFields}
463
470
  });
464
471
  expect(res.statusCode).toBe(504);
465
472
  const body = res.json();
@@ -486,7 +493,7 @@ export function emitEnvelopeTest(testDir, importsMode, operations, mocks) {
486
493
  if (!op)
487
494
  return "// No operations found\n";
488
495
  const mockData = mocks.get(op.operationId);
489
- const requestPayload = JSON.stringify(mockData?.request ?? {}, null, 4).replace(/\n/g, "\n ");
496
+ const requestPayloadFields = formatInjectPayloadFields(mockData?.request ?? {});
490
497
  return `/**
491
498
  * Gateway Envelope Structure Tests
492
499
  *
@@ -505,7 +512,7 @@ describe("gateway — envelope structure", () => {
505
512
  const res = await app.inject({
506
513
  method: "${op.method.toUpperCase()}",
507
514
  url: "${op.path}",
508
- payload: ${requestPayload},
515
+ ${requestPayloadFields}
509
516
  });
510
517
  expect(res.statusCode).toBe(200);
511
518
  const body = res.json();
@@ -530,7 +537,7 @@ describe("gateway — envelope structure", () => {
530
537
  const res = await app.inject({
531
538
  method: "${op.method.toUpperCase()}",
532
539
  url: "${op.path}",
533
- payload: ${requestPayload},
540
+ ${requestPayloadFields}
534
541
  });
535
542
  expect(res.statusCode).toBe(500);
536
543
  const body = res.json();
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
+ | 0.35.x and later | >= 24.0 | >= 6.0 | >= 1.9 | >= 5.8 | >= 6.0 |
21
22
  | 0.17.x | >= 20.0 | >= 6.0 | >= 1.9 | >= 5.8 | >= 6.0 |
22
23
  | 0.16.x | >= 20.0 | >= 6.0 | >= 1.9 | >= 5.8 | N/A |
23
24
  | 0.15.x | >= 20.0 | >= 6.0 | >= 1.8 | >= 5.4 | N/A |
@@ -0,0 +1,33 @@
1
+ # TypeScript WSDL Client v0.35.0
2
+
3
+ ## Baseline Conformance And Node Policy
4
+
5
+ This release expands the WSDL conformance baseline and raises the supported runtime floor to Node 24.
6
+
7
+ ## What This Improves
8
+
9
+ Maintainers now have fixture-backed evidence for the common WSDL and XSD patterns that already form the everyday generation baseline: the canonical weather WSDL, complex sequences, simple type restrictions and lists, same-name simple type aliases, simple content with attributes, documentation propagation, SOAP binding detection, and relative XSD imports.
10
+
11
+ The conformance harness also keeps its XML evidence self-contained under `test/conformance/fixtures/`, which makes the public support matrix easier to trust during release review. CI now covers Node 24 as the supported floor and Node 26 as the current line, while release workflows run on Node 24.
12
+
13
+ ## Highlights
14
+
15
+ - Adds baseline WSDL and XSD conformance rows across compile, client, OpenAPI, gateway, generated-test, and app stages.
16
+ - Raises the package engine floor to Node 24 and release-gates Node 24 and Node 26 CI coverage.
17
+ - Keeps repository-owned temporary outputs in classified `tmp/` subfolders for smoke, conformance, preflight, npm cache, and generated-test workspaces.
18
+ - Hardens generated gateway tests for scalar JSON payloads.
19
+
20
+ ## Upgrade Notes
21
+
22
+ Consumers should run Node 24 or newer.
23
+
24
+ ## Validation
25
+
26
+ - CI passed.
27
+ - NPM package contents were validated.
28
+ - Agent skill artifact was validated and packaged.
29
+ - Release preflight passed against the target tag.
30
+
31
+ ## Notes
32
+
33
+ Release tag: `v0.35.0`.
@@ -1,6 +1,6 @@
1
1
  # Version 1.0 Roadmap Plan
2
2
 
3
- Detailed plan for moving `@techspokes/typescript-wsdl-client` from the released `0.30.x` line to a stable `1.0.0` release.
3
+ Detailed plan for moving `@techspokes/typescript-wsdl-client` from the current `0.x` line to a stable `1.0.0` release.
4
4
 
5
5
  See the root [README.md](../../README.md) for project overview and the root [ROADMAP.md](../../ROADMAP.md) for the public roadmap summary.
6
6
 
@@ -19,7 +19,7 @@ The plan is optimized for preserving quality. The contract and compatibility bas
19
19
  | Choice union mode | [Choice Union Mode](v1.0-choice-union-mode.md) | complete | Implemented in `0.26.0` |
20
20
  | JSON array streaming | [JSON Array Streaming](v1.0-json-array-streaming.md) | complete | Implemented in `0.28.0` |
21
21
  | Conformance framework | [Capability Conformance Framework](v1.0-capability-conformance-framework.md) | gate wired | Pipeline claims are test-backed |
22
- | WSDL coverage matrix | [WSDL Coverage Matrix](v1.0-wsdl-coverage-matrix.md) | gate wired | Feature support is test-backed |
22
+ | WSDL coverage matrix | [WSDL Coverage Matrix](v1.0-wsdl-coverage-matrix.md) | baseline registry | Public support is test-backed |
23
23
  | Release candidate | [Release Candidate Gates](v1.0-release-candidate-gates.md) | next | 1.0 release is repeatable |
24
24
 
25
25
  ## Execution Order
@@ -42,11 +42,11 @@ JSON array streaming is complete in `0.28.0`. The default `ndjson` format remain
42
42
 
43
43
  ### Slice 5: Capability Conformance Framework
44
44
 
45
- The registry, fixture strategy, compile runner, client evidence, OpenAPI evidence, gateway runtime evidence, generated-test evidence, app evidence, documentation drift check, generated support matrix, and validation-gate wiring are shipped. Keep `npm run test:conformance` as the focused local command while broad Vitest discovery covers conformance in `npm test`, `npm run ci`, and release preflight.
45
+ The registry, fixture strategy, compile runner, client evidence, OpenAPI evidence, gateway runtime evidence, generated-test evidence, app evidence, documentation drift check, generated support matrix, and validation-gate wiring are shipped. The registry is the public baseline support source, while examples remain demos. Keep `npm run test:conformance` as the focused local command while broad Vitest discovery covers conformance in `npm test`, `npm run ci`, and release preflight.
46
46
 
47
47
  ### Slice 6: WSDL Coverage Matrix
48
48
 
49
- The first WSDL matrix rows now exist as conformance registry entries with compile, client, OpenAPI, gateway runtime, generated-test, app, documentation, and release-gate evidence. The next work is to keep those rows current while release candidate gates are prepared.
49
+ The WSDL matrix rows now exist as conformance registry entries with compile, client, OpenAPI, gateway runtime, generated-test, app, documentation, and release-gate evidence. The next work is to keep those rows current while release candidate gates are prepared.
50
50
 
51
51
  ### Slice 7: Release Candidate Gates
52
52
 
@@ -85,6 +85,7 @@ Run the release candidate gates after feature work and documentation have conver
85
85
 
86
86
  - A capability conformance matrix runs under broad Vitest test automation.
87
87
  - Release preflight verifies the focused conformance command and CI wiring.
88
+ - Release preflight verifies CI covers Node 24 and Node 26 and release workflows use Node 24.
88
89
  - Each matrix entry has a fixture, status, and stage expectations.
89
90
  - Unsupported features fail loudly or are documented as deliberately unsupported.
90
91
 
@@ -53,7 +53,7 @@ Run the generated example freshness check through release preflight. Confirm com
53
53
 
54
54
  ### Node Gate
55
55
 
56
- Run the supported Node.js floor and the newest active Node.js line in CI before the release candidate is accepted.
56
+ Run Node 24 as the supported Node.js floor and Node 26 as the current line in CI before the release candidate is accepted. Release workflows should run on Node 24, and release preflight should fail if CI stops covering either line.
57
57
 
58
58
  ### Release Gate
59
59
 
@@ -67,6 +67,7 @@ Run `npm run release:preflight -- v1.0.0` during release preparation. Confirm re
67
67
  - Configuration docs describe both stream formats.
68
68
  - Supported patterns reflects the WSDL matrix.
69
69
  - The conformance gate documents `npm run test:conformance`, broad Vitest discovery, and release preflight wiring.
70
+ - The Node gate documents Node 24 as the package floor and Node 26 as the current-line CI check.
70
71
  - Production docs describe terminal-error behavior for both stream formats.
71
72
  - Migration docs explain any behavior changes since `0.x`.
72
73
 
@@ -1,25 +1,25 @@
1
1
  # Version 1.0 WSDL Coverage Matrix
2
2
 
3
- Status: generated-test, app evidence, and validation-gate wiring shipped before `1.0.0`.
3
+ Status: baseline support registry, generated-test evidence, app evidence, and validation-gate wiring shipped before `1.0.0`.
4
4
 
5
5
  Plan for turning WSDL and XSD support claims into automated, fixture-backed evidence before 1.0. This is the first domain under the [Capability Conformance Framework](v1.0-capability-conformance-framework.md).
6
6
 
7
- The initial fixture-backed compile matrix shipped in `0.30.2` and `0.30.3`. Client, OpenAPI, gateway runtime, generated-test, and app evidence now prove the current supported and partial rows, and terminal rows have executable diagnostics. `npm test` and `npm run ci` cover the conformance suite through broad Vitest discovery, and release preflight verifies that the script wiring remains intact.
7
+ The initial fixture-backed compile matrix shipped in `0.30.2` and `0.30.3`. Client, OpenAPI, gateway runtime, generated-test, and app evidence now prove the current supported and partial rows, and terminal rows have executable diagnostics. The matrix is now the public baseline support registry. Examples remain demos, while conformance fixtures are the durable support evidence. `npm test` and `npm run ci` cover the conformance suite through broad Vitest discovery, and release preflight verifies that the script wiring remains intact.
8
8
 
9
9
  See the root [README.md](../../README.md) for project overview and [Version 1.0 Roadmap Plan](README.md) for the complete 1.0 route.
10
10
 
11
11
  ## Goal
12
12
 
13
- The project should have an automated WSDL and XSD feature matrix that proves which patterns are supported, partially supported, or rejected with diagnostics. The matrix should feed the conformance registry, align with `docs/supported-patterns.md`, and protect 1.0 from silent miscompilation.
13
+ The project should have an automated WSDL and XSD feature matrix that proves which patterns are supported, partially supported, or rejected with diagnostics. The matrix is the conformance registry, aligns with `docs/supported-patterns.md`, and protects 1.0 from silent miscompilation.
14
14
 
15
15
  ## Design Direction
16
16
 
17
- Each matrix row should have a minimal fixture, an expected support status, and a test that proves the status. A supported feature must compile and generate aligned client, OpenAPI, and gateway artifacts where applicable. An unsupported feature must fail with a clear diagnostic or be documented as intentionally out of scope.
17
+ Each matrix row should have a minimal fixture, an expected support status, and a test that proves the status. A supported or partial feature must compile and generate aligned client, OpenAPI, gateway, generated-test, and app artifacts unless the row documents why a stage is inapplicable. An unsupported, diagnostic, or terminal feature must stop before downstream generation and fail with a clear diagnostic or be documented as intentionally out of scope.
18
18
 
19
19
  ## Shipped Baseline
20
20
 
21
- - `test/conformance/fixtures/` contains the first priority WSDL fixture set.
22
- - `test/conformance/registry.ts` lists priority rows with status, decision, provenance, and public contract text.
21
+ - `test/conformance/fixtures/` contains the baseline WSDL and XSD support fixture set.
22
+ - `test/conformance/registry.ts` lists baseline support rows with status, decision, provenance, and public contract text.
23
23
  - `test/conformance/conformance.test.ts` runs compile-stage expectations for runnable rows.
24
24
  - Supported and partial rows generate client artifacts that type-check.
25
25
  - Supported and partial rows generate validated OpenAPI specs with targeted contract assertions.
@@ -32,7 +32,7 @@ Each matrix row should have a minimal fixture, an expected support status, and a
32
32
 
33
33
  - Keep diagnostics executable as more unsupported rows are added.
34
34
  - Keep fixture metadata useful for a future public conformance fixture corpus.
35
- - Preserve the weather smoke fixture as the canonical end-to-end happy path.
35
+ - Preserve the weather smoke fixture as the canonical end-to-end demo while the copied conformance fixture proves the baseline support claim.
36
36
 
37
37
  ## Out Of Scope
38
38
 
@@ -45,6 +45,13 @@ Each matrix row should have a minimal fixture, an expected support status, and a
45
45
 
46
46
  | Feature | Expected 1.0 Status | Notes |
47
47
  |----------------------------|-------------------------|---------------------------------------|
48
+ | Weather document-literal baseline | supported | Canonical demo also lives in conformance |
49
+ | Complex sequences | supported | Nested references, repeated fields, and optional wrappers |
50
+ | Simple restrictions | supported | Enumerations, list aliases, and same-name aliases |
51
+ | Simple content attributes | supported | `$value` text content and flattened attributes |
52
+ | Documentation propagation | supported | Catalog, TypeScript, OpenAPI, and gateway comments |
53
+ | SOAP binding detection | supported | SOAP 1.1, SOAP 1.2, and first SOAP binding behavior |
54
+ | Relative XSD imports | supported | Local imports with committed companion XSDs |
48
55
  | `xs:choice` union mode | supported | Implemented in `0.26.0` |
49
56
  | `xs:union` | supported | Simple unions implemented after fixture work |
50
57
  | Abstract types | diagnostic | Avoid silent concrete treatment |
@@ -97,8 +104,8 @@ Ensure every documented unsupported or partial feature has a corresponding matri
97
104
  ## Acceptance Criteria
98
105
 
99
106
  - The matrix includes every roadmap priority feature.
100
- - Supported rows have compile, client, and OpenAPI evidence when those stages apply.
101
- - Unsupported or diagnostic rows fail with clear diagnostics, or are explicitly deferred without support claims.
107
+ - Supported and partial rows have compile, client, OpenAPI, gateway, generated-test, and app evidence when those stages apply.
108
+ - Unsupported, diagnostic, or terminal rows fail with clear diagnostics, or are explicitly deferred without support claims.
102
109
  - `docs/supported-patterns.md` reflects the matrix.
103
110
  - No known feature silently miscompiles in matrix coverage.
104
111
  - The matrix can run in CI or release preflight without network access.
@@ -159,6 +166,7 @@ Work items:
159
166
  - Keep `npm run test:conformance` as the focused command for maintainers who want only conformance checks.
160
167
  - Keep `npm test` and `npm run ci` broad enough for Vitest to discover `test/conformance`.
161
168
  - Keep release preflight's `conformance-gate` script check aligned with the package scripts.
169
+ - Keep release preflight's Node gate aligned with the package engine, Node 24 CI coverage, Node 26 CI coverage, and Node 24 release workflows.
162
170
  - Confirm release preflight runtime remains acceptable.
163
171
  - Keep diagnostic and unsupported rows stopped at compile.
164
172
  - Update public docs only when a row status or public contract changes.
@@ -9,6 +9,14 @@ The rows below are backed by committed conformance fixtures under `test/conforma
9
9
  <!-- support-matrix:start -->
10
10
  | Capability ID | Status | Public contract |
11
11
  |---|---|---|
12
+ | `weather-document-literal-soap` | supported | The canonical weather WSDL compiles through client, OpenAPI, gateway, generated-test, and app artifacts with document-literal SOAP operations. |
13
+ | `sequence-baseline-complex` | supported | Complex type sequences support nested complex references, repeated elements, optional fields, and all-optional request wrappers. |
14
+ | `simple-restriction-list` | supported | Named simple type restrictions, enumerations, and `xs:list` declarations emit aligned TypeScript aliases and OpenAPI schemas. |
15
+ | `same-name-simple-alias` | supported | A global element with the same local name as its named simple type reuses the scalar alias instead of emitting a duplicate wrapper interface. |
16
+ | `simple-content-attributes` | supported | Simple content emits text content through `$value` and flattens XML attributes as peer properties. |
17
+ | `documentation-propagation` | supported | WSDL and XSD documentation propagates into catalog metadata, generated TypeScript comments, OpenAPI descriptions, and gateway route comments. |
18
+ | `soap12-first-binding` | supported | SOAP 1.1 and SOAP 1.2 bindings are detected, and the first SOAP binding deterministically provides operation binding metadata. |
19
+ | `xsd-import-relative` | supported | Relative XSD imports are resolved and imported complex types participate in client, OpenAPI, gateway, generated-test, and app artifacts. |
12
20
  | `choice-union-simple` | supported | `xs:choice` union mode retains choice metadata and drives generated TypeScript/OpenAPI constraints. |
13
21
  | `xs-union-simple-type` | supported | Simple `xs:union` aliases compile to TypeScript unions and OpenAPI `oneOf` schemas. |
14
22
  | `abstract-complex-type` | diagnostic | Abstract complex types are rejected with a diagnostic instead of being treated as concrete. |
package/docs/testing.md CHANGED
@@ -31,6 +31,22 @@ For the full CI pipeline including smoke tests:
31
31
  npm run ci
32
32
  ```
33
33
 
34
+ ## Node Support Policy
35
+
36
+ The package supports Node.js >= 24.0.0. CI runs the complete project check on Node 24 and Node 26 so the supported floor and current Node line are both covered.
37
+
38
+ ## Temporary Workspaces
39
+
40
+ Repository test and release automation keeps disposable output classified under `tmp/`:
41
+
42
+ - `tmp/smoke/`: smoke-script client, OpenAPI, gateway, app, and catalog output
43
+ - `tmp/cache/npm/`: local npm cache used by package and dependency checks
44
+ - `tmp/preflight/examples/`: regenerated examples used by release preflight
45
+ - `tmp/conformance/`: conformance mini-projects that need repository-local module resolution
46
+ - `tmp/test-generation/`: generated-test integration spikes
47
+
48
+ Keep new repository-owned temporary writers under the closest existing subfolder. Public CLI examples may still use simple `tmp/...` paths when those examples are clearer for users.
49
+
34
50
  ## Unit Tests
35
51
 
36
52
  Unit tests cover pure functions with no I/O or side effects:
@@ -180,6 +196,8 @@ npm run test:conformance
180
196
 
181
197
  `npm test` includes the conformance suite through normal Vitest discovery. `npm run ci` and release preflight cover conformance through that broad test command, while release preflight also checks that the focused command and broad CI discovery remain wired.
182
198
 
199
+ Examples under `examples/` are consumer-facing demos and smoke-test inputs. Reusable WSDL and XSD behavior that represents a public support claim belongs in `test/conformance/fixtures/` with a matching registry row.
200
+
183
201
  ## Known Issues
184
202
 
185
203
  ### ArrayOf* Schema-Type Mismatch (Resolved)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@techspokes/typescript-wsdl-client",
3
- "version": "0.34.0",
3
+ "version": "0.35.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",
@@ -35,7 +35,7 @@
35
35
  ],
36
36
  "type": "module",
37
37
  "engines": {
38
- "node": ">=20.0.0"
38
+ "node": ">=24.0.0"
39
39
  },
40
40
  "bin": {
41
41
  "wsdl-tsc": "dist/cli.js"
@@ -74,12 +74,12 @@
74
74
  "test:watch": "vitest",
75
75
  "prepublishOnly": "npm run clean && npm run build && npm run package:validate",
76
76
  "smoke:reset": "npm run clean:tmp",
77
- "smoke:compile": "npm run smoke:reset && tsx src/cli.ts compile --wsdl-source examples/minimal/weather.wsdl --catalog-file tmp/catalog.json",
78
- "smoke:client": "npm run smoke:reset && tsx src/cli.ts client --wsdl-source examples/minimal/weather.wsdl --client-dir tmp/client && tsc -p tsconfig.smoke.json",
79
- "smoke:openapi": "npm run smoke:reset && tsx src/cli.ts openapi --wsdl-source examples/minimal/weather.wsdl --openapi-file tmp/openapi.json --openapi-format json && tsc -p tsconfig.smoke.json",
80
- "smoke:gateway": "npm run smoke:reset && tsx src/cli.ts client --wsdl-source examples/minimal/weather.wsdl --client-dir tmp/client && tsx src/cli.ts openapi --catalog-file tmp/client/catalog.json --openapi-file tmp/openapi.json --openapi-format json && tsx src/cli.ts gateway --openapi-file tmp/openapi.json --client-dir tmp/client --gateway-dir tmp/gateway --gateway-service-name weather --gateway-version-prefix v1 && tsc -p tsconfig.smoke.json",
81
- "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",
82
- "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",
77
+ "smoke:compile": "npm run smoke:reset && tsx src/cli.ts compile --wsdl-source examples/minimal/weather.wsdl --catalog-file tmp/smoke/catalog.json",
78
+ "smoke:client": "npm run smoke:reset && tsx src/cli.ts client --wsdl-source examples/minimal/weather.wsdl --client-dir tmp/smoke/client && tsc -p tsconfig.smoke.json",
79
+ "smoke:openapi": "npm run smoke:reset && tsx src/cli.ts openapi --wsdl-source examples/minimal/weather.wsdl --openapi-file tmp/smoke/openapi.json --openapi-format json && tsc -p tsconfig.smoke.json",
80
+ "smoke:gateway": "npm run smoke:reset && tsx src/cli.ts client --wsdl-source examples/minimal/weather.wsdl --client-dir tmp/smoke/client && tsx src/cli.ts openapi --catalog-file tmp/smoke/client/catalog.json --openapi-file tmp/smoke/openapi.json --openapi-format json && tsx src/cli.ts gateway --openapi-file tmp/smoke/openapi.json --client-dir tmp/smoke/client --gateway-dir tmp/smoke/gateway --gateway-service-name weather --gateway-version-prefix v1 && tsc -p tsconfig.smoke.json",
81
+ "smoke:pipeline": "npm run smoke:reset && tsx src/cli.ts pipeline --wsdl-source examples/minimal/weather.wsdl --client-dir tmp/smoke/client --openapi-file tmp/smoke/openapi.json --gateway-dir tmp/smoke/gateway --gateway-service-name weather --gateway-version-prefix v1 --openapi-format json --init-app && tsc -p tsconfig.smoke.json",
82
+ "smoke:app": "npm run smoke:reset && tsx src/cli.ts pipeline --wsdl-source examples/minimal/weather.wsdl --client-dir tmp/smoke/client --openapi-file tmp/smoke/openapi.json --gateway-dir tmp/smoke/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/smoke/client --gateway-dir tmp/smoke/gateway --openapi-file tmp/smoke/openapi.json --app-dir tmp/smoke/app --port 8080 && tsc -p tsconfig.smoke.json",
83
83
  "maint:deps": "node scripts/maint-deps.mjs",
84
84
  "docs:support-matrix": "tsx scripts/generate-support-matrix.ts",
85
85
  "docs:support-matrix:check": "tsx scripts/generate-support-matrix.ts --check",
@@ -163,7 +163,7 @@
163
163
  }
164
164
 
165
165
  /**
166
- * Iterate an uploaded web ReadableStream as Uint8Array chunks. Node 20+
166
+ * Iterate an uploaded web ReadableStream as Uint8Array chunks. Node 24+
167
167
  * ReadableStream implements Symbol.asyncIterator natively; this helper
168
168
  * normalizes the types so TypeScript can drive it through \`for await\`.
169
169
  */