@techspokes/typescript-wsdl-client 0.36.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.
Files changed (37) hide show
  1. package/README.md +10 -8
  2. package/dist/app/generateApp.js +3 -3
  3. package/dist/cli.js +5 -6
  4. package/dist/compiler/schemaCompiler.d.ts +2 -2
  5. package/dist/compiler/schemaCompiler.d.ts.map +1 -1
  6. package/dist/compiler/schemaCompiler.js +3 -15
  7. package/dist/compiler/shapeResolver.js +1 -1
  8. package/dist/gateway/generators.d.ts.map +1 -1
  9. package/dist/gateway/generators.js +8 -2
  10. package/dist/openapi/security.d.ts +1 -1
  11. package/dist/openapi/security.d.ts.map +1 -1
  12. package/dist/openapi/security.js +1 -1
  13. package/docs/api-reference.md +4 -4
  14. package/docs/cli-reference.md +18 -16
  15. package/docs/file-naming-and-path-organization.md +1 -1
  16. package/docs/gateway-guide.md +5 -5
  17. package/docs/migration-playbook.md +18 -18
  18. package/docs/migration.md +35 -0
  19. package/docs/output-anatomy.md +2 -2
  20. package/docs/production.md +1 -1
  21. package/docs/releases/README.md +30 -0
  22. package/docs/releases/v0.37.0.md +33 -0
  23. package/docs/releases/v0.38.0.md +35 -0
  24. package/docs/releases/v0.39.0.md +35 -0
  25. package/docs/releases/v0.40.0.md +45 -0
  26. package/docs/releases/v0.40.1.md +34 -0
  27. package/docs/releases/v1.0.0.md +42 -0
  28. package/docs/releases/v1.0.1.md +38 -0
  29. package/docs/roadmap/README.md +11 -11
  30. package/docs/roadmap/v1.0-capability-conformance-framework.md +14 -12
  31. package/docs/roadmap/v1.0-contract-audit.md +3 -3
  32. package/docs/roadmap/v1.0-release-candidate-gates.md +13 -7
  33. package/docs/roadmap/v1.0-wsdl-coverage-matrix.md +14 -4
  34. package/docs/roadmap/v1.0-xs-anyattribute-wildcard-bag.md +52 -50
  35. package/docs/start-here.md +8 -8
  36. package/docs/testing.md +6 -6
  37. package/package.json +17 -9
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,14 +525,14 @@ function generatePackageJson(appDir, force) {
525
525
  dev: "tsx watch server.ts",
526
526
  },
527
527
  dependencies: {
528
- fastify: "^5.8.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.0.1",
535
- tsx: "^4.22.4",
534
+ "@types/node": "^26.1.1",
535
+ tsx: "^4.23.0",
536
536
  typescript: "^6.0.3",
537
537
  },
538
538
  };
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;
@@ -1 +1 @@
1
- {"version":3,"file":"schemaCompiler.d.ts","sourceRoot":"","sources":["../../src/compiler/schemaCompiler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemaCompiler.d.ts","sourceRoot":"","sources":["../../src/compiler/schemaCompiler.ts"],"names":[],"mappings":"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"}
@@ -433,21 +433,7 @@ export function compileCatalog(cat, options, streamConfig) {
433
433
  }
434
434
  return merged;
435
435
  };
436
- const mergeWildcards = (into, list) => {
437
- if (list.length === 0)
438
- return into;
439
- const merged = into ? [...into] : [];
440
- const seen = new Set(merged.map((w) => JSON.stringify(w)));
441
- for (const w of list) {
442
- const key = JSON.stringify(w);
443
- if (!seen.has(key)) {
444
- seen.add(key);
445
- merged.push(w);
446
- }
447
- }
448
- return merged;
449
- };
450
- const mergeAttributeWildcards = (into, list) => {
436
+ const mergeJsonUnique = (into, list) => {
451
437
  if (list.length === 0)
452
438
  return into;
453
439
  const merged = into ? [...into] : [];
@@ -461,6 +447,8 @@ export function compileCatalog(cat, options, streamConfig) {
461
447
  }
462
448
  return merged;
463
449
  };
450
+ const mergeWildcards = (into, list) => mergeJsonUnique(into, list);
451
+ const mergeAttributeWildcards = (into, list) => mergeJsonUnique(into, list);
464
452
  const collectAttributes = (node) => {
465
453
  const out = [];
466
454
  const attrs = getChildrenWithLocalName(node, "attribute");
@@ -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
  *
@@ -1 +1 @@
1
- {"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../src/gateway/generators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generators.d.ts","sourceRoot":"","sources":["../../src/gateway/generators.ts"],"names":[],"mappings":"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"}
@@ -405,6 +405,10 @@ export function emitRuntimeModule(outDir, versionSlug, serviceSlug, catalog, opt
405
405
  const childTypes = catalog.meta?.childType || {};
406
406
  // Only emit if there are actual wrapper types to unwrap
407
407
  if (Object.keys(arrayWrappers).length > 0) {
408
+ const childrenTypesJsonLines = JSON.stringify(childTypes, null, 2)
409
+ .split("\n")
410
+ .map((line) => ` ${JSON.stringify(line)}`)
411
+ .join(",\n");
408
412
  unwrapSection = `
409
413
  /**
410
414
  * ArrayOf* wrapper type → inner element property name.
@@ -416,7 +420,9 @@ const ARRAY_WRAPPERS: Record<string, string> = ${JSON.stringify(arrayWrappers, n
416
420
  /**
417
421
  * Type name → { propertyName: propertyTypeName } for recursive unwrapping.
418
422
  */
419
- const CHILDREN_TYPES: Record<string, Record<string, string>> = ${JSON.stringify(childTypes, null, 2)};
423
+ const CHILDREN_TYPES: Record<string, Record<string, string>> = JSON.parse([
424
+ ${childrenTypesJsonLines}
425
+ ].join("\\n")) as Record<string, Record<string, string>>;
420
426
 
421
427
  function isSafeObjectKey(key: string): boolean {
422
428
  return key !== "__proto__" && key !== "constructor" && key !== "prototype";
@@ -512,7 +518,7 @@ export type ResponseEnvelope<T> = SuccessEnvelope<T> | ErrorEnvelope;
512
518
  * @param message - Optional success message
513
519
  * @returns Success envelope wrapping the data
514
520
  */
515
- export function buildSuccessEnvelope<T>(data: T, message?: string): SuccessEnvelope<T> {
521
+ export function buildSuccessEnvelope<T>(data: T, message?: string): ResponseEnvelope<T> {
516
522
  return {
517
523
  status: "SUCCESS",
518
524
  message: message ?? null,
@@ -1,2 +1,2 @@
1
- export { buildSecurity, loadSecurityConfigFile as loadSecurityConfig, parseSecurityConfig, SecurityConfigError, type BuiltSecurity, type GatewayAuthScheme as AuthScheme, type SecurityConfig, } from "../util/securityConfig.js";
1
+ export { buildSecurity, loadSecurityConfigFile as loadSecurityConfig, } from "../util/securityConfig.js";
2
2
  //# sourceMappingURL=security.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/openapi/security.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,sBAAsB,IAAI,kBAAkB,EAC5C,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,IAAI,UAAU,EACpC,KAAK,cAAc,GACpB,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/openapi/security.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,sBAAsB,IAAI,kBAAkB,GAC7C,MAAM,2BAA2B,CAAC"}
@@ -1 +1 @@
1
- export { buildSecurity, loadSecurityConfigFile as loadSecurityConfig, parseSecurityConfig, SecurityConfigError, } from "../util/securityConfig.js";
1
+ export { buildSecurity, loadSecurityConfigFile as loadSecurityConfig, } from "../util/securityConfig.js";
@@ -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
 
@@ -65,7 +65,7 @@ File names state the exact purpose and content of the artifact. They should rema
65
65
  - Use lowercase kebab-case.
66
66
  - Use general-to-specific segment order.
67
67
  - Put the broad feature classifier first.
68
- - Put variable-like qualifiers at the right side.
68
+ - Put variable-like qualifiers on the right side.
69
69
  - Keep recognized standards terms when they identify the feature.
70
70
  - Avoid filler words such as `service`, `sample`, `fixture`, and `test`.
71
71
  - Use the file extension to identify format, not the basename.
@@ -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.