@techspokes/typescript-wsdl-client 1.1.5 → 1.2.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.
Files changed (505) hide show
  1. package/README.md +80 -68
  2. package/dist/app/generateApp.d.ts +0 -1
  3. package/dist/app/generateApp.js +1 -1
  4. package/dist/app/generateCheckedApp.d.ts +38 -0
  5. package/dist/app/generateCheckedApp.js +108 -0
  6. package/dist/checkedPipeline.d.ts +155 -0
  7. package/dist/checkedPipeline.js +448 -0
  8. package/dist/checkedPlanning.d.ts +123 -0
  9. package/dist/checkedPlanning.js +268 -0
  10. package/dist/cli.d.ts +0 -1
  11. package/dist/cli.js +92 -2
  12. package/dist/client/checkedDirectRuntime.d.ts +40 -3
  13. package/dist/client/checkedDirectRuntime.js +28 -8
  14. package/dist/client/directClientRuntime.d.ts +27 -2
  15. package/dist/client/directClientRuntime.js +142 -89
  16. package/dist/client/directClientVersion.d.ts +3 -1
  17. package/dist/client/directClientVersion.js +3 -0
  18. package/dist/client/generateClient.d.ts +0 -1
  19. package/dist/client/generateClient.js +98 -28
  20. package/dist/client/generateDirectClient.d.ts +21 -3
  21. package/dist/client/generateDirectClient.js +138 -6
  22. package/dist/client/generateOperations.d.ts +0 -1
  23. package/dist/client/generateOperations.js +30 -11
  24. package/dist/client/generateTypes.d.ts +0 -1
  25. package/dist/client/generateUtils.d.ts +0 -1
  26. package/dist/client/generateUtils.js +7 -1
  27. package/dist/compiler/applicationGroups.d.ts +53 -0
  28. package/dist/compiler/applicationGroups.js +403 -0
  29. package/dist/compiler/buildCanonicalGraph.d.ts +0 -1
  30. package/dist/compiler/canonicalGraph.d.ts +4 -16
  31. package/dist/compiler/canonicalGraph.js +1 -8
  32. package/dist/compiler/catalogErrors.d.ts +0 -1
  33. package/dist/compiler/catalogProvenance.d.ts +0 -1
  34. package/dist/compiler/checkedAssessment.d.ts +0 -1
  35. package/dist/compiler/checkedAssessment.js +1 -1
  36. package/dist/compiler/checkedComponentSource.d.ts +16 -0
  37. package/dist/compiler/checkedComponentSource.js +31 -0
  38. package/dist/compiler/checkedSourcePreparation.d.ts +38 -1
  39. package/dist/compiler/checkedSourcePreparation.js +71 -0
  40. package/dist/compiler/complexTypeContent.d.ts +5 -6
  41. package/dist/compiler/complexTypeContent.js +2 -2
  42. package/dist/compiler/componentCorrespondence.d.ts +32 -0
  43. package/dist/compiler/componentCorrespondence.js +140 -0
  44. package/dist/compiler/componentRecordProjection.d.ts +112 -0
  45. package/dist/compiler/componentRecordProjection.js +329 -0
  46. package/dist/compiler/componentSoapPreparation.d.ts +20 -0
  47. package/dist/compiler/componentSoapPreparation.js +36 -0
  48. package/dist/compiler/composeCanonicalGraph.d.ts +0 -1
  49. package/dist/compiler/dataOwnership.d.ts +0 -1
  50. package/dist/compiler/dataOwnership.js +14 -4
  51. package/dist/compiler/datatypeValues.d.ts +0 -1
  52. package/dist/compiler/declarationIdentity.d.ts +22 -0
  53. package/dist/compiler/declarationIdentity.js +9 -0
  54. package/dist/compiler/directCodec.d.ts +79 -2
  55. package/dist/compiler/directCodec.js +310 -92
  56. package/dist/compiler/directExecutionPolicy.d.ts +0 -1
  57. package/dist/compiler/directOperation.d.ts +72 -8
  58. package/dist/compiler/directOperation.js +164 -19
  59. package/dist/compiler/directSoap.d.ts +29 -5
  60. package/dist/compiler/directSoap.js +154 -44
  61. package/dist/compiler/directSoapSource.d.ts +24 -1
  62. package/dist/compiler/directSoapSource.js +166 -19
  63. package/dist/compiler/directSourceCapsule.d.ts +74 -2
  64. package/dist/compiler/directSourceCapsule.js +484 -6
  65. package/dist/compiler/directStructure.d.ts +83 -6
  66. package/dist/compiler/directStructure.js +353 -58
  67. package/dist/compiler/directStructurePlan.d.ts +144 -2
  68. package/dist/compiler/directStructurePlan.js +615 -30
  69. package/dist/compiler/directValues.d.ts +76 -5
  70. package/dist/compiler/directValues.js +967 -117
  71. package/dist/compiler/finiteRe01Construction.d.ts +69 -0
  72. package/dist/compiler/finiteRe01Construction.js +422 -0
  73. package/dist/compiler/finiteRe01Verification.d.ts +81 -3
  74. package/dist/compiler/finiteRe01Verification.js +391 -4
  75. package/dist/compiler/generateCatalog.d.ts +0 -1
  76. package/dist/compiler/graphTraversal.d.ts +0 -1
  77. package/dist/compiler/hypotheticalScopedIdentity.d.ts +0 -1
  78. package/dist/compiler/legacyDeclarations.d.ts +26 -0
  79. package/dist/compiler/legacyDeclarations.js +144 -0
  80. package/dist/compiler/occurrenceAnalysis.d.ts +2 -1
  81. package/dist/compiler/occurrenceAnalysis.js +23 -7
  82. package/dist/compiler/originalSourceMembership.d.ts +0 -1
  83. package/dist/compiler/particleAttribution.d.ts +0 -1
  84. package/dist/compiler/particleAttribution.js +20 -0
  85. package/dist/compiler/particleDeclarationConsistency.d.ts +0 -1
  86. package/dist/compiler/particleDeclarationConsistency.js +9 -0
  87. package/dist/compiler/particleExtension.d.ts +0 -1
  88. package/dist/compiler/particleExtension.js +5 -1
  89. package/dist/compiler/particleLocalAssessment.d.ts +0 -1
  90. package/dist/compiler/particleRestriction.d.ts +0 -1
  91. package/dist/compiler/particleRestriction.js +6 -1
  92. package/dist/compiler/particleSemanticView.d.ts +2 -1
  93. package/dist/compiler/particleSemanticView.js +16 -3
  94. package/dist/compiler/particleWildcardRelation.d.ts +0 -1
  95. package/dist/compiler/projectionScalar.d.ts +49 -0
  96. package/dist/compiler/projectionScalar.js +218 -0
  97. package/dist/compiler/re01CandidateAssignments.d.ts +95 -0
  98. package/dist/compiler/re01CandidateAssignments.js +341 -0
  99. package/dist/compiler/re01CandidateCorrespondence.d.ts +22 -1
  100. package/dist/compiler/re01CandidateCorrespondence.js +167 -38
  101. package/dist/compiler/re01TypeProperties.d.ts +0 -1
  102. package/dist/compiler/re01TypePropertyValidation.d.ts +0 -1
  103. package/dist/compiler/resolveCanonicalGraph.d.ts +5 -2
  104. package/dist/compiler/resolveCanonicalGraph.js +77 -7
  105. package/dist/compiler/rpcStringValues.d.ts +30 -0
  106. package/dist/compiler/rpcStringValues.js +196 -0
  107. package/dist/compiler/rpcTypedValues.d.ts +48 -0
  108. package/dist/compiler/rpcTypedValues.js +190 -0
  109. package/dist/compiler/scalarSchemaAssessment.d.ts +0 -1
  110. package/dist/compiler/schemaAttributeGroupProperties.d.ts +0 -1
  111. package/dist/compiler/schemaAttributeProperties.d.ts +0 -1
  112. package/dist/compiler/schemaAttributeUses.d.ts +22 -2
  113. package/dist/compiler/schemaAttributeUses.js +86 -13
  114. package/dist/compiler/schemaBinaryWordReconstruction.d.ts +0 -1
  115. package/dist/compiler/schemaBuiltinFacets.d.ts +0 -1
  116. package/dist/compiler/schemaCalendarImages.d.ts +0 -1
  117. package/dist/compiler/schemaCalendarLanguage.d.ts +0 -1
  118. package/dist/compiler/schemaCompiler.d.ts +0 -1
  119. package/dist/compiler/schemaCompiler.js +44 -109
  120. package/dist/compiler/schemaComponentEquality.d.ts +0 -1
  121. package/dist/compiler/schemaConstructionAssessment.d.ts +34 -1
  122. package/dist/compiler/schemaConstructionAssessment.js +88 -6
  123. package/dist/compiler/schemaDatatypeValues.d.ts +0 -1
  124. package/dist/compiler/schemaDecimalLanguage.d.ts +0 -1
  125. package/dist/compiler/schemaDeclarationPrimitives.d.ts +7 -2
  126. package/dist/compiler/schemaDeclarationPrimitives.js +18 -1
  127. package/dist/compiler/schemaDocumentSyntax.d.ts +0 -1
  128. package/dist/compiler/schemaDurationLanguage.d.ts +0 -1
  129. package/dist/compiler/schemaElementInstance.d.ts +30 -0
  130. package/dist/compiler/schemaElementInstance.js +45 -0
  131. package/dist/compiler/schemaElementProperties.d.ts +0 -1
  132. package/dist/compiler/schemaEndpointWordCapacity.d.ts +0 -1
  133. package/dist/compiler/schemaExactCalendar.d.ts +0 -1
  134. package/dist/compiler/schemaFacetAnnotation.d.ts +0 -1
  135. package/dist/compiler/schemaGeneratedScalarShape.d.ts +0 -1
  136. package/dist/compiler/schemaGeneratedScalarShape.js +2 -0
  137. package/dist/compiler/schemaIdentityConstraints.d.ts +0 -1
  138. package/dist/compiler/schemaIeeeLanguage.d.ts +0 -1
  139. package/dist/compiler/schemaIntegerImages.d.ts +0 -1
  140. package/dist/compiler/schemaLexicalPredicates.d.ts +0 -1
  141. package/dist/compiler/schemaNotationProperties.d.ts +0 -1
  142. package/dist/compiler/schemaNumericImageConditions.d.ts +0 -1
  143. package/dist/compiler/schemaParticleWildcardProperties.d.ts +0 -1
  144. package/dist/compiler/schemaPattern.d.ts +0 -1
  145. package/dist/compiler/schemaRegularLanguage.d.ts +0 -1
  146. package/dist/compiler/schemaScalarContext.d.ts +5 -1
  147. package/dist/compiler/schemaScalarKernel.d.ts +0 -1
  148. package/dist/compiler/schemaScalarWitnesses.d.ts +0 -1
  149. package/dist/compiler/schemaSimpleTypeProperties.d.ts +0 -1
  150. package/dist/compiler/schemaSourceGrammar.d.ts +0 -1
  151. package/dist/compiler/schemaSourceLexical.d.ts +0 -1
  152. package/dist/compiler/schemaSourceValues.d.ts +0 -1
  153. package/dist/compiler/schemaSourceWildcards.d.ts +1 -2
  154. package/dist/compiler/schemaSourceWildcards.js +3 -1
  155. package/dist/compiler/schemaSymbolicSequences.d.ts +0 -1
  156. package/dist/compiler/schemaSymbolicValueSets.d.ts +0 -1
  157. package/dist/compiler/schemaSyntaxAssessment.d.ts +0 -1
  158. package/dist/compiler/schemaTemporalAliases.d.ts +0 -1
  159. package/dist/compiler/schemaTokenImages.d.ts +0 -1
  160. package/dist/compiler/schemaTypeIdentity.d.ts +0 -1
  161. package/dist/compiler/schemaTypeIdentity.js +2 -0
  162. package/dist/compiler/schemaTypeRelations.d.ts +0 -1
  163. package/dist/compiler/schemaUri.d.ts +0 -1
  164. package/dist/compiler/schemaValueContext.d.ts +0 -1
  165. package/dist/compiler/schemaValueImages.d.ts +0 -1
  166. package/dist/compiler/schemaValueSequences.d.ts +0 -1
  167. package/dist/compiler/semanticBudget.d.ts +18 -1
  168. package/dist/compiler/semanticBudget.js +17 -2
  169. package/dist/compiler/semanticCatalog.d.ts +2 -3
  170. package/dist/compiler/semanticContext.d.ts +12 -1
  171. package/dist/compiler/semanticContext.js +39 -0
  172. package/dist/compiler/semanticTypeDependencies.d.ts +0 -1
  173. package/dist/compiler/semanticTypeReference.d.ts +0 -1
  174. package/dist/compiler/shapeResolver.d.ts +0 -1
  175. package/dist/compiler/soapHeaders.d.ts +16 -0
  176. package/dist/compiler/soapHeaders.js +42 -0
  177. package/dist/compiler/sourceSchemaBinding.d.ts +0 -1
  178. package/dist/compiler/standardSchemaComponents.d.ts +71 -0
  179. package/dist/compiler/standardSchemaComponents.js +74 -0
  180. package/dist/compiler/standardSchemaConstruction.d.ts +20 -0
  181. package/dist/compiler/standardSchemaConstruction.js +34 -0
  182. package/dist/compiler/structuralCompanions.d.ts +0 -1
  183. package/dist/compiler/validateSemanticGraph.d.ts +0 -1
  184. package/dist/compiler/wildcardAlgebra.d.ts +0 -1
  185. package/dist/compiler/wsdlPolicyRequirements.d.ts +43 -0
  186. package/dist/compiler/wsdlPolicyRequirements.js +239 -0
  187. package/dist/config.d.ts +0 -1
  188. package/dist/gateway/generateCheckedGateway.d.ts +32 -0
  189. package/dist/gateway/generateCheckedGateway.js +293 -0
  190. package/dist/gateway/generateComposedGateway.d.ts +16 -0
  191. package/dist/gateway/generateComposedGateway.js +65 -0
  192. package/dist/gateway/generateGateway.d.ts +0 -1
  193. package/dist/gateway/generateGateway.js +1 -0
  194. package/dist/gateway/generators.d.ts +0 -1
  195. package/dist/gateway/generators.js +19 -4
  196. package/dist/gateway/helpers.d.ts +1 -1
  197. package/dist/gateway/helpers.js +15 -0
  198. package/dist/generation/componentShape.d.ts +14 -0
  199. package/dist/generation/componentShape.js +293 -0
  200. package/dist/generation/preamble.d.ts +0 -1
  201. package/dist/generation/sourceLayout.d.ts +13 -0
  202. package/dist/generation/sourceLayout.js +40 -0
  203. package/dist/generation/writeGeneratedSource.d.ts +0 -1
  204. package/dist/index.d.ts +11 -2
  205. package/dist/index.js +4 -1
  206. package/dist/loader/fetch.d.ts +0 -1
  207. package/dist/loader/orderedSyntax.d.ts +12 -1
  208. package/dist/loader/orderedSyntax.js +40 -6
  209. package/dist/loader/resolutionDepth.d.ts +0 -1
  210. package/dist/loader/schemaInput.d.ts +28 -1
  211. package/dist/loader/schemaInput.js +41 -4
  212. package/dist/loader/schemaResources.d.ts +2 -1
  213. package/dist/loader/schemaResources.js +45 -4
  214. package/dist/loader/wsdlLoader.d.ts +0 -1
  215. package/dist/multiServicePipeline.d.ts +41 -0
  216. package/dist/multiServicePipeline.js +287 -0
  217. package/dist/openapi/casing.d.ts +0 -1
  218. package/dist/openapi/composeOpenAPI.d.ts +29 -0
  219. package/dist/openapi/composeOpenAPI.js +322 -0
  220. package/dist/openapi/generateOpenAPI.d.ts +0 -1
  221. package/dist/openapi/generatePaths.d.ts +0 -1
  222. package/dist/openapi/generateSchemas.d.ts +0 -1
  223. package/dist/openapi/security.d.ts +0 -1
  224. package/dist/pipeline.d.ts +7 -3
  225. package/dist/pipeline.js +15 -0
  226. package/dist/test/generateCheckedTests.d.ts +17 -0
  227. package/dist/test/generateCheckedTests.js +60 -0
  228. package/dist/test/generateTests.d.ts +0 -1
  229. package/dist/test/generators.d.ts +0 -1
  230. package/dist/test/mockData.d.ts +0 -1
  231. package/dist/test/mockData.js +20 -14
  232. package/dist/util/attributeWildcards.d.ts +0 -1
  233. package/dist/util/builder.d.ts +0 -1
  234. package/dist/util/catalogMeta.d.ts +0 -1
  235. package/dist/util/checkedCliDiagnostics.d.ts +11 -0
  236. package/dist/util/checkedCliDiagnostics.js +22 -0
  237. package/dist/util/cli.d.ts +0 -1
  238. package/dist/util/errors.d.ts +0 -1
  239. package/dist/util/imports.d.ts +0 -1
  240. package/dist/util/runtimeSource.d.ts +0 -1
  241. package/dist/util/runtimeSource.js +3 -5
  242. package/dist/util/securityConfig.d.ts +0 -1
  243. package/dist/util/streamConfig.d.ts +0 -1
  244. package/dist/util/tools.d.ts +0 -1
  245. package/dist/util/xmlWhitespace.d.ts +0 -1
  246. package/dist/xsd/primitives.d.ts +0 -1
  247. package/docs/agent-skill.md +12 -1
  248. package/docs/api-reference.md +127 -9
  249. package/docs/checked-gateway.md +212 -0
  250. package/docs/checked-generation.md +167 -0
  251. package/docs/cli-reference.md +48 -6
  252. package/docs/concepts.md +139 -5
  253. package/docs/configuration.md +15 -4
  254. package/docs/corpus.md +33 -0
  255. package/docs/direct-values.md +13 -13
  256. package/docs/examples/checked-forecast.wsdl +19 -0
  257. package/docs/gateway-guide.md +104 -27
  258. package/docs/generated-code.md +22 -11
  259. package/docs/mapping-contract.md +114 -0
  260. package/docs/migration-playbook.md +5 -1
  261. package/docs/migration.md +124 -6
  262. package/docs/output-anatomy.md +21 -18
  263. package/docs/production.md +7 -5
  264. package/docs/start-here.md +19 -3
  265. package/docs/supported-patterns.md +24 -3
  266. package/docs/testing.md +119 -31
  267. package/docs/troubleshooting.md +3 -1
  268. package/llms.txt +16 -8
  269. package/package.json +64 -23
  270. package/src/runtime/checkedGatewayHost.tpl.txt +157 -0
  271. package/src/runtime/clientStreamMethods.tpl.txt +156 -148
  272. package/src/runtime/operationsStreamHelper.tpl.txt +6 -6
  273. package/src/runtime/streamXml.ts +49 -21
  274. package/dist/app/generateApp.d.ts.map +0 -1
  275. package/dist/cli.d.ts.map +0 -1
  276. package/dist/client/checkedDirectRuntime.d.ts.map +0 -1
  277. package/dist/client/directClientRuntime.d.ts.map +0 -1
  278. package/dist/client/directClientVersion.d.ts.map +0 -1
  279. package/dist/client/generateClient.d.ts.map +0 -1
  280. package/dist/client/generateDirectClient.d.ts.map +0 -1
  281. package/dist/client/generateOperations.d.ts.map +0 -1
  282. package/dist/client/generateTypes.d.ts.map +0 -1
  283. package/dist/client/generateUtils.d.ts.map +0 -1
  284. package/dist/compiler/buildCanonicalGraph.d.ts.map +0 -1
  285. package/dist/compiler/canonicalGraph.d.ts.map +0 -1
  286. package/dist/compiler/catalogErrors.d.ts.map +0 -1
  287. package/dist/compiler/catalogProvenance.d.ts.map +0 -1
  288. package/dist/compiler/checkedAssessment.d.ts.map +0 -1
  289. package/dist/compiler/checkedSourcePreparation.d.ts.map +0 -1
  290. package/dist/compiler/complexTypeContent.d.ts.map +0 -1
  291. package/dist/compiler/composeCanonicalGraph.d.ts.map +0 -1
  292. package/dist/compiler/dataOwnership.d.ts.map +0 -1
  293. package/dist/compiler/datatypeValues.d.ts.map +0 -1
  294. package/dist/compiler/directCodec.d.ts.map +0 -1
  295. package/dist/compiler/directExecutionPolicy.d.ts.map +0 -1
  296. package/dist/compiler/directOperation.d.ts.map +0 -1
  297. package/dist/compiler/directSoap.d.ts.map +0 -1
  298. package/dist/compiler/directSoapSource.d.ts.map +0 -1
  299. package/dist/compiler/directSourceCapsule.d.ts.map +0 -1
  300. package/dist/compiler/directStructure.d.ts.map +0 -1
  301. package/dist/compiler/directStructurePlan.d.ts.map +0 -1
  302. package/dist/compiler/directValues.d.ts.map +0 -1
  303. package/dist/compiler/finiteRe01Verification.d.ts.map +0 -1
  304. package/dist/compiler/generateCatalog.d.ts.map +0 -1
  305. package/dist/compiler/graphTraversal.d.ts.map +0 -1
  306. package/dist/compiler/hypotheticalScopedIdentity.d.ts.map +0 -1
  307. package/dist/compiler/occurrenceAnalysis.d.ts.map +0 -1
  308. package/dist/compiler/originalSourceMembership.d.ts.map +0 -1
  309. package/dist/compiler/particleAttribution.d.ts.map +0 -1
  310. package/dist/compiler/particleDeclarationConsistency.d.ts.map +0 -1
  311. package/dist/compiler/particleExtension.d.ts.map +0 -1
  312. package/dist/compiler/particleLocalAssessment.d.ts.map +0 -1
  313. package/dist/compiler/particleRestriction.d.ts.map +0 -1
  314. package/dist/compiler/particleSemanticView.d.ts.map +0 -1
  315. package/dist/compiler/particleWildcardRelation.d.ts.map +0 -1
  316. package/dist/compiler/re01CandidateCorrespondence.d.ts.map +0 -1
  317. package/dist/compiler/re01TypeProperties.d.ts.map +0 -1
  318. package/dist/compiler/re01TypePropertyValidation.d.ts.map +0 -1
  319. package/dist/compiler/resolveCanonicalGraph.d.ts.map +0 -1
  320. package/dist/compiler/scalarSchemaAssessment.d.ts.map +0 -1
  321. package/dist/compiler/schemaAttributeGroupProperties.d.ts.map +0 -1
  322. package/dist/compiler/schemaAttributeProperties.d.ts.map +0 -1
  323. package/dist/compiler/schemaAttributeUses.d.ts.map +0 -1
  324. package/dist/compiler/schemaBinaryWordReconstruction.d.ts.map +0 -1
  325. package/dist/compiler/schemaBuiltinFacets.d.ts.map +0 -1
  326. package/dist/compiler/schemaCalendarImages.d.ts.map +0 -1
  327. package/dist/compiler/schemaCalendarLanguage.d.ts.map +0 -1
  328. package/dist/compiler/schemaCompiler.d.ts.map +0 -1
  329. package/dist/compiler/schemaComponentEquality.d.ts.map +0 -1
  330. package/dist/compiler/schemaConstructionAssessment.d.ts.map +0 -1
  331. package/dist/compiler/schemaDatatypeValues.d.ts.map +0 -1
  332. package/dist/compiler/schemaDecimalLanguage.d.ts.map +0 -1
  333. package/dist/compiler/schemaDeclarationPrimitives.d.ts.map +0 -1
  334. package/dist/compiler/schemaDocumentSyntax.d.ts.map +0 -1
  335. package/dist/compiler/schemaDurationLanguage.d.ts.map +0 -1
  336. package/dist/compiler/schemaElementProperties.d.ts.map +0 -1
  337. package/dist/compiler/schemaEndpointWordCapacity.d.ts.map +0 -1
  338. package/dist/compiler/schemaExactCalendar.d.ts.map +0 -1
  339. package/dist/compiler/schemaFacetAnnotation.d.ts.map +0 -1
  340. package/dist/compiler/schemaGeneratedScalarShape.d.ts.map +0 -1
  341. package/dist/compiler/schemaIdentityConstraints.d.ts.map +0 -1
  342. package/dist/compiler/schemaIeeeLanguage.d.ts.map +0 -1
  343. package/dist/compiler/schemaIntegerImages.d.ts.map +0 -1
  344. package/dist/compiler/schemaLexicalPredicates.d.ts.map +0 -1
  345. package/dist/compiler/schemaNotationProperties.d.ts.map +0 -1
  346. package/dist/compiler/schemaNumericImageConditions.d.ts.map +0 -1
  347. package/dist/compiler/schemaParticleWildcardProperties.d.ts.map +0 -1
  348. package/dist/compiler/schemaPattern.d.ts.map +0 -1
  349. package/dist/compiler/schemaRegularLanguage.d.ts.map +0 -1
  350. package/dist/compiler/schemaScalarContext.d.ts.map +0 -1
  351. package/dist/compiler/schemaScalarKernel.d.ts.map +0 -1
  352. package/dist/compiler/schemaScalarWitnesses.d.ts.map +0 -1
  353. package/dist/compiler/schemaSimpleTypeProperties.d.ts.map +0 -1
  354. package/dist/compiler/schemaSourceGrammar.d.ts.map +0 -1
  355. package/dist/compiler/schemaSourceLexical.d.ts.map +0 -1
  356. package/dist/compiler/schemaSourceValues.d.ts.map +0 -1
  357. package/dist/compiler/schemaSourceWildcards.d.ts.map +0 -1
  358. package/dist/compiler/schemaSymbolicSequences.d.ts.map +0 -1
  359. package/dist/compiler/schemaSymbolicValueSets.d.ts.map +0 -1
  360. package/dist/compiler/schemaSyntaxAssessment.d.ts.map +0 -1
  361. package/dist/compiler/schemaTemporalAliases.d.ts.map +0 -1
  362. package/dist/compiler/schemaTokenImages.d.ts.map +0 -1
  363. package/dist/compiler/schemaTypeIdentity.d.ts.map +0 -1
  364. package/dist/compiler/schemaTypeRelations.d.ts.map +0 -1
  365. package/dist/compiler/schemaUri.d.ts.map +0 -1
  366. package/dist/compiler/schemaValueContext.d.ts.map +0 -1
  367. package/dist/compiler/schemaValueImages.d.ts.map +0 -1
  368. package/dist/compiler/schemaValueSequences.d.ts.map +0 -1
  369. package/dist/compiler/semanticBudget.d.ts.map +0 -1
  370. package/dist/compiler/semanticCatalog.d.ts.map +0 -1
  371. package/dist/compiler/semanticContext.d.ts.map +0 -1
  372. package/dist/compiler/semanticTypeDependencies.d.ts.map +0 -1
  373. package/dist/compiler/semanticTypeReference.d.ts.map +0 -1
  374. package/dist/compiler/shapeResolver.d.ts.map +0 -1
  375. package/dist/compiler/sourceSchemaBinding.d.ts.map +0 -1
  376. package/dist/compiler/structuralCompanions.d.ts.map +0 -1
  377. package/dist/compiler/validateSemanticGraph.d.ts.map +0 -1
  378. package/dist/compiler/wildcardAlgebra.d.ts.map +0 -1
  379. package/dist/config.d.ts.map +0 -1
  380. package/dist/gateway/generateGateway.d.ts.map +0 -1
  381. package/dist/gateway/generators.d.ts.map +0 -1
  382. package/dist/gateway/helpers.d.ts.map +0 -1
  383. package/dist/generation/preamble.d.ts.map +0 -1
  384. package/dist/generation/writeGeneratedSource.d.ts.map +0 -1
  385. package/dist/index.d.ts.map +0 -1
  386. package/dist/loader/fetch.d.ts.map +0 -1
  387. package/dist/loader/orderedSyntax.d.ts.map +0 -1
  388. package/dist/loader/resolutionDepth.d.ts.map +0 -1
  389. package/dist/loader/schemaInput.d.ts.map +0 -1
  390. package/dist/loader/schemaResources.d.ts.map +0 -1
  391. package/dist/loader/wsdlLoader.d.ts.map +0 -1
  392. package/dist/openapi/casing.d.ts.map +0 -1
  393. package/dist/openapi/generateOpenAPI.d.ts.map +0 -1
  394. package/dist/openapi/generatePaths.d.ts.map +0 -1
  395. package/dist/openapi/generateSchemas.d.ts.map +0 -1
  396. package/dist/openapi/security.d.ts.map +0 -1
  397. package/dist/pipeline.d.ts.map +0 -1
  398. package/dist/runtime/jsonArray.d.ts +0 -24
  399. package/dist/runtime/jsonArray.d.ts.map +0 -1
  400. package/dist/runtime/jsonArray.js +0 -52
  401. package/dist/runtime/ndjson.d.ts +0 -24
  402. package/dist/runtime/ndjson.d.ts.map +0 -1
  403. package/dist/runtime/ndjson.js +0 -30
  404. package/dist/runtime/streamXml.d.ts +0 -45
  405. package/dist/runtime/streamXml.d.ts.map +0 -1
  406. package/dist/runtime/streamXml.js +0 -212
  407. package/dist/test/generateTests.d.ts.map +0 -1
  408. package/dist/test/generators.d.ts.map +0 -1
  409. package/dist/test/mockData.d.ts.map +0 -1
  410. package/dist/util/attributeWildcards.d.ts.map +0 -1
  411. package/dist/util/builder.d.ts.map +0 -1
  412. package/dist/util/catalogMeta.d.ts.map +0 -1
  413. package/dist/util/cli.d.ts.map +0 -1
  414. package/dist/util/errors.d.ts.map +0 -1
  415. package/dist/util/imports.d.ts.map +0 -1
  416. package/dist/util/runtimeSource.d.ts.map +0 -1
  417. package/dist/util/securityConfig.d.ts.map +0 -1
  418. package/dist/util/streamConfig.d.ts.map +0 -1
  419. package/dist/util/tools.d.ts.map +0 -1
  420. package/dist/util/xmlWhitespace.d.ts.map +0 -1
  421. package/dist/xsd/primitives.d.ts.map +0 -1
  422. package/docs/AGENTS.md +0 -47
  423. package/docs/README.md +0 -69
  424. package/docs/architecture.md +0 -158
  425. package/docs/content-model-analysis.md +0 -92
  426. package/docs/content-model-baseline.md +0 -121
  427. package/docs/content-model-catalog.md +0 -116
  428. package/docs/content-model-companions.md +0 -90
  429. package/docs/content-model-composition.md +0 -103
  430. package/docs/content-model-decisions.md +0 -79
  431. package/docs/content-model-gateway-feasibility.md +0 -169
  432. package/docs/content-model-graph.md +0 -121
  433. package/docs/content-model-loading.md +0 -163
  434. package/docs/content-model-matching.md +0 -85
  435. package/docs/content-model-readiness.md +0 -144
  436. package/docs/content-model-resolution.md +0 -81
  437. package/docs/content-model-s02-handoff.md +0 -98
  438. package/docs/content-model-s06-au-01.md +0 -425
  439. package/docs/content-model-s06-dt-01.md +0 -386
  440. package/docs/content-model-s06-pw-01.md +0 -350
  441. package/docs/content-model-s06-re-01-resolver-implementation.md +0 -869
  442. package/docs/content-model-s06-re-01-resolver.md +0 -513
  443. package/docs/content-model-s06-re-01-scalar-witnesses.md +0 -1423
  444. package/docs/content-model-s06-re-01-support-reconstruction.md +0 -6337
  445. package/docs/content-model-s06-re-01.md +0 -7477
  446. package/docs/content-model-s06-research-handoff.md +0 -909
  447. package/docs/content-model-shipped-fix.md +0 -83
  448. package/docs/content-model-soap-feasibility.md +0 -165
  449. package/docs/decisions/001-test-generation.md +0 -36
  450. package/docs/decisions/002-streamable-responses.md +0 -332
  451. package/docs/decisions/003-content-model-contracts.md +0 -280
  452. package/docs/file-naming-and-path-organization.md +0 -213
  453. package/docs/reference-validation.md +0 -243
  454. package/docs/releases/README.md +0 -94
  455. package/docs/releases/v0.20.0.md +0 -22
  456. package/docs/releases/v0.21.0.md +0 -30
  457. package/docs/releases/v0.22.0.md +0 -30
  458. package/docs/releases/v0.23.0.md +0 -31
  459. package/docs/releases/v0.24.0.md +0 -38
  460. package/docs/releases/v0.25.0.md +0 -31
  461. package/docs/releases/v0.25.2.md +0 -32
  462. package/docs/releases/v0.26.0.md +0 -32
  463. package/docs/releases/v0.27.0.md +0 -31
  464. package/docs/releases/v0.28.0.md +0 -32
  465. package/docs/releases/v0.29.0.md +0 -32
  466. package/docs/releases/v0.30.0.md +0 -30
  467. package/docs/releases/v0.30.1.md +0 -31
  468. package/docs/releases/v0.30.2.md +0 -30
  469. package/docs/releases/v0.30.3.md +0 -33
  470. package/docs/releases/v0.31.0.md +0 -33
  471. package/docs/releases/v0.32.0.md +0 -33
  472. package/docs/releases/v0.33.0.md +0 -34
  473. package/docs/releases/v0.34.0.md +0 -30
  474. package/docs/releases/v0.35.0.md +0 -33
  475. package/docs/releases/v0.36.0.md +0 -32
  476. package/docs/releases/v0.37.0.md +0 -33
  477. package/docs/releases/v0.38.0.md +0 -35
  478. package/docs/releases/v0.39.0.md +0 -35
  479. package/docs/releases/v0.40.0.md +0 -45
  480. package/docs/releases/v0.40.1.md +0 -34
  481. package/docs/releases/v1.0.0.md +0 -42
  482. package/docs/releases/v1.0.1.md +0 -38
  483. package/docs/releases/v1.0.2.md +0 -51
  484. package/docs/releases/v1.0.3.md +0 -37
  485. package/docs/releases/v1.0.4.md +0 -45
  486. package/docs/releases/v1.0.5.md +0 -41
  487. package/docs/releases/v1.0.6.md +0 -35
  488. package/docs/releases/v1.0.7.md +0 -36
  489. package/docs/releases/v1.1.0.md +0 -42
  490. package/docs/releases/v1.1.1.md +0 -44
  491. package/docs/releases/v1.1.2.md +0 -42
  492. package/docs/releases/v1.1.3.md +0 -36
  493. package/docs/releases/v1.1.4.md +0 -36
  494. package/docs/releases/v1.1.5.md +0 -38
  495. package/docs/roadmap/README.md +0 -107
  496. package/docs/roadmap/v1.0-capability-conformance-framework.md +0 -582
  497. package/docs/roadmap/v1.0-choice-union-mode.md +0 -90
  498. package/docs/roadmap/v1.0-contract-audit.md +0 -75
  499. package/docs/roadmap/v1.0-json-array-streaming.md +0 -101
  500. package/docs/roadmap/v1.0-openapi-fastify-compatibility.md +0 -99
  501. package/docs/roadmap/v1.0-release-candidate-gates.md +0 -92
  502. package/docs/roadmap/v1.0-wsdl-coverage-matrix.md +0 -200
  503. package/docs/roadmap/v1.0-xs-anyattribute-wildcard-bag.md +0 -932
  504. package/src/runtime/jsonArray.ts +0 -55
  505. package/src/runtime/ndjson.ts +0 -32
@@ -1,18 +1,21 @@
1
1
  import { isApplicationUnmetered } from './semanticBudget.js';
2
2
  import { directDataOwnership, directLimit } from './directExecutionPolicy.js';
3
- /** Internal, one-retained-operation, unauthenticated loopback SOAP 1.1 adapter. */
3
+ /** Shared retained-operation SOAP 1.1 exchange; profile-specific authority stays explicit. */
4
4
  import { checkSemanticBudget } from './semanticBudget.js';
5
5
  import { DataOwnershipLimitError } from './dataOwnership.js';
6
6
  import { Agent } from 'node:http';
7
+ import { Agent as HttpsAgent } from 'node:https';
7
8
  import { types } from 'node:util';
8
9
  import { WSDL } from 'soap/lib/wsdl/index.js';
9
10
  import { Client } from 'soap/lib/client.js';
10
11
  import { HttpClient } from 'soap/lib/http.js';
11
12
  import { inspectDirectOperation } from './directOperation.js';
12
- import { createDirectValueMapping, inspectDirectValueMapping } from './directValues.js';
13
- import { decodeDirectXml, encodeDirectXml, DIRECT_XML_LIMITS } from './directCodec.js';
14
- import { prepareDirectSoapSource, DirectSoapSourceError } from './directSoapSource.js';
15
- import { isXmlNCName, resolveLexicalQName, SchemaLoadingError } from '../loader/orderedSyntax.js';
13
+ import { createDirectValueMapping, inspectDirectValueMapping, createComponentDirectionalMapping, inspectComponentValueMapping } from './directValues.js';
14
+ import { decodeDirectXml, encodeDirectXml, decodeComponentXml, encodeComponentXml, DIRECT_XML_LIMITS } from './directCodec.js';
15
+ import { prepareDirectSoapSource, prepareComponentSoapWsdl, DirectSoapSourceError } from './directSoapSource.js';
16
+ import { isXmlNCName, resolveLexicalQName, SchemaLoadingError, syntaxElements, syntaxAttribute, WSDL_NAMESPACE } from '../loader/orderedSyntax.js';
17
+ import { decodeComponentRecordXml, inspectComponentRecordProjection } from './componentRecordProjection.js';
18
+ import { assessComponentSoapHeader } from './soapHeaders.js';
16
19
  const SOAP = 'http://schemas.xmlsoap.org/soap/envelope/';
17
20
  class Stop extends Error {
18
21
  kind;
@@ -25,11 +28,11 @@ class Stop extends Error {
25
28
  }
26
29
  const same = (a, b) => a.namespace === b.namespace && a.local === b.local;
27
30
  /** Shared entry guard: consumers must call before reading any SOAP option. */
28
- export function directSoapOptionsShape(options, check) {
31
+ export function directSoapOptionsShape(options, check, additional = []) {
29
32
  if (!options || typeof options !== 'object' || types.isProxy(options)
30
33
  || ![null, Object.prototype].includes(Object.getPrototypeOf(options)))
31
34
  return 'data-only SOAP options required';
32
- const allowed = new Set(['service', 'port', 'endpoint', 'allowEndpoint', 'signal', 'timeoutMs', 'limits', 'capabilities']);
35
+ const allowed = new Set(['service', 'port', 'endpoint', 'allowEndpoint', 'signal', 'timeoutMs', 'limits', 'capabilities', ...additional]);
33
36
  for (const key of Reflect.ownKeys(options)) {
34
37
  check();
35
38
  const descriptor = Object.getOwnPropertyDescriptor(options, key);
@@ -40,12 +43,58 @@ export function directSoapOptionsShape(options, check) {
40
43
  }
41
44
  /** Authentication and fresh-value validation precede dependency bootstrap and all HTTP I/O. */
42
45
  export async function exchangeDirectSoap(contract, inputMapping, application, options) {
43
- const { context, source } = inspectDirectOperation(contract);
44
46
  const input = inspectDirectValueMapping(inputMapping, contract);
47
+ return exchangeSoap(contract, input, application, options, {
48
+ component: false, encode: encodeDirectXml, decode: decodeDirectXml, create: createDirectValueMapping,
49
+ prepare: async (selection, check) => {
50
+ const { source } = inspectDirectOperation(contract);
51
+ const { wsdlText } = prepareDirectSoapSource(contract, selection, check);
52
+ const wsdl = new WSDL(wsdlText, source.root.uri, { wsdl_options: { overrideImportLocation: () => { throw new Stop('unsupported', 'dependency import forbidden'); } } });
53
+ await new Promise((resolve, reject) => wsdl.onReady(error => error ? reject(error) : resolve()));
54
+ return wsdl;
55
+ },
56
+ });
57
+ }
58
+ export async function exchangeComponentSoap(contract, inputMapping, application, options, responseProjection) {
59
+ const { mapping: input } = inspectComponentValueMapping(inputMapping, contract);
60
+ if (responseProjection !== undefined) {
61
+ inspectComponentRecordProjection(responseProjection, contract);
62
+ return exchangeSoap(contract, input, application, options, {
63
+ component: true,
64
+ encode(owner, mapping, value, controls) {
65
+ if (mapping.kind !== 'component-mapping')
66
+ throw new TypeError('SOAP input requires the native input mapping');
67
+ return encodeComponentXml(owner, mapping, value, controls);
68
+ },
69
+ decode(owner, mapping, bytes, controls) {
70
+ if (mapping.kind === 'component-record-projection')
71
+ return decodeComponentRecordXml(owner, mapping, bytes, controls);
72
+ return decodeComponentXml(owner, mapping, bytes, { ...controls, selectPayload(root) {
73
+ const selected = controls.selectPayload(root);
74
+ if (selected.mapping.kind !== 'component-mapping')
75
+ throw new TypeError('Normal component decoding requires its exact mapping');
76
+ return { payload: selected.payload, mapping: selected.mapping };
77
+ } });
78
+ },
79
+ create(owner, direction, controls) {
80
+ return direction.kind === 'output' ? responseProjection : createComponentDirectionalMapping(owner, input, direction, controls);
81
+ },
82
+ prepare: (selection, check) => prepareComponentSoapWsdl(contract, selection, check),
83
+ });
84
+ }
85
+ return exchangeSoap(contract, input, application, options, {
86
+ component: true, encode: encodeComponentXml, decode: decodeComponentXml,
87
+ create: (owner, direction, controls) => createComponentDirectionalMapping(owner, input, direction, controls),
88
+ prepare: (selection, check) => prepareComponentSoapWsdl(contract, selection, check),
89
+ });
90
+ }
91
+ async function exchangeSoap(contract, input, application, options, profile) {
92
+ const { context } = inspectDirectOperation(contract);
45
93
  if (input.direction.kind !== 'input')
46
94
  throw new TypeError('SOAP request requires the exact input mapping');
47
95
  const { budget } = context;
48
- const fail = (kind, rule) => Object.freeze({ kind, rule, usage: Object.freeze({ ...budget.usage() }) });
96
+ const fail = (kind, rule, phase) => Object.freeze({ kind, rule,
97
+ ...(profile.component && phase ? { phase } : {}), usage: Object.freeze({ ...budget.usage() }) });
49
98
  let signal;
50
99
  const check = () => { checkSemanticBudget(budget); if (signal?.aborted)
51
100
  throw new Stop('cancelled', 'cooperative-cancellation'); };
@@ -58,7 +107,7 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
58
107
  check();
59
108
  // Options are a closed capability surface. Never silently discard security,
60
109
  // headers, endpoint agents, redirects, streaming or other caller extensions.
61
- const optionRule = directSoapOptionsShape(options, check);
110
+ const optionRule = directSoapOptionsShape(options, check, profile.component ? ['ca'] : []);
62
111
  if (optionRule)
63
112
  return fail('unsupported', optionRule);
64
113
  signal = options.signal;
@@ -66,8 +115,20 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
66
115
  return fail('unsupported', 'native AbortSignal required');
67
116
  const allowEndpoint = options.allowEndpoint;
68
117
  check();
69
- const config = directDataOwnership(budget).freeze(directDataOwnership(budget).snapshot({ service: options.service, port: options.port, endpoint: options.endpoint,
70
- timeoutMs: options.timeoutMs ?? (isApplicationUnmetered(budget) ? 0 : 15_000), limits: options.limits ?? {}, capabilities: options.capabilities ?? [] }));
118
+ let selectedEndpoint = options.endpoint;
119
+ if (profile.component && selectedEndpoint === undefined) {
120
+ const { source } = inspectDirectOperation(contract);
121
+ const services = source.documents.flatMap(d => syntaxElements(d.root, WSDL_NAMESPACE, 'service').filter(n => syntaxAttribute(d.root, 'targetNamespace') === options.service?.namespace && syntaxAttribute(n, 'name') === options.service?.local));
122
+ const ports = services.flatMap(n => syntaxElements(n, WSDL_NAMESPACE, 'port').filter(p => syntaxAttribute(p, 'name') === options.port));
123
+ const addresses = ports.flatMap(p => syntaxElements(p, 'http://schemas.xmlsoap.org/wsdl/soap/', 'address'));
124
+ if (services.length !== 1 || ports.length !== 1 || addresses.length !== 1 || !syntaxAttribute(addresses[0], 'location')) {
125
+ return fail('unsupported', 'Select one SOAP service/port address or supply an endpoint override');
126
+ }
127
+ selectedEndpoint = syntaxAttribute(addresses[0], 'location');
128
+ }
129
+ const config = directDataOwnership(budget).freeze(directDataOwnership(budget).snapshot({ service: options.service, port: options.port, endpoint: selectedEndpoint,
130
+ timeoutMs: options.timeoutMs ?? (profile.component || isApplicationUnmetered(budget) ? 0 : 15_000), limits: options.limits ?? {},
131
+ ca: options.ca, capabilities: options.capabilities ?? [] }));
71
132
  if (!Array.isArray(config.capabilities) || config.capabilities.length)
72
133
  return fail('unsupported', 'SOAP capability');
73
134
  if (!Number.isSafeInteger(config.timeoutMs) || config.timeoutMs < 0 || config.timeoutMs > 2_147_483_647)
@@ -81,62 +142,107 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
81
142
  if (typeof config.endpoint !== 'string' || typeof config.port !== 'string' || !isXmlNCName(config.port)
82
143
  || !config.service || typeof config.service.namespace !== 'string' || !isXmlNCName(config.service.local))
83
144
  return fail('unsupported', 'explicit SOAP selection');
84
- const endpoint = new URL(config.endpoint);
85
- if (endpoint.protocol !== 'http:' || endpoint.hostname !== '127.0.0.1' || !endpoint.port || endpoint.port === '1'
145
+ let endpoint;
146
+ try {
147
+ endpoint = new URL(config.endpoint);
148
+ }
149
+ catch {
150
+ return fail('unsupported', 'explicit HTTP(S) endpoint required');
151
+ }
152
+ if (profile.component) {
153
+ if (!['http:', 'https:'].includes(endpoint.protocol) || endpoint.username || endpoint.password || endpoint.hash || endpoint.search)
154
+ return fail('unsupported', 'explicit HTTP(S) endpoint required');
155
+ if (config.ca !== undefined && (typeof config.ca !== 'string' || endpoint.protocol !== 'https:'))
156
+ return fail('unsupported', 'HTTPS PEM trust anchor required');
157
+ const policy = contract.policy;
158
+ if (!policy)
159
+ return fail('unsupported', 'component policy authority required');
160
+ if (policy.kind === 'https-transport') {
161
+ if (endpoint.protocol !== 'https:')
162
+ return fail('unsupported', 'policy requires HTTPS');
163
+ if (policy.requireClientCertificate || policy.includeTimestamp || !['Strict', 'Lax'].includes(policy.layout))
164
+ return fail('unsupported', 'message security or client certificate capability required');
165
+ }
166
+ }
167
+ else if (endpoint.protocol !== 'http:' || endpoint.hostname !== '127.0.0.1' || !endpoint.port || endpoint.port === '1'
86
168
  || endpoint.username || endpoint.password || endpoint.hash || endpoint.search)
87
169
  return fail('unsupported', 'owned loopback HTTP endpoint required');
88
- if (typeof allowEndpoint !== 'function' || allowEndpoint(new URL(endpoint.href)) !== true)
170
+ if (!(profile.component && allowEndpoint === undefined)
171
+ && (typeof allowEndpoint !== 'function' || allowEndpoint(new URL(endpoint.href)) !== true))
89
172
  return fail('unsupported', 'endpoint authorization');
90
173
  const action = contract.binding.action;
174
+ const rpc = contract.binding.style === 'rpc';
91
175
  if (/[^\x20-\x21\x23-\x7e]|\\/.test(action))
92
176
  return fail('unsupported', 'unsafe SOAPAction');
93
- const { wsdlText } = prepareDirectSoapSource(contract, config, check);
94
177
  const elements = (node) => {
95
178
  check();
96
179
  return node.children.filter((child) => child.kind === 'element');
97
180
  };
98
- const encoded = encodeDirectXml(contract, input, application, { signal, limits });
99
- if (encoded.kind !== 'direct-encoded')
100
- return fail(encoded.kind, encoded.rule);
101
- const output = createDirectValueMapping(contract, { kind: 'output' }, { signal });
102
- if (output.kind !== 'direct-mapping')
181
+ const encoded = profile.encode(contract, input, application, { signal, limits });
182
+ if (!('bytes' in encoded))
183
+ return fail(encoded.kind, encoded.rule, 'input');
184
+ const output = profile.create(contract, { kind: 'output' }, { signal });
185
+ if (!('direction' in output))
103
186
  return fail(output.kind, output.rule);
104
187
  const faults = new Map();
105
188
  for (const fault of contract.faults) {
106
189
  check();
107
- const mapping = createDirectValueMapping(contract, { kind: 'fault', name: fault.name }, { signal });
108
- if (mapping.kind !== 'direct-mapping')
190
+ const mapping = profile.create(contract, { kind: 'fault', name: fault.name }, { signal });
191
+ if (!('direction' in mapping))
109
192
  return fail(mapping.kind, mapping.rule);
110
193
  faults.set(fault.name, mapping);
111
194
  }
112
- const shape = (node) => {
195
+ const shape = (node, encodedScope = false) => {
113
196
  const children = elements(node);
114
- if (node.attributes.length || node.children.some(n => n.kind === 'text' && /[^\t\r\n ]/.test(n.value)))
197
+ if (node.attributes.some(a => !(encodedScope && a.name.namespace === SOAP && a.name.local === 'encodingStyle'
198
+ && a.value === 'http://schemas.xmlsoap.org/soap/encoding/')) || node.children.some(n => n.kind === 'text' && /[^\t\r\n ]/.test(n.value)))
115
199
  stop('protocol', 'SOAP protocol attributes or text');
116
200
  return children;
117
201
  };
118
- const bodyRoot = (root) => {
202
+ const ignoredHeaders = [];
203
+ const bodyRoot = (root, incoming = false) => {
119
204
  if (!same(root.name, { namespace: SOAP, local: 'Envelope' }))
120
205
  stop('protocol', 'SOAP 1.1 Envelope required');
121
- const children = shape(root);
206
+ const children = shape(root, rpc);
122
207
  if (children[0]?.name.namespace === SOAP && children[0].name.local === 'Header') {
123
- if (shape(children[0]).length)
208
+ if (profile.component && incoming) {
209
+ const assessed = assessComponentSoapHeader(children[0], check);
210
+ if (assessed.kind !== 'ignored-optional-headers')
211
+ stop(assessed.kind, assessed.rule);
212
+ else
213
+ for (const name of assessed.headers) {
214
+ check();
215
+ ignoredHeaders.push(name);
216
+ }
217
+ }
218
+ else if (shape(children[0]).length)
124
219
  stop('unsupported', 'incoming SOAP headers');
125
220
  children.shift();
126
221
  }
127
222
  if (children.length !== 1 || !same(children[0].name, { namespace: SOAP, local: 'Body' }))
128
223
  stop('protocol', 'one SOAP Body required');
129
- const body = shape(children[0]);
224
+ const body = shape(children[0], rpc);
225
+ if (rpc && !body.some(n => same(n.name, { namespace: SOAP, local: 'Fault' })))
226
+ return children[0];
130
227
  if (body.length !== 1)
131
228
  stop('protocol', 'one SOAP Body payload required');
132
229
  return body[0];
133
230
  };
134
- // The native dependency receives only the explicitly byte-bounded source.
135
- const wsdl = new WSDL(wsdlText, source.root.uri, { wsdl_options: { overrideImportLocation: () => { throw new Stop('unsupported', 'dependency import forbidden'); } } });
136
- await new Promise((resolve, reject) => wsdl.onReady(error => error ? reject(error) : resolve()));
231
+ const wsdl = await profile.prepare(config, check);
137
232
  check();
233
+ // @why node-soap's RPC writer would wrap `_xml` as a parameter. This private
234
+ // instance retains its selected method/transport while native bytes own RPC construction.
235
+ const rpcArguments = Object.freeze({});
236
+ if (rpc)
237
+ wsdl.objectToRpcXML = (name, args) => {
238
+ check();
239
+ if (name !== contract.selector.operation || args !== rpcArguments)
240
+ stop('protocol', 'dependency RPC selection mismatch');
241
+ return Buffer.from(encoded.bytes).toString('utf8');
242
+ };
138
243
  // HTTP and codec byte limits bound buffering and output copies directly.
139
- agent = new Agent({ keepAlive: false, maxSockets: 1 });
244
+ agent = endpoint.protocol === 'https:' ? new HttpsAgent({ keepAlive: false, maxSockets: 1, rejectUnauthorized: true,
245
+ ...(config.ca === undefined ? {} : { ca: config.ca }) }) : new Agent({ keepAlive: false, maxSockets: 1 });
140
246
  controller = new AbortController();
141
247
  signal?.addEventListener('abort', abort, { once: true });
142
248
  let timedOut = false;
@@ -153,9 +259,9 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
153
259
  stop('protocol', 'dependency dispatch mismatch');
154
260
  if (Buffer.byteLength(data) > limits.maxBytes)
155
261
  stop('resource-limit', 'SOAP request byte limit');
156
- const outgoing = decodeDirectXml(contract, input, Buffer.from(data), { signal, limits,
262
+ const outgoing = profile.decode(contract, input, Buffer.from(data), { signal, limits,
157
263
  uri: 'urn:typescript-wsdl-client:outgoing-soap', selectPayload: root => ({ payload: bodyRoot(root), mapping: input }) });
158
- if (outgoing.kind !== 'direct-decoded')
264
+ if (!('validated' in outgoing))
159
265
  stop(outgoing.kind, outgoing.rule);
160
266
  check();
161
267
  }
@@ -185,7 +291,7 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
185
291
  // xmlToObject, including its special err.response parsing path.
186
292
  callback(complete);
187
293
  }, headers, { responseType: 'arraybuffer', decompress: false, maxRedirects: 0, maxContentLength: limits.maxBytes,
188
- maxBodyLength: limits.maxBytes, proxy: false, httpAgent: agent, signal: controller.signal, timeout: config.timeoutMs });
294
+ maxBodyLength: limits.maxBytes, proxy: false, httpAgent: agent, httpsAgent: agent, signal: controller.signal, timeout: config.timeoutMs });
189
295
  }
190
296
  }
191
297
  const client = new Client(wsdl, endpoint.href, { httpClient: new BufferedHttp() });
@@ -198,7 +304,7 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
198
304
  if (typeof method !== 'function')
199
305
  return fail('unsupported', 'dependency selected method unavailable');
200
306
  check();
201
- await new Promise((resolve, reject) => method({ _xml: Buffer.from(encoded.bytes).toString('utf8') }, (error) => error === complete ? resolve() : reject(error), {}, { SOAPAction: `"${action}"` }));
307
+ await new Promise((resolve, reject) => method(rpc ? rpcArguments : { _xml: Buffer.from(encoded.bytes).toString('utf8') }, (error) => error === complete ? resolve() : reject(error), {}, { SOAPAction: `"${action}"` }));
202
308
  check();
203
309
  if (timedOut)
204
310
  return fail('transport', 'SOAP deadline exceeded');
@@ -209,21 +315,24 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
209
315
  const observed = response;
210
316
  if (observed.encoding && observed.encoding.toLowerCase() !== 'identity')
211
317
  return fail('unsupported', 'HTTP compression');
212
- const media = /^text\/xml(?:\s*;\s*charset\s*=\s*(?:"(utf-8|utf-16|utf-16le|utf-16be)"|(utf-8|utf-16|utf-16le|utf-16be)))?\s*$/i.exec(observed.contentType);
318
+ const media = /^text\/xml(?:\s*;\s*charset\s*=\s*(?:"(utf-8|utf-16|utf-16le|utf-16be|iso-8859-1)"|(utf-8|utf-16|utf-16le|utf-16be|iso-8859-1)))?\s*$/i.exec(observed.contentType);
213
319
  if (!media)
214
320
  return fail('protocol', 'SOAP response Content-Type');
215
321
  if (observed.status !== 200 && observed.status !== 500)
216
322
  return fail('transport', 'SOAP HTTP status');
217
323
  // Header charset is a protocol assertion, checked against actual BOM bytes.
218
324
  const charset = (media[1] ?? media[2])?.toLowerCase();
325
+ if (!profile.component && charset === 'iso-8859-1')
326
+ return fail('protocol', 'SOAP response Content-Type');
219
327
  const bom = observed.bytes[0] === 0xff && observed.bytes[1] === 0xfe ? 'utf-16le'
220
328
  : observed.bytes[0] === 0xfe && observed.bytes[1] === 0xff ? 'utf-16be' : 'utf-8';
221
- if (charset && charset !== bom && !(charset === 'utf-16' && bom.startsWith('utf-16')))
329
+ if (!profile.component && charset && charset !== bom && !(charset === 'utf-16' && bom.startsWith('utf-16')))
222
330
  return fail('protocol', 'SOAP charset disagrees with bytes');
223
331
  let faultInfo;
224
- const decoded = decodeDirectXml(contract, output, observed.bytes, { signal, limits, uri: endpoint.href,
332
+ const decoded = profile.decode(contract, output, observed.bytes, { signal, limits, uri: endpoint.href,
333
+ ...(profile.component ? { componentResponseEncoding: { charset } } : {}),
225
334
  selectPayload: root => {
226
- const payload = bodyRoot(root);
335
+ const payload = bodyRoot(root, true);
227
336
  if (!same(payload.name, { namespace: SOAP, local: 'Fault' })) {
228
337
  if (observed.status !== 200)
229
338
  stop('protocol', 'HTTP 500 requires SOAP Fault');
@@ -261,12 +370,13 @@ export async function exchangeDirectSoap(contract, inputMapping, application, op
261
370
  directDataOwnership(budget).freeze(faultInfo);
262
371
  return { payload: detail[0], mapping: faults.get(faultInfo.name) };
263
372
  } });
264
- if (decoded.kind !== 'direct-decoded')
265
- return fail(decoded.kind, decoded.rule);
373
+ if (!('validated' in decoded))
374
+ return fail(decoded.kind, decoded.rule, 'response');
266
375
  check();
267
376
  check();
268
377
  return Object.freeze({ kind: faultInfo ? 'soap-fault' : 'soap-response', admitted: false, decoded,
269
- responseBytes: new Uint8Array(observed.bytes), status: observed.status, ...(faultInfo ? { fault: faultInfo } : {}), usage: Object.freeze({ ...budget.usage() }) });
378
+ responseBytes: new Uint8Array(observed.bytes), status: observed.status, ...(faultInfo ? { fault: faultInfo } : {}),
379
+ ...(ignoredHeaders.length ? { ignoredHeaders: Object.freeze(ignoredHeaders) } : {}), usage: Object.freeze({ ...budget.usage() }) });
270
380
  }
271
381
  catch (error) {
272
382
  if (budget.exhausted())
@@ -1,5 +1,6 @@
1
1
  import type { DirectOperationContract } from './directOperation.js';
2
2
  import type { ExpandedName } from '../loader/orderedSyntax.js';
3
+ import { WSDL } from 'soap/lib/wsdl/index.js';
3
4
  export declare const DIRECT_SOAP_SOURCE_MAX_BYTES: number;
4
5
  export declare class DirectSoapSourceError extends Error {
5
6
  readonly kind: 'unsupported' | 'resource-limit';
@@ -12,4 +13,26 @@ export declare function prepareDirectSoapSource(contract: DirectOperationContrac
12
13
  original: Uint8Array<ArrayBufferLike>;
13
14
  wsdlText: string;
14
15
  };
15
- //# sourceMappingURL=directSoapSource.d.ts.map
16
+ /** Check each native operation before sharing its source metadata.
17
+ * @param contract Authentic component operation.
18
+ * @param config Exact service and port.
19
+ * @param check Invocation cancellation/resource checks.
20
+ * @returns No metadata or portable authority.
21
+ * @throws For foreign handles, unsupported source profile, action or selection.
22
+ */
23
+ export declare function validateComponentSoapSelection(contract: DirectOperationContract, config: {
24
+ service: ExpandedName;
25
+ port: string;
26
+ }, check: () => void): void;
27
+ /** Build the existing SOAP dependency from the exact authorized snapshot, with no file/network import fallback.
28
+ * @remarks Acyclic metadata resources are decoded independently under the native metadata policy. Original bytes and native semantics
29
+ * are unchanged. The dependency receives private aliases and a fresh prefilled cache; its import hook accepts only
30
+ * unambiguous native source edges to already prepared resources. This grants no endpoint or policy enforcement.
31
+ * @returns A prepared node-soap WSDL for the exact original service/port/binding.
32
+ * @throws DirectSoapSourceError For incompatible source/profile, unsafe dependency names, cycles or ambiguous imports.
33
+ * Caller cancellation/resource exceptions propagate unchanged.
34
+ */
35
+ export declare function prepareComponentSoapWsdl(contract: DirectOperationContract, config: {
36
+ service: ExpandedName;
37
+ port: string;
38
+ }, check: () => void): Promise<WSDL>;
@@ -2,7 +2,9 @@ import { directLimit } from './directExecutionPolicy.js';
2
2
  /** Shared authenticated single-resource SOAP bootstrap policy; no transport. */
3
3
  import { inspectDirectOperation } from './directOperation.js';
4
4
  import { copyOriginalSchemaResource } from '../loader/schemaInput.js';
5
- import { resolveLexicalQName, syntaxAttribute, WSDL_NAMESPACE, XSD_NAMESPACE } from '../loader/orderedSyntax.js';
5
+ import { decodeMetadataXml, resolveLexicalQName, syntaxAttribute, WSDL_NAMESPACE, XSD_NAMESPACE } from '../loader/orderedSyntax.js';
6
+ import { WSDL } from 'soap/lib/wsdl/index.js';
7
+ import { normalizeWhitespace } from './datatypeValues.js';
6
8
  const WSDL_SOAP = 'http://schemas.xmlsoap.org/wsdl/soap/';
7
9
  const same = (a, b) => a.namespace === b.namespace && a.local === b.local;
8
10
  export const DIRECT_SOAP_SOURCE_MAX_BYTES = 64 * 1024;
@@ -13,6 +15,26 @@ export class DirectSoapSourceError extends Error {
13
15
  this.kind = kind;
14
16
  }
15
17
  }
18
+ function validateSoapSelection(source, contract, config, check) {
19
+ const elements = (node) => { check(); return node.children.filter((child) => child.kind === 'element'); };
20
+ const definitions = source.root.root;
21
+ if (definitions.name.namespace !== WSDL_NAMESPACE || definitions.name.local !== 'definitions')
22
+ throw new DirectSoapSourceError('WSDL definitions required');
23
+ const services = elements(definitions).filter(n => n.name.namespace === WSDL_NAMESPACE && n.name.local === 'service'
24
+ && same({ namespace: syntaxAttribute(definitions, 'targetNamespace') ?? '', local: syntaxAttribute(n, 'name') ?? '' }, config.service));
25
+ if (services.length !== 1)
26
+ throw new DirectSoapSourceError('SOAP service mismatch');
27
+ const ports = elements(services[0]).filter(n => n.name.namespace === WSDL_NAMESPACE && n.name.local === 'port' && syntaxAttribute(n, 'name') === config.port);
28
+ if (ports.length !== 1)
29
+ throw new DirectSoapSourceError('SOAP port mismatch');
30
+ const binding = syntaxAttribute(ports[0], 'binding');
31
+ if (!binding || !same(resolveLexicalQName(binding, ports[0]), contract.selector.binding))
32
+ throw new DirectSoapSourceError('SOAP binding mismatch');
33
+ const addresses = elements(ports[0]).filter(n => n.name.namespace === WSDL_SOAP && n.name.local === 'address');
34
+ if (addresses.length !== 1 || elements(ports[0]).some(n => !(n.name.namespace === WSDL_SOAP && n.name.local === 'address')
35
+ && !(n.name.namespace === WSDL_NAMESPACE && n.name.local === 'documentation')))
36
+ throw new DirectSoapSourceError('SOAP port extension');
37
+ }
16
38
  export function prepareDirectSoapSource(contract, config, check) {
17
39
  const { source, context: { budget } } = inspectDirectOperation(contract);
18
40
  if (source.resources.some(r => r.byteLength > directLimit(budget, DIRECT_SOAP_SOURCE_MAX_BYTES))) {
@@ -53,24 +75,8 @@ export function prepareDirectSoapSource(contract, config, check) {
53
75
  inspectSource(child);
54
76
  };
55
77
  inspectSource(source.root.root);
56
- const definitions = source.root.root;
57
- if (definitions.name.namespace !== WSDL_NAMESPACE || definitions.name.local !== 'definitions')
58
- throw new DirectSoapSourceError('WSDL definitions required');
59
- const services = elements(definitions).filter(n => n.name.namespace === WSDL_NAMESPACE && n.name.local === 'service'
60
- && same({ namespace: syntaxAttribute(definitions, 'targetNamespace') ?? '', local: syntaxAttribute(n, 'name') ?? '' }, config.service));
61
- if (services.length !== 1)
62
- throw new DirectSoapSourceError('SOAP service mismatch');
63
- const ports = elements(services[0]).filter(n => n.name.namespace === WSDL_NAMESPACE && n.name.local === 'port' && syntaxAttribute(n, 'name') === config.port);
64
- if (ports.length !== 1)
65
- throw new DirectSoapSourceError('SOAP port mismatch');
66
- const binding = syntaxAttribute(ports[0], 'binding');
67
- if (!binding || !same(resolveLexicalQName(binding, ports[0]), contract.selector.binding))
68
- throw new DirectSoapSourceError('SOAP binding mismatch');
69
- const addresses = elements(ports[0]).filter(n => n.name.namespace === WSDL_SOAP && n.name.local === 'address');
70
- if (addresses.length !== 1 || elements(ports[0]).some(n => !(n.name.namespace === WSDL_SOAP && n.name.local === 'address')
71
- && !(n.name.namespace === WSDL_NAMESPACE && n.name.local === 'documentation')))
72
- throw new DirectSoapSourceError('SOAP port extension');
73
- const original = copyOriginalSchemaResource(source, source.root.uri, amount => { check(); });
78
+ validateSoapSelection(source, contract, config, check);
79
+ const original = copyOriginalSchemaResource(source, source.root.uri, () => { check(); });
74
80
  // This packet admits UTF-8 source bootstrap only; response encoding remains
75
81
  // owned by the existing strict XML byte decoder.
76
82
  let wsdlText;
@@ -84,3 +90,144 @@ export function prepareDirectSoapSource(contract, config, check) {
84
90
  throw new DirectSoapSourceError('UTF-8 WSDL bootstrap required');
85
91
  return { original, wsdlText };
86
92
  }
93
+ /** Check each native operation before sharing its source metadata.
94
+ * @param contract Authentic component operation.
95
+ * @param config Exact service and port.
96
+ * @param check Invocation cancellation/resource checks.
97
+ * @returns No metadata or portable authority.
98
+ * @throws For foreign handles, unsupported source profile, action or selection.
99
+ */
100
+ export function validateComponentSoapSelection(contract, config, check) {
101
+ const { source } = inspectDirectOperation(contract);
102
+ check();
103
+ if (contract.basis !== 'native-component-premises-v1' || contract.correspondence !== 'dated-XSD-2004-components-v1')
104
+ throw new DirectSoapSourceError('Component source profile required');
105
+ if (/[^\x20-\x21\x23-\x7e]|\\/.test(contract.binding.action))
106
+ throw new DirectSoapSourceError('unsafe SOAPAction');
107
+ validateSoapSelection(source, contract, config, check);
108
+ }
109
+ /** Build the existing SOAP dependency from the exact authorized snapshot, with no file/network import fallback.
110
+ * @remarks Acyclic metadata resources are decoded independently under the native metadata policy. Original bytes and native semantics
111
+ * are unchanged. The dependency receives private aliases and a fresh prefilled cache; its import hook accepts only
112
+ * unambiguous native source edges to already prepared resources. This grants no endpoint or policy enforcement.
113
+ * @returns A prepared node-soap WSDL for the exact original service/port/binding.
114
+ * @throws DirectSoapSourceError For incompatible source/profile, unsafe dependency names, cycles or ambiguous imports.
115
+ * Caller cancellation/resource exceptions propagate unchanged.
116
+ */
117
+ export async function prepareComponentSoapWsdl(contract, config, check) {
118
+ const { source, context: { budget } } = inspectDirectOperation(contract);
119
+ validateComponentSoapSelection(contract, config, check);
120
+ const refuse = (rule) => { throw new DirectSoapSourceError(rule); };
121
+ const nodes = new Map(), dependencySyntax = new Set();
122
+ const key = (uri, path) => JSON.stringify([uri, path]);
123
+ for (const edge of source.edges) {
124
+ check();
125
+ dependencySyntax.add(key(edge.source.uri, edge.source.path));
126
+ }
127
+ for (const document of source.documents) {
128
+ const pending = [document.root];
129
+ while (pending.length) {
130
+ check();
131
+ const node = pending.pop();
132
+ budget.chargeWork(32 + node.children.length * 8 + node.attributes.length * 16);
133
+ const identity = key(node.source.uri, node.source.path);
134
+ nodes.set(identity, node);
135
+ if (['import', 'include', 'redefine'].includes(node.name.local) && !dependencySyntax.has(identity))
136
+ refuse('unowned dependency syntax');
137
+ for (const attribute of node.attributes) {
138
+ check();
139
+ if (attribute.name.local === 'name' && (attribute.value in Object.prototype || attribute.value === 'prototype'))
140
+ refuse('dependency reserved name');
141
+ }
142
+ for (const prefix in node.namespaces) {
143
+ check();
144
+ if (['__proto__', 'prototype', 'constructor'].includes(prefix) || /["<&\r\n\t]/.test(node.namespaces[prefix]))
145
+ refuse('dependency namespace interpolation');
146
+ }
147
+ for (const child of node.children)
148
+ if (child.kind === 'element')
149
+ pending.push(child);
150
+ }
151
+ }
152
+ const resources = [...source.resources].sort((a, b) => a.uri < b.uri ? -1 : a.uri > b.uri ? 1 : 0);
153
+ const aliases = new Map(), originals = new Map();
154
+ const dependencies = new Map(), imports = new Map();
155
+ for (const [index, resource] of resources.entries()) {
156
+ check();
157
+ const alias = 'https://wsdl-snapshot.invalid/resource/' + index;
158
+ aliases.set(resource.uri, alias);
159
+ originals.set(alias, resource.uri);
160
+ dependencies.set(resource.uri, new Set());
161
+ }
162
+ const schemaUris = new Map(source.schemas.map(schema => [schema.key, schema.documentUri]));
163
+ for (const edge of source.edges) {
164
+ check();
165
+ if (!edge.to)
166
+ continue;
167
+ const target = schemaUris.get(edge.to) ?? edge.to, parent = edge.source.uri;
168
+ if (!aliases.has(target) || !aliases.has(parent))
169
+ refuse('dependency outside retained snapshot');
170
+ const node = nodes.get(key(edge.source.uri, edge.source.path));
171
+ if (!node)
172
+ refuse('dependency source unavailable');
173
+ const location = syntaxAttribute(node, edge.kind === 'wsdl-import' ? 'location' : 'schemaLocation');
174
+ if (location === undefined)
175
+ continue;
176
+ const slot = key(parent, normalizeWhitespace(location, 'collapse')), previous = imports.get(slot);
177
+ if (previous !== undefined && previous !== target)
178
+ refuse('ambiguous dependency import context');
179
+ imports.set(slot, target);
180
+ dependencies.get(parent).add(target);
181
+ }
182
+ const cache = Object.create(null), prepared = new Set();
183
+ const remaining = new Map(), dependents = new Map(), ready = [];
184
+ for (const [uri, required] of dependencies) {
185
+ check();
186
+ remaining.set(uri, required.size);
187
+ if (!required.size)
188
+ ready.push(uri);
189
+ for (const dependency of required) {
190
+ check();
191
+ let users = dependents.get(dependency);
192
+ if (!users) {
193
+ users = [];
194
+ dependents.set(dependency, users);
195
+ }
196
+ users.push(uri);
197
+ }
198
+ }
199
+ for (let cursor = 0; cursor < ready.length; cursor++) {
200
+ const uri = ready[cursor];
201
+ check();
202
+ const bytes = copyOriginalSchemaResource(source, uri, amount => { check(); budget.chargeWork(amount); });
203
+ budget.chargeWork(4096 + bytes.byteLength * 64);
204
+ const text = decodeMetadataXml(bytes);
205
+ const options = { WSDL_CACHE: cache, wsdl_options: { overrideImportLocation: (_path, parentAlias, location) => {
206
+ check();
207
+ const parent = originals.get(parentAlias);
208
+ const target = parent === undefined ? undefined : imports.get(key(parent, normalizeWhitespace(location, 'collapse')));
209
+ const alias = target === undefined ? undefined : aliases.get(target);
210
+ if (!target || !alias || !prepared.has(target) || !Object.hasOwn(cache, alias))
211
+ return refuse('unowned SOAP metadata import');
212
+ return alias;
213
+ } } };
214
+ const alias = aliases.get(uri), wsdl = new WSDL(text, alias, options);
215
+ cache[alias] = wsdl;
216
+ await new Promise((resolve, reject) => wsdl.onReady(error => error ? reject(error) : resolve()));
217
+ check();
218
+ prepared.add(uri);
219
+ for (const dependent of dependents.get(uri) ?? []) {
220
+ check();
221
+ const count = remaining.get(dependent) - 1;
222
+ remaining.set(dependent, count);
223
+ if (count === 0)
224
+ ready.push(dependent);
225
+ }
226
+ }
227
+ if (prepared.size !== resources.length)
228
+ refuse('cyclic SOAP metadata dependencies');
229
+ const root = aliases.get(source.root.uri);
230
+ if (!root || !Object.hasOwn(cache, root))
231
+ return refuse('original root unavailable');
232
+ return cache[root];
233
+ }