@techspokes/typescript-wsdl-client 0.34.0 → 0.36.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.
@@ -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. |
@@ -16,7 +24,7 @@ The rows below are backed by committed conformance fixtures under `test/conforma
16
24
  | `multi-binding-first-soap` | partial | Multiple bindings are deterministic: the first SOAP binding is selected and all ports are documented. |
17
25
  | `external-policy-reference` | partial | Inline policy hints are detected; external `PolicyReference` documents are not fetched or resolved. |
18
26
  | `deep-composition-sequence` | supported | Deep nested sequences compile into deterministic type metadata. |
19
- | `xs-anyattribute` | partial | `xs:anyAttribute` is retained as catalog metadata, but generated wildcard attributes are not emitted. |
27
+ | `xs-anyattribute` | supported | `xs:anyAttribute` is retained as catalog metadata and emitted as an optional wildcard attribute bag named by the configured attributes key. |
20
28
  | `mtom-xop-attachment` | unsupported | MTOM/XOP binary attachment metadata is rejected because attachment transport is outside the 1.0 typed SOAP-to-REST contract. |
21
29
  <!-- support-matrix:end -->
22
30
 
@@ -41,6 +49,13 @@ These patterns are handled end-to-end: WSDL parsing, TypeScript type generation,
41
49
  - SOAP 1.1 and SOAP 1.2 binding detection
42
50
  - Streamable SOAP responses, opt-in per operation via `--stream-config` (ADR-002): client exposes `AsyncIterable<RecordType>`, gateway emits NDJSON or JSON array streams with backpressure, OpenAPI advertises the record schema via `x-wsdl-tsc-stream`
43
51
  - `xs:any` wildcard particles retained on compiled types for stream-candidate detection and companion-catalog shape resolution
52
+ - `xs:anyAttribute` wildcard attributes emitted as an optional configured attribute bag, defaulting to `$attributes`
53
+
54
+ ### xs:anyAttribute
55
+
56
+ Attribute wildcards are retained as catalog metadata and emitted as an optional wildcard attribute bag on the enclosing generated type. The bag property uses the configured client attributes key, defaulting to `$attributes`, and maps arbitrary wildcard attribute names to string values.
57
+
58
+ Known XML attributes remain flattened as peer properties. Wildcard attributes stay inside the bag so unknown names do not collide with child elements or known attributes.
44
59
 
45
60
  ### Named simple types and same-name elements
46
61
 
@@ -88,15 +103,11 @@ List types with an `itemType` attribute are detected and generate array types (`
88
103
 
89
104
  Union types with `memberTypes` or inline simple type members are detected and generate TypeScript alias unions. Mixed primitive and literal unions generate OpenAPI `oneOf` schemas.
90
105
 
91
- ### xs:anyAttribute
92
-
93
- Attribute wildcards are retained as catalog metadata on the enclosing compiled type. They are not emitted as typed attribute properties in generated TypeScript or OpenAPI schemas.
94
-
95
106
  ## Not Yet Supported
96
107
 
97
108
  These features are not currently handled. Contributions are welcome.
98
109
 
99
- - Full `xs:any` serialization: arbitrary wildcard content is not emitted as a typed contract
110
+ - Full `xs:any` element serialization: arbitrary wildcard element content is not emitted as a typed contract
100
111
  - Abstract types: rejected with a diagnostic; no polymorphic instance handling
101
112
  - Substitution groups: rejected with a diagnostic; no polymorphic element expansion
102
113
  - MTOM/XOP binary attachments: rejected with a diagnostic; no binary part handling
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.36.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"
@@ -70,16 +70,17 @@
70
70
  "test:unit": "vitest run test/unit",
71
71
  "test:snap": "vitest run test/snapshot",
72
72
  "test:integration": "vitest run test/integration",
73
+ "test:github": "vitest run test/unit test/snapshot test/integration",
73
74
  "test:conformance": "vitest run test/conformance",
74
75
  "test:watch": "vitest",
75
76
  "prepublishOnly": "npm run clean && npm run build && npm run package:validate",
76
77
  "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",
78
+ "smoke:compile": "npm run smoke:reset && tsx src/cli.ts compile --wsdl-source examples/minimal/weather.wsdl --catalog-file tmp/smoke/catalog.json",
79
+ "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",
80
+ "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",
81
+ "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",
82
+ "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",
83
+ "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
84
  "maint:deps": "node scripts/maint-deps.mjs",
84
85
  "docs:support-matrix": "tsx scripts/generate-support-matrix.ts",
85
86
  "docs:support-matrix:check": "tsx scripts/generate-support-matrix.ts --check",
@@ -89,6 +90,8 @@
89
90
  "package:validate": "node scripts/validate-npm-package.mjs",
90
91
  "release:preflight": "node scripts/release-preflight.mjs",
91
92
  "ci": "npm run clean && npm run build && npm run typecheck && npm run skill:validate && npm run package:validate && npm run docs:validate && vitest run && npm run smoke:pipeline",
93
+ "ci:github": "npm run clean && npm run build && npm run typecheck && npm run skill:validate && npm run package:validate && npm run docs:validate && npm run test:github && npm run smoke:pipeline",
94
+ "ci:github:node26": "npm run clean && npm run build && npm run typecheck && npm run test:unit && npm run smoke:pipeline",
92
95
  "examples:regenerate": "tsx src/cli.ts pipeline --wsdl-source examples/minimal/weather.wsdl --client-dir examples/generated-output/client --openapi-file examples/generated-output/openapi.json --gateway-dir examples/generated-output/gateway --gateway-service-name weather --gateway-version-prefix v1 --openapi-format json"
93
96
  },
94
97
  "devDependencies": {
@@ -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
  */