@techspokes/typescript-wsdl-client 1.1.4 → 1.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -35
- package/dist/app/generateApp.d.ts +0 -1
- package/dist/app/generateApp.js +8 -6
- package/dist/app/generateCheckedApp.d.ts +38 -0
- package/dist/app/generateCheckedApp.js +108 -0
- package/dist/checkedPipeline.d.ts +155 -0
- package/dist/checkedPipeline.js +448 -0
- package/dist/checkedPlanning.d.ts +123 -0
- package/dist/checkedPlanning.js +245 -0
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +123 -5
- package/dist/client/checkedDirectRuntime.d.ts +96 -0
- package/dist/client/checkedDirectRuntime.js +43 -0
- package/dist/client/directClientRuntime.d.ts +74 -0
- package/dist/client/directClientRuntime.js +165 -0
- package/dist/client/directClientVersion.d.ts +6 -0
- package/dist/client/directClientVersion.js +6 -0
- package/dist/client/generateClient.d.ts +0 -1
- package/dist/client/generateClient.js +26 -12
- package/dist/client/generateDirectClient.d.ts +32 -0
- package/dist/client/generateDirectClient.js +268 -0
- package/dist/client/generateOperations.d.ts +0 -1
- package/dist/client/generateTypes.d.ts +0 -1
- package/dist/client/generateUtils.d.ts +0 -1
- package/dist/client/generateUtils.js +3 -1
- package/dist/compiler/applicationGroups.d.ts +53 -0
- package/dist/compiler/applicationGroups.js +403 -0
- package/dist/compiler/buildCanonicalGraph.d.ts +6 -0
- package/dist/compiler/buildCanonicalGraph.js +381 -0
- package/dist/compiler/canonicalGraph.d.ts +197 -0
- package/dist/compiler/canonicalGraph.js +37 -0
- package/dist/compiler/catalogErrors.d.ts +17 -0
- package/dist/compiler/catalogErrors.js +86 -0
- package/dist/compiler/catalogProvenance.d.ts +14 -0
- package/dist/compiler/catalogProvenance.js +229 -0
- package/dist/compiler/checkedAssessment.d.ts +90 -0
- package/dist/compiler/checkedAssessment.js +300 -0
- package/dist/compiler/checkedComponentSource.d.ts +16 -0
- package/dist/compiler/checkedComponentSource.js +31 -0
- package/dist/compiler/checkedSourcePreparation.d.ts +72 -0
- package/dist/compiler/checkedSourcePreparation.js +202 -0
- package/dist/compiler/complexTypeContent.d.ts +58 -0
- package/dist/compiler/complexTypeContent.js +558 -0
- package/dist/compiler/componentCorrespondence.d.ts +32 -0
- package/dist/compiler/componentCorrespondence.js +140 -0
- package/dist/compiler/componentRecordProjection.d.ts +109 -0
- package/dist/compiler/componentRecordProjection.js +319 -0
- package/dist/compiler/componentSoapPreparation.d.ts +20 -0
- package/dist/compiler/componentSoapPreparation.js +36 -0
- package/dist/compiler/composeCanonicalGraph.d.ts +68 -0
- package/dist/compiler/composeCanonicalGraph.js +252 -0
- package/dist/compiler/dataOwnership.d.ts +21 -0
- package/dist/compiler/dataOwnership.js +167 -0
- package/dist/compiler/datatypeValues.d.ts +46 -0
- package/dist/compiler/datatypeValues.js +275 -0
- package/dist/compiler/directCodec.d.ts +116 -0
- package/dist/compiler/directCodec.js +377 -0
- package/dist/compiler/directExecutionPolicy.d.ts +9 -0
- package/dist/compiler/directExecutionPolicy.js +17 -0
- package/dist/compiler/directOperation.d.ts +114 -0
- package/dist/compiler/directOperation.js +373 -0
- package/dist/compiler/directSoap.d.ts +66 -0
- package/dist/compiler/directSoap.js +391 -0
- package/dist/compiler/directSoapSource.d.ts +38 -0
- package/dist/compiler/directSoapSource.js +233 -0
- package/dist/compiler/directSourceCapsule.d.ts +169 -0
- package/dist/compiler/directSourceCapsule.js +727 -0
- package/dist/compiler/directStructure.d.ts +128 -0
- package/dist/compiler/directStructure.js +543 -0
- package/dist/compiler/directStructurePlan.d.ts +149 -0
- package/dist/compiler/directStructurePlan.js +623 -0
- package/dist/compiler/directValues.d.ts +128 -0
- package/dist/compiler/directValues.js +1116 -0
- package/dist/compiler/finiteRe01Construction.d.ts +69 -0
- package/dist/compiler/finiteRe01Construction.js +422 -0
- package/dist/compiler/finiteRe01Verification.d.ts +218 -0
- package/dist/compiler/finiteRe01Verification.js +1217 -0
- package/dist/compiler/generateCatalog.d.ts +0 -1
- package/dist/compiler/graphTraversal.d.ts +10 -0
- package/dist/compiler/graphTraversal.js +37 -0
- package/dist/compiler/hypotheticalScopedIdentity.d.ts +22 -0
- package/dist/compiler/hypotheticalScopedIdentity.js +81 -0
- package/dist/compiler/occurrenceAnalysis.d.ts +66 -0
- package/dist/compiler/occurrenceAnalysis.js +316 -0
- package/dist/compiler/originalSourceMembership.d.ts +5 -0
- package/dist/compiler/originalSourceMembership.js +31 -0
- package/dist/compiler/particleAttribution.d.ts +16 -0
- package/dist/compiler/particleAttribution.js +494 -0
- package/dist/compiler/particleDeclarationConsistency.d.ts +23 -0
- package/dist/compiler/particleDeclarationConsistency.js +206 -0
- package/dist/compiler/particleExtension.d.ts +21 -0
- package/dist/compiler/particleExtension.js +123 -0
- package/dist/compiler/particleLocalAssessment.d.ts +19 -0
- package/dist/compiler/particleLocalAssessment.js +92 -0
- package/dist/compiler/particleRestriction.d.ts +23 -0
- package/dist/compiler/particleRestriction.js +494 -0
- package/dist/compiler/particleSemanticView.d.ts +51 -0
- package/dist/compiler/particleSemanticView.js +310 -0
- package/dist/compiler/particleWildcardRelation.d.ts +87 -0
- package/dist/compiler/particleWildcardRelation.js +143 -0
- package/dist/compiler/projectionScalar.d.ts +32 -0
- package/dist/compiler/projectionScalar.js +184 -0
- package/dist/compiler/re01CandidateAssignments.d.ts +95 -0
- package/dist/compiler/re01CandidateAssignments.js +341 -0
- package/dist/compiler/re01CandidateCorrespondence.d.ts +85 -0
- package/dist/compiler/re01CandidateCorrespondence.js +701 -0
- package/dist/compiler/re01TypeProperties.d.ts +70 -0
- package/dist/compiler/re01TypeProperties.js +120 -0
- package/dist/compiler/re01TypePropertyValidation.d.ts +22 -0
- package/dist/compiler/re01TypePropertyValidation.js +161 -0
- package/dist/compiler/resolveCanonicalGraph.d.ts +41 -0
- package/dist/compiler/resolveCanonicalGraph.js +240 -0
- package/dist/compiler/scalarSchemaAssessment.d.ts +424 -0
- package/dist/compiler/scalarSchemaAssessment.js +5198 -0
- package/dist/compiler/schemaAttributeGroupProperties.d.ts +16 -0
- package/dist/compiler/schemaAttributeGroupProperties.js +53 -0
- package/dist/compiler/schemaAttributeProperties.d.ts +9 -0
- package/dist/compiler/schemaAttributeProperties.js +11 -0
- package/dist/compiler/schemaAttributeUses.d.ts +110 -0
- package/dist/compiler/schemaAttributeUses.js +798 -0
- package/dist/compiler/schemaBinaryWordReconstruction.d.ts +9 -0
- package/dist/compiler/schemaBinaryWordReconstruction.js +33 -0
- package/dist/compiler/schemaBuiltinFacets.d.ts +13 -0
- package/dist/compiler/schemaBuiltinFacets.js +51 -0
- package/dist/compiler/schemaCalendarImages.d.ts +7 -0
- package/dist/compiler/schemaCalendarImages.js +204 -0
- package/dist/compiler/schemaCalendarLanguage.d.ts +10 -0
- package/dist/compiler/schemaCalendarLanguage.js +227 -0
- package/dist/compiler/schemaCompiler.d.ts +0 -1
- package/dist/compiler/schemaComponentEquality.d.ts +27 -0
- package/dist/compiler/schemaComponentEquality.js +446 -0
- package/dist/compiler/schemaConstructionAssessment.d.ts +79 -0
- package/dist/compiler/schemaConstructionAssessment.js +745 -0
- package/dist/compiler/schemaDatatypeValues.d.ts +3 -0
- package/dist/compiler/schemaDatatypeValues.js +2 -0
- package/dist/compiler/schemaDecimalLanguage.d.ts +6 -0
- package/dist/compiler/schemaDecimalLanguage.js +102 -0
- package/dist/compiler/schemaDeclarationPrimitives.d.ts +39 -0
- package/dist/compiler/schemaDeclarationPrimitives.js +211 -0
- package/dist/compiler/schemaDocumentSyntax.d.ts +54 -0
- package/dist/compiler/schemaDocumentSyntax.js +294 -0
- package/dist/compiler/schemaDurationLanguage.d.ts +10 -0
- package/dist/compiler/schemaDurationLanguage.js +170 -0
- package/dist/compiler/schemaElementInstance.d.ts +30 -0
- package/dist/compiler/schemaElementInstance.js +45 -0
- package/dist/compiler/schemaElementProperties.d.ts +15 -0
- package/dist/compiler/schemaElementProperties.js +23 -0
- package/dist/compiler/schemaEndpointWordCapacity.d.ts +35 -0
- package/dist/compiler/schemaEndpointWordCapacity.js +39 -0
- package/dist/compiler/schemaExactCalendar.d.ts +72 -0
- package/dist/compiler/schemaExactCalendar.js +264 -0
- package/dist/compiler/schemaFacetAnnotation.d.ts +31 -0
- package/dist/compiler/schemaFacetAnnotation.js +199 -0
- package/dist/compiler/schemaGeneratedScalarShape.d.ts +34 -0
- package/dist/compiler/schemaGeneratedScalarShape.js +178 -0
- package/dist/compiler/schemaIdentityConstraints.d.ts +72 -0
- package/dist/compiler/schemaIdentityConstraints.js +362 -0
- package/dist/compiler/schemaIeeeLanguage.d.ts +42 -0
- package/dist/compiler/schemaIeeeLanguage.js +759 -0
- package/dist/compiler/schemaIntegerImages.d.ts +10 -0
- package/dist/compiler/schemaIntegerImages.js +113 -0
- package/dist/compiler/schemaLexicalPredicates.d.ts +28 -0
- package/dist/compiler/schemaLexicalPredicates.js +63 -0
- package/dist/compiler/schemaNotationProperties.d.ts +31 -0
- package/dist/compiler/schemaNotationProperties.js +84 -0
- package/dist/compiler/schemaNumericImageConditions.d.ts +23 -0
- package/dist/compiler/schemaNumericImageConditions.js +66 -0
- package/dist/compiler/schemaParticleWildcardProperties.d.ts +19 -0
- package/dist/compiler/schemaParticleWildcardProperties.js +43 -0
- package/dist/compiler/schemaPattern.d.ts +1061 -0
- package/dist/compiler/schemaPattern.js +581 -0
- package/dist/compiler/schemaRegularLanguage.d.ts +66 -0
- package/dist/compiler/schemaRegularLanguage.js +1166 -0
- package/dist/compiler/schemaScalarContext.d.ts +85 -0
- package/dist/compiler/schemaScalarContext.js +78 -0
- package/dist/compiler/schemaScalarKernel.d.ts +181 -0
- package/dist/compiler/schemaScalarKernel.js +391 -0
- package/dist/compiler/schemaScalarWitnesses.d.ts +5 -0
- package/dist/compiler/schemaScalarWitnesses.js +118 -0
- package/dist/compiler/schemaSimpleTypeProperties.d.ts +94 -0
- package/dist/compiler/schemaSimpleTypeProperties.js +103 -0
- package/dist/compiler/schemaSourceGrammar.d.ts +26 -0
- package/dist/compiler/schemaSourceGrammar.js +290 -0
- package/dist/compiler/schemaSourceLexical.d.ts +3 -0
- package/dist/compiler/schemaSourceLexical.js +12 -0
- package/dist/compiler/schemaSourceValues.d.ts +50 -0
- package/dist/compiler/schemaSourceValues.js +225 -0
- package/dist/compiler/schemaSourceWildcards.d.ts +27 -0
- package/dist/compiler/schemaSourceWildcards.js +249 -0
- package/dist/compiler/schemaSymbolicSequences.d.ts +15 -0
- package/dist/compiler/schemaSymbolicSequences.js +99 -0
- package/dist/compiler/schemaSymbolicValueSets.d.ts +31 -0
- package/dist/compiler/schemaSymbolicValueSets.js +149 -0
- package/dist/compiler/schemaSyntaxAssessment.d.ts +24 -0
- package/dist/compiler/schemaSyntaxAssessment.js +361 -0
- package/dist/compiler/schemaTemporalAliases.d.ts +5 -0
- package/dist/compiler/schemaTemporalAliases.js +195 -0
- package/dist/compiler/schemaTokenImages.d.ts +8 -0
- package/dist/compiler/schemaTokenImages.js +142 -0
- package/dist/compiler/schemaTypeIdentity.d.ts +38 -0
- package/dist/compiler/schemaTypeIdentity.js +80 -0
- package/dist/compiler/schemaTypeRelations.d.ts +37 -0
- package/dist/compiler/schemaTypeRelations.js +576 -0
- package/dist/compiler/schemaUri.d.ts +12 -0
- package/dist/compiler/schemaUri.js +103 -0
- package/dist/compiler/schemaValueContext.d.ts +25 -0
- package/dist/compiler/schemaValueContext.js +1 -0
- package/dist/compiler/schemaValueImages.d.ts +9 -0
- package/dist/compiler/schemaValueImages.js +142 -0
- package/dist/compiler/schemaValueSequences.d.ts +14 -0
- package/dist/compiler/schemaValueSequences.js +19 -0
- package/dist/compiler/semanticBudget.d.ts +67 -0
- package/dist/compiler/semanticBudget.js +193 -0
- package/dist/compiler/semanticCatalog.d.ts +121 -0
- package/dist/compiler/semanticCatalog.js +160 -0
- package/dist/compiler/semanticContext.d.ts +183 -0
- package/dist/compiler/semanticContext.js +1207 -0
- package/dist/compiler/semanticTypeDependencies.d.ts +7 -0
- package/dist/compiler/semanticTypeDependencies.js +64 -0
- package/dist/compiler/semanticTypeReference.d.ts +23 -0
- package/dist/compiler/semanticTypeReference.js +36 -0
- package/dist/compiler/shapeResolver.d.ts +1 -1
- package/dist/compiler/shapeResolver.js +7 -9
- package/dist/compiler/soapHeaders.d.ts +16 -0
- package/dist/compiler/soapHeaders.js +42 -0
- package/dist/compiler/sourceSchemaBinding.d.ts +25 -0
- package/dist/compiler/sourceSchemaBinding.js +39 -0
- package/dist/compiler/standardSchemaComponents.d.ts +71 -0
- package/dist/compiler/standardSchemaComponents.js +74 -0
- package/dist/compiler/standardSchemaConstruction.d.ts +20 -0
- package/dist/compiler/standardSchemaConstruction.js +34 -0
- package/dist/compiler/structuralCompanions.d.ts +15 -0
- package/dist/compiler/structuralCompanions.js +232 -0
- package/dist/compiler/validateSemanticGraph.d.ts +4 -0
- package/dist/compiler/validateSemanticGraph.js +376 -0
- package/dist/compiler/wildcardAlgebra.d.ts +25 -0
- package/dist/compiler/wildcardAlgebra.js +155 -0
- package/dist/compiler/wsdlPolicyRequirements.d.ts +43 -0
- package/dist/compiler/wsdlPolicyRequirements.js +239 -0
- package/dist/config.d.ts +0 -1
- package/dist/gateway/generateCheckedGateway.d.ts +32 -0
- package/dist/gateway/generateCheckedGateway.js +293 -0
- package/dist/gateway/generateGateway.d.ts +0 -1
- package/dist/gateway/generateGateway.js +2 -2
- package/dist/gateway/generators.d.ts +0 -1
- package/dist/gateway/helpers.d.ts +0 -1
- package/dist/generation/componentShape.d.ts +14 -0
- package/dist/generation/componentShape.js +269 -0
- package/dist/generation/preamble.d.ts +0 -1
- package/dist/generation/sourceLayout.d.ts +13 -0
- package/dist/generation/sourceLayout.js +40 -0
- package/dist/generation/writeGeneratedSource.d.ts +0 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +3 -0
- package/dist/loader/fetch.d.ts +0 -1
- package/dist/loader/orderedSyntax.d.ts +84 -0
- package/dist/loader/orderedSyntax.js +222 -0
- package/dist/loader/resolutionDepth.d.ts +6 -0
- package/dist/loader/resolutionDepth.js +65 -0
- package/dist/loader/schemaInput.d.ts +80 -0
- package/dist/loader/schemaInput.js +249 -0
- package/dist/loader/schemaResources.d.ts +60 -0
- package/dist/loader/schemaResources.js +333 -0
- package/dist/loader/wsdlLoader.d.ts +0 -1
- package/dist/openapi/casing.d.ts +0 -1
- package/dist/openapi/generateOpenAPI.d.ts +0 -1
- package/dist/openapi/generateOpenAPI.js +2 -2
- package/dist/openapi/generatePaths.d.ts +0 -1
- package/dist/openapi/generateSchemas.d.ts +0 -1
- package/dist/openapi/security.d.ts +0 -1
- package/dist/pipeline.d.ts +6 -2
- package/dist/pipeline.js +13 -0
- package/dist/test/generateCheckedTests.d.ts +17 -0
- package/dist/test/generateCheckedTests.js +60 -0
- package/dist/test/generateTests.d.ts +0 -1
- package/dist/test/generateTests.js +2 -2
- package/dist/test/generators.d.ts +0 -1
- package/dist/test/mockData.d.ts +0 -1
- package/dist/test/mockData.js +20 -14
- package/dist/util/attributeWildcards.d.ts +0 -1
- package/dist/util/builder.d.ts +0 -1
- package/dist/util/catalogMeta.d.ts +0 -1
- package/dist/util/checkedCliDiagnostics.d.ts +11 -0
- package/dist/util/checkedCliDiagnostics.js +22 -0
- package/dist/util/cli.d.ts +0 -1
- package/dist/util/errors.d.ts +0 -1
- package/dist/util/imports.d.ts +0 -1
- package/dist/util/runtimeSource.d.ts +0 -1
- package/dist/util/runtimeSource.js +3 -5
- package/dist/util/securityConfig.d.ts +0 -1
- package/dist/util/streamConfig.d.ts +0 -1
- package/dist/util/tools.d.ts +0 -1
- package/dist/util/xmlWhitespace.d.ts +2 -0
- package/dist/util/xmlWhitespace.js +4 -0
- package/dist/xsd/primitives.d.ts +0 -1
- package/docs/agent-skill.md +2 -0
- package/docs/api-reference.md +1 -1
- package/docs/checked-gateway.md +210 -0
- package/docs/checked-generation.md +161 -0
- package/docs/cli-reference.md +43 -1
- package/docs/concepts.md +136 -1
- package/docs/configuration.md +5 -1
- package/docs/corpus.md +33 -0
- package/docs/direct-values.md +311 -0
- package/docs/examples/checked-forecast.wsdl +19 -0
- package/docs/gateway-guide.md +1 -1
- package/docs/generated-code.md +10 -5
- package/docs/mapping-contract.md +114 -0
- package/docs/migration-playbook.md +1 -1
- package/docs/output-anatomy.md +1 -1
- package/docs/start-here.md +8 -2
- package/docs/supported-patterns.md +17 -5
- package/docs/testing.md +117 -31
- package/llms.txt +7 -7
- package/package.json +79 -25
- package/src/generation/preambles/direct-client/typescript.preamble +3 -0
- package/src/runtime/checkedGatewayHost.tpl.txt +157 -0
- package/src/runtime/streamXml.ts +1 -1
- package/dist/app/generateApp.d.ts.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/client/generateClient.d.ts.map +0 -1
- package/dist/client/generateOperations.d.ts.map +0 -1
- package/dist/client/generateTypes.d.ts.map +0 -1
- package/dist/client/generateUtils.d.ts.map +0 -1
- package/dist/compiler/generateCatalog.d.ts.map +0 -1
- package/dist/compiler/schemaCompiler.d.ts.map +0 -1
- package/dist/compiler/shapeResolver.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/gateway/generateGateway.d.ts.map +0 -1
- package/dist/gateway/generators.d.ts.map +0 -1
- package/dist/gateway/helpers.d.ts.map +0 -1
- package/dist/generation/preamble.d.ts.map +0 -1
- package/dist/generation/writeGeneratedSource.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/loader/fetch.d.ts.map +0 -1
- package/dist/loader/wsdlLoader.d.ts.map +0 -1
- package/dist/openapi/casing.d.ts.map +0 -1
- package/dist/openapi/generateOpenAPI.d.ts.map +0 -1
- package/dist/openapi/generatePaths.d.ts.map +0 -1
- package/dist/openapi/generateSchemas.d.ts.map +0 -1
- package/dist/openapi/security.d.ts.map +0 -1
- package/dist/pipeline.d.ts.map +0 -1
- package/dist/runtime/jsonArray.d.ts +0 -24
- package/dist/runtime/jsonArray.d.ts.map +0 -1
- package/dist/runtime/jsonArray.js +0 -52
- package/dist/runtime/ndjson.d.ts +0 -24
- package/dist/runtime/ndjson.d.ts.map +0 -1
- package/dist/runtime/ndjson.js +0 -30
- package/dist/runtime/streamXml.d.ts +0 -45
- package/dist/runtime/streamXml.d.ts.map +0 -1
- package/dist/runtime/streamXml.js +0 -212
- package/dist/test/generateTests.d.ts.map +0 -1
- package/dist/test/generators.d.ts.map +0 -1
- package/dist/test/mockData.d.ts.map +0 -1
- package/dist/util/attributeWildcards.d.ts.map +0 -1
- package/dist/util/builder.d.ts.map +0 -1
- package/dist/util/catalogMeta.d.ts.map +0 -1
- package/dist/util/cli.d.ts.map +0 -1
- package/dist/util/errors.d.ts.map +0 -1
- package/dist/util/imports.d.ts.map +0 -1
- package/dist/util/runtimeSource.d.ts.map +0 -1
- package/dist/util/securityConfig.d.ts.map +0 -1
- package/dist/util/streamConfig.d.ts.map +0 -1
- package/dist/util/tools.d.ts.map +0 -1
- package/dist/xsd/primitives.d.ts.map +0 -1
- package/docs/AGENTS.md +0 -47
- package/docs/README.md +0 -56
- package/docs/architecture.md +0 -149
- package/docs/decisions/001-test-generation.md +0 -36
- package/docs/decisions/002-streamable-responses.md +0 -330
- package/docs/file-naming-and-path-organization.md +0 -213
- package/docs/releases/README.md +0 -94
- package/docs/releases/v0.20.0.md +0 -22
- package/docs/releases/v0.21.0.md +0 -30
- package/docs/releases/v0.22.0.md +0 -30
- package/docs/releases/v0.23.0.md +0 -31
- package/docs/releases/v0.24.0.md +0 -38
- package/docs/releases/v0.25.0.md +0 -31
- package/docs/releases/v0.25.2.md +0 -32
- package/docs/releases/v0.26.0.md +0 -32
- package/docs/releases/v0.27.0.md +0 -31
- package/docs/releases/v0.28.0.md +0 -32
- package/docs/releases/v0.29.0.md +0 -32
- package/docs/releases/v0.30.0.md +0 -30
- package/docs/releases/v0.30.1.md +0 -31
- package/docs/releases/v0.30.2.md +0 -30
- package/docs/releases/v0.30.3.md +0 -33
- package/docs/releases/v0.31.0.md +0 -33
- package/docs/releases/v0.32.0.md +0 -33
- package/docs/releases/v0.33.0.md +0 -34
- package/docs/releases/v0.34.0.md +0 -30
- package/docs/releases/v0.35.0.md +0 -33
- package/docs/releases/v0.36.0.md +0 -32
- package/docs/releases/v0.37.0.md +0 -33
- package/docs/releases/v0.38.0.md +0 -35
- package/docs/releases/v0.39.0.md +0 -35
- package/docs/releases/v0.40.0.md +0 -45
- package/docs/releases/v0.40.1.md +0 -34
- package/docs/releases/v1.0.0.md +0 -42
- package/docs/releases/v1.0.1.md +0 -38
- package/docs/releases/v1.0.2.md +0 -51
- package/docs/releases/v1.0.3.md +0 -37
- package/docs/releases/v1.0.4.md +0 -45
- package/docs/releases/v1.0.5.md +0 -41
- package/docs/releases/v1.0.6.md +0 -35
- package/docs/releases/v1.0.7.md +0 -36
- package/docs/releases/v1.1.0.md +0 -42
- package/docs/releases/v1.1.1.md +0 -44
- package/docs/releases/v1.1.2.md +0 -42
- package/docs/releases/v1.1.3.md +0 -36
- package/docs/releases/v1.1.4.md +0 -36
- package/docs/roadmap/README.md +0 -107
- package/docs/roadmap/v1.0-capability-conformance-framework.md +0 -582
- package/docs/roadmap/v1.0-choice-union-mode.md +0 -90
- package/docs/roadmap/v1.0-contract-audit.md +0 -75
- package/docs/roadmap/v1.0-json-array-streaming.md +0 -101
- package/docs/roadmap/v1.0-openapi-fastify-compatibility.md +0 -99
- package/docs/roadmap/v1.0-release-candidate-gates.md +0 -92
- package/docs/roadmap/v1.0-wsdl-coverage-matrix.md +0 -200
- package/docs/roadmap/v1.0-xs-anyattribute-wildcard-bag.md +0 -932
- package/src/runtime/jsonArray.ts +0 -55
- package/src/runtime/ndjson.ts +0 -32
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { AttributeUseNode, ComplexTypeNode, Facet, NodeId, Reference, ValueConstraint, Wildcard } from "./canonicalGraph.js";
|
|
2
|
+
import type { ExpandedName } from "../loader/orderedSyntax.js";
|
|
3
|
+
import type { ResolvedGraph, SemanticLimits } from "./resolveCanonicalGraph.js";
|
|
4
|
+
import type { NamespaceConstraint } from "./wildcardAlgebra.js";
|
|
5
|
+
export { namespaceIntersection, namespaceSubset, namespaceUnion, wildcardNamespaces } from "./wildcardAlgebra.js";
|
|
6
|
+
export type { NamespaceConstraint } from "./wildcardAlgebra.js";
|
|
7
|
+
export type WildcardProcess = Wildcard["processContents"];
|
|
8
|
+
export type WildcardPlan = Readonly<{
|
|
9
|
+
namespace: NamespaceConstraint;
|
|
10
|
+
processContents: WildcardProcess | Readonly<{
|
|
11
|
+
kind: "assessment-required";
|
|
12
|
+
alternatives: readonly WildcardProcess[];
|
|
13
|
+
}>;
|
|
14
|
+
sources: readonly NodeId[];
|
|
15
|
+
}>;
|
|
16
|
+
export type AttributePlan = Readonly<{
|
|
17
|
+
name: ExpandedName;
|
|
18
|
+
declaration: NodeId;
|
|
19
|
+
type: Reference;
|
|
20
|
+
use: AttributeUseNode["use"];
|
|
21
|
+
value?: ValueConstraint;
|
|
22
|
+
sources: readonly NodeId[];
|
|
23
|
+
}>;
|
|
24
|
+
/** These obligations are not a schema-validity certificate. #179 must discharge them before planning. */
|
|
25
|
+
export type DerivationObligation = Readonly<{
|
|
26
|
+
kind: "particle-extension" | "particle-restriction" | "attribute-type-restriction" | "attribute-extension-equivalence" | "fixed-value-equivalence" | "wildcard-expressibility" | "group-local-wildcard-process" | "scalar-derivation" | "mixed-content";
|
|
27
|
+
owner: NodeId;
|
|
28
|
+
base?: NodeId | Reference | ValueConstraint;
|
|
29
|
+
local?: NodeId | Reference | ValueConstraint;
|
|
30
|
+
}>;
|
|
31
|
+
export type ComposedType = Readonly<{
|
|
32
|
+
id: NodeId;
|
|
33
|
+
/** Sequence of declared root particles, not flattened children or occurrence summaries. */
|
|
34
|
+
content: readonly ContentContribution[];
|
|
35
|
+
mixed: boolean;
|
|
36
|
+
attributes: readonly AttributePlan[];
|
|
37
|
+
wildcard?: WildcardPlan;
|
|
38
|
+
scalar?: Readonly<{
|
|
39
|
+
base: Reference;
|
|
40
|
+
layers: readonly Readonly<{
|
|
41
|
+
owner: NodeId;
|
|
42
|
+
facets: readonly Facet[];
|
|
43
|
+
inlineType?: Reference;
|
|
44
|
+
}>[];
|
|
45
|
+
}>;
|
|
46
|
+
derivation?: ComplexTypeNode["derivation"];
|
|
47
|
+
obligations: readonly DerivationObligation[];
|
|
48
|
+
assessment: "requires-schema-assessment";
|
|
49
|
+
}>;
|
|
50
|
+
export type ComposedGraph = Readonly<{
|
|
51
|
+
resolved: ResolvedGraph;
|
|
52
|
+
types: readonly ComposedType[];
|
|
53
|
+
metrics: Readonly<{
|
|
54
|
+
steps: number;
|
|
55
|
+
}>;
|
|
56
|
+
}>;
|
|
57
|
+
export type ContentContribution = Readonly<{
|
|
58
|
+
kind: "particle";
|
|
59
|
+
particle: NodeId;
|
|
60
|
+
} | {
|
|
61
|
+
kind: "builtin";
|
|
62
|
+
reference: Reference;
|
|
63
|
+
}>;
|
|
64
|
+
/** Extension concatenates root contributions, retaining each root's exact declared occurrence. */
|
|
65
|
+
export declare function extendContent(base: readonly ContentContribution[], local: NodeId | undefined): readonly ContentContribution[];
|
|
66
|
+
/** Restriction replaces child content, including the empty case. No removed base particle is appended. */
|
|
67
|
+
export declare function restrictContent(local: NodeId | undefined): readonly ContentContribution[];
|
|
68
|
+
export declare function composeCanonicalGraph(resolved: ResolvedGraph, limits?: SemanticLimits): ComposedGraph;
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/** S05 composition views reference declared components; S06 discharges schema legality. */
|
|
2
|
+
import { deepFreeze } from "./canonicalGraph.js";
|
|
3
|
+
import { referenceTarget, SemanticError, semanticBudget } from "./resolveCanonicalGraph.js";
|
|
4
|
+
import { namespaceAllows as allows, namespaceIntersection, namespaceSubset, namespaceUnion, wildcardNamespaces, processContentsRestricts } from "./wildcardAlgebra.js";
|
|
5
|
+
export { namespaceIntersection, namespaceSubset, namespaceUnion, wildcardNamespaces } from "./wildcardAlgebra.js";
|
|
6
|
+
const canonicalSet = (values) => [...new Set(values)].sort();
|
|
7
|
+
const key = (name) => JSON.stringify([name.namespace, name.local]);
|
|
8
|
+
/** Extension concatenates root contributions, retaining each root's exact declared occurrence. */
|
|
9
|
+
export function extendContent(base, local) {
|
|
10
|
+
return [...base, ...restrictContent(local)];
|
|
11
|
+
}
|
|
12
|
+
/** Restriction replaces child content, including the empty case. No removed base particle is appended. */
|
|
13
|
+
export function restrictContent(local) {
|
|
14
|
+
return local ? [{ kind: "particle", particle: local }] : [];
|
|
15
|
+
}
|
|
16
|
+
export function composeCanonicalGraph(resolved, limits = {}) {
|
|
17
|
+
const graph = resolved.graph, budget = semanticBudget(limits);
|
|
18
|
+
if (graph.nodes.length > budget.maxNodes)
|
|
19
|
+
throw new SemanticError("resource-limit", `Composition exceeds ${budget.maxNodes} graph nodes`);
|
|
20
|
+
const nodes = new Map(graph.nodes.map(n => [n.id, n])), composed = new Map();
|
|
21
|
+
const fail = (node, message) => { throw new SemanticError("invalid-schema", message, node.id, node.context.source); };
|
|
22
|
+
const get = (id) => nodes.get(id) ?? (() => { throw new SemanticError("invalid-schema", `Missing component ${id}`); })();
|
|
23
|
+
const count = (node, ...lists) => {
|
|
24
|
+
for (const list of lists)
|
|
25
|
+
for (const ignored of list)
|
|
26
|
+
budget.step(node);
|
|
27
|
+
};
|
|
28
|
+
const wildcardCharge = (node) => (amount = 1) => {
|
|
29
|
+
for (let index = 0; index < amount; index++)
|
|
30
|
+
budget.step(node);
|
|
31
|
+
};
|
|
32
|
+
const copySources = (node, a, b) => {
|
|
33
|
+
count(node, a, b);
|
|
34
|
+
return [...a, ...b];
|
|
35
|
+
};
|
|
36
|
+
const groups = new Map();
|
|
37
|
+
const localAttributes = (owner, obligations) => {
|
|
38
|
+
const frame = (node) => ({ node, index: 0, attributes: new Map(), groups: [], obligations: [] });
|
|
39
|
+
const stack = [frame(owner)];
|
|
40
|
+
const add = (current, attribute) => {
|
|
41
|
+
budget.step(current.node);
|
|
42
|
+
const existing = current.attributes.get(key(attribute.name));
|
|
43
|
+
if (existing)
|
|
44
|
+
current.obligations.push({ kind: "attribute-extension-equivalence", owner: current.node.id, base: existing.declaration, local: attribute.declaration });
|
|
45
|
+
current.attributes.set(key(attribute.name), existing ? { ...attribute, sources: copySources(current.node, existing.sources, attribute.sources) } : attribute);
|
|
46
|
+
};
|
|
47
|
+
while (stack.length) {
|
|
48
|
+
const current = stack[stack.length - 1], container = current.node;
|
|
49
|
+
if (current.index < container.attributes.length) {
|
|
50
|
+
const node = get(container.attributes[current.index]);
|
|
51
|
+
budget.step(node);
|
|
52
|
+
if (node.kind === "attributeGroupUse") {
|
|
53
|
+
const target = referenceTarget(node.reference, nodes, node), group = target ? get(target) : undefined;
|
|
54
|
+
if (group?.kind !== "attributeGroup")
|
|
55
|
+
fail(node, "Attribute group reference requires an attribute-group definition");
|
|
56
|
+
const plan = groups.get(group.id);
|
|
57
|
+
if (!plan) {
|
|
58
|
+
stack.push(frame(group));
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
for (const attribute of plan.attributes)
|
|
62
|
+
add(current, attribute);
|
|
63
|
+
count(node, plan.obligations);
|
|
64
|
+
current.obligations.push(...plan.obligations);
|
|
65
|
+
if (plan.wildcard)
|
|
66
|
+
current.groups.push(plan.wildcard);
|
|
67
|
+
}
|
|
68
|
+
else if (node.kind === "attributeWildcard") {
|
|
69
|
+
for (let i = 0; i < node.wildcard.namespace.value.length; i++)
|
|
70
|
+
budget.step(node);
|
|
71
|
+
if (current.explicit)
|
|
72
|
+
fail(node, "Multiple local attribute wildcards");
|
|
73
|
+
const namespace = wildcardNamespaces(node.wildcard, wildcardCharge(node));
|
|
74
|
+
count(node, namespace.namespaces);
|
|
75
|
+
current.explicit = { namespace, processContents: node.wildcard.processContents, sources: [node.id] };
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
if (node.kind !== "attributeUse")
|
|
79
|
+
fail(node, "Expected an attribute use");
|
|
80
|
+
const use = node;
|
|
81
|
+
// A prohibition inside a group contributes no use. Only a direct type
|
|
82
|
+
// restriction can remove an inherited optional attribute.
|
|
83
|
+
if (!(container.kind === "attributeGroup" && use.use === "prohibited")) {
|
|
84
|
+
const target = referenceTarget(use.declaration, nodes, use), declaration = target ? get(target) : undefined;
|
|
85
|
+
if (declaration?.kind !== "attribute")
|
|
86
|
+
fail(node, "Attribute use requires an attribute declaration");
|
|
87
|
+
const attribute = declaration;
|
|
88
|
+
const value = use.value ?? attribute.value;
|
|
89
|
+
if (use.value && attribute.value?.kind === "fixed")
|
|
90
|
+
current.obligations.push({ kind: "fixed-value-equivalence", owner: container.id, base: attribute.value, local: use.value });
|
|
91
|
+
add(current, { name: attribute.name, declaration: attribute.id, type: attribute.type, use: use.use, value, sources: [use.id] });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
current.index++;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
let wildcard = current.groups[0];
|
|
98
|
+
const intersect = (other) => {
|
|
99
|
+
if (!wildcard) {
|
|
100
|
+
wildcard = other;
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
count(container, wildcard.namespace.namespaces, other.namespace.namespaces);
|
|
104
|
+
wildcard = { ...wildcard, namespace: namespaceIntersection(wildcard.namespace, other.namespace, wildcardCharge(container)), sources: copySources(container, wildcard.sources, other.sources) };
|
|
105
|
+
};
|
|
106
|
+
for (const other of current.groups.slice(1))
|
|
107
|
+
intersect(other);
|
|
108
|
+
if (current.explicit) {
|
|
109
|
+
const groupProcess = wildcard?.processContents, localProcess = current.explicit.processContents;
|
|
110
|
+
intersect(current.explicit);
|
|
111
|
+
if (groupProcess && (typeof groupProcess !== "string" || groupProcess !== localProcess)) {
|
|
112
|
+
current.obligations.push({ kind: "group-local-wildcard-process", owner: container.id, local: current.explicit.sources[0] });
|
|
113
|
+
wildcard = { ...wildcard, processContents: { kind: "assessment-required", alternatives: canonicalSet([...(typeof groupProcess === "string" ? [groupProcess] : groupProcess.alternatives), localProcess]) } };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (wildcard)
|
|
117
|
+
current.obligations.push({ kind: "wildcard-expressibility", owner: container.id });
|
|
118
|
+
count(container, [...current.attributes.values()], current.obligations);
|
|
119
|
+
const result = { attributes: [...current.attributes.values()], wildcard, obligations: current.obligations };
|
|
120
|
+
stack.pop();
|
|
121
|
+
if (container.kind === "attributeGroup") {
|
|
122
|
+
groups.set(container.id, result);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
count(owner, result.obligations);
|
|
126
|
+
obligations.push(...result.obligations);
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
throw new Error("Attribute composition lost its root");
|
|
130
|
+
};
|
|
131
|
+
const compose = (node) => {
|
|
132
|
+
const obligations = [], local = localAttributes(node, obligations), derivation = node.derivation;
|
|
133
|
+
let content = restrictContent(node.content), attributes = local.attributes, wildcard = local.wildcard, mixed = node.mixed;
|
|
134
|
+
let scalar;
|
|
135
|
+
if (derivation) {
|
|
136
|
+
const baseId = referenceTarget(derivation.base, nodes, node), baseNode = baseId ? get(baseId) : undefined;
|
|
137
|
+
const base = baseId ? composed.get(baseId) : derivation.base.kind === "builtin" && derivation.base.name.local === "anyType"
|
|
138
|
+
? { content: [{ kind: "builtin", reference: derivation.base }], mixed: true, attributes: [], wildcard: { namespace: { kind: "not", namespaces: [] }, processContents: "lax", sources: [] }, obligations: [] } : undefined;
|
|
139
|
+
if (derivation.contentKind === "complex" && baseNode?.kind !== "complexType" && !(derivation.base.kind === "builtin" && derivation.base.name.local === "anyType"))
|
|
140
|
+
fail(node, "Complex content requires a complex base");
|
|
141
|
+
if (derivation.contentKind === "simple") {
|
|
142
|
+
if (node.content)
|
|
143
|
+
fail(node, "Simple content cannot contribute particles");
|
|
144
|
+
if (baseNode?.kind === "complexType" && !base?.scalar && (derivation.kind === "extension" || !base?.mixed))
|
|
145
|
+
fail(node, "Simple content base has no scalar content");
|
|
146
|
+
if (derivation.base.kind === "builtin" && derivation.base.name.local === "anyType" && (derivation.kind === "extension" || !derivation.inlineType))
|
|
147
|
+
fail(node, "Simple content requires a scalar base or an inline restriction type");
|
|
148
|
+
if (derivation.kind === "restriction" && !base && baseNode?.kind !== "complexType")
|
|
149
|
+
fail(node, "Simple-content restriction requires a complex base");
|
|
150
|
+
const inherited = base?.scalar;
|
|
151
|
+
for (const ignored of inherited?.layers ?? [])
|
|
152
|
+
budget.step(node);
|
|
153
|
+
scalar = { base: inherited?.base ?? derivation.inlineType ?? derivation.base, layers: [...(inherited?.layers ?? []), { owner: node.id, facets: derivation.facets, inlineType: derivation.inlineType }] };
|
|
154
|
+
obligations.push({ kind: "scalar-derivation", owner: node.id, base: derivation.base, local: derivation.inlineType });
|
|
155
|
+
}
|
|
156
|
+
if (base) {
|
|
157
|
+
count(node, base.content, base.attributes, base.obligations);
|
|
158
|
+
count(node, base.wildcard?.namespace.namespaces ?? []);
|
|
159
|
+
obligations.push(...base.obligations);
|
|
160
|
+
if (derivation.kind === "extension") {
|
|
161
|
+
if (derivation.contentKind === "complex") {
|
|
162
|
+
content = extendContent(base.content, node.content);
|
|
163
|
+
if (!node.content)
|
|
164
|
+
mixed = base.mixed;
|
|
165
|
+
}
|
|
166
|
+
const merged = new Map(base.attributes.map(a => [key(a.name), a]));
|
|
167
|
+
for (const a of local.attributes) {
|
|
168
|
+
budget.step(node);
|
|
169
|
+
const prior = merged.get(key(a.name));
|
|
170
|
+
if (a.use === "prohibited") {
|
|
171
|
+
if (prior)
|
|
172
|
+
obligations.push({ kind: "attribute-extension-equivalence", owner: node.id, base: prior.declaration, local: a.declaration });
|
|
173
|
+
continue; // Prohibition contributes no use on extension, never deletes base.
|
|
174
|
+
}
|
|
175
|
+
if (prior && prior.use !== "prohibited") {
|
|
176
|
+
if (prior.use === "required" && a.use !== "required")
|
|
177
|
+
fail(node, "Extension cannot weaken a required attribute");
|
|
178
|
+
obligations.push({ kind: "attribute-extension-equivalence", owner: node.id, base: prior.declaration, local: a.declaration });
|
|
179
|
+
if (prior.value?.kind === "fixed")
|
|
180
|
+
obligations.push({ kind: "fixed-value-equivalence", owner: node.id, base: prior.value, local: a.value });
|
|
181
|
+
}
|
|
182
|
+
merged.set(key(a.name), prior ? { ...a, sources: copySources(node, prior.sources, a.sources) } : a);
|
|
183
|
+
}
|
|
184
|
+
attributes = [...merged.values()];
|
|
185
|
+
if (base.wildcard && local.wildcard) {
|
|
186
|
+
count(node, local.wildcard.namespace.namespaces);
|
|
187
|
+
wildcard = { ...local.wildcard, namespace: namespaceUnion(base.wildcard.namespace, local.wildcard.namespace, wildcardCharge(node)), sources: copySources(node, base.wildcard.sources, local.wildcard.sources) };
|
|
188
|
+
}
|
|
189
|
+
else
|
|
190
|
+
wildcard = local.wildcard ?? base.wildcard;
|
|
191
|
+
obligations.push({ kind: "particle-extension", owner: node.id, base: baseId ?? derivation.base, local: node.content });
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
const merged = new Map(base.attributes.map(a => [key(a.name), a]));
|
|
195
|
+
for (const a of local.attributes) {
|
|
196
|
+
budget.step(node);
|
|
197
|
+
const prior = merged.get(key(a.name));
|
|
198
|
+
if (prior?.use === "required" && a.use !== "required")
|
|
199
|
+
fail(node, "Restriction cannot weaken or prohibit a required attribute");
|
|
200
|
+
if (!prior && a.use !== "prohibited" && (!base.wildcard || !allows(base.wildcard.namespace, a.name.namespace, wildcardCharge(node))))
|
|
201
|
+
fail(node, "New restricted attribute is outside the base wildcard");
|
|
202
|
+
if (prior?.value?.kind === "fixed")
|
|
203
|
+
obligations.push({ kind: "fixed-value-equivalence", owner: node.id, base: prior.value, local: a.value });
|
|
204
|
+
if (prior && a.use !== "prohibited")
|
|
205
|
+
obligations.push({ kind: "attribute-type-restriction", owner: node.id, base: prior.type, local: a.type });
|
|
206
|
+
merged.set(key(a.name), prior ? { ...a, sources: copySources(node, prior.sources, a.sources) } : a);
|
|
207
|
+
}
|
|
208
|
+
attributes = [...merged.values()];
|
|
209
|
+
wildcard = local.wildcard; // Omitted restriction wildcard is removed.
|
|
210
|
+
if (wildcard) {
|
|
211
|
+
if (!base.wildcard || !namespaceSubset(wildcard.namespace, base.wildcard.namespace, wildcardCharge(node)))
|
|
212
|
+
fail(node, "Restricted wildcard is not a subset of its base");
|
|
213
|
+
const baseProcess = base.wildcard?.processContents;
|
|
214
|
+
if (typeof wildcard.processContents === "string" && typeof baseProcess === "string" && !processContentsRestricts(wildcard.processContents, baseProcess, wildcardCharge(node)))
|
|
215
|
+
fail(node, "Restricted wildcard weakens processContents");
|
|
216
|
+
}
|
|
217
|
+
obligations.push({ kind: "particle-restriction", owner: node.id, base: baseId ?? derivation.base, local: node.content });
|
|
218
|
+
}
|
|
219
|
+
obligations.push({ kind: "mixed-content", owner: node.id, base: baseId ?? derivation.base });
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
count(node, content, attributes, obligations);
|
|
223
|
+
return deepFreeze({ id: node.id, content, mixed, attributes, wildcard, scalar, derivation, obligations, assessment: "requires-schema-assessment" });
|
|
224
|
+
};
|
|
225
|
+
// Derivation order only, never recursively traverse element/type value graphs.
|
|
226
|
+
for (const root of graph.nodes) {
|
|
227
|
+
if (root.kind !== "complexType" || composed.has(root.id))
|
|
228
|
+
continue;
|
|
229
|
+
const stack = [root], active = new Set();
|
|
230
|
+
while (stack.length) {
|
|
231
|
+
const node = stack[stack.length - 1];
|
|
232
|
+
budget.step(node);
|
|
233
|
+
if (composed.has(node.id)) {
|
|
234
|
+
stack.pop();
|
|
235
|
+
active.delete(node.id);
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
const baseId = node.derivation ? referenceTarget(node.derivation.base, nodes, node) : undefined, base = baseId ? get(baseId) : undefined;
|
|
239
|
+
if (base?.kind === "complexType" && !composed.has(base.id)) {
|
|
240
|
+
if (active.has(base.id))
|
|
241
|
+
fail(node, "Cyclic derivation supplied to composition");
|
|
242
|
+
active.add(node.id);
|
|
243
|
+
stack.push(base);
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
composed.set(node.id, compose(node));
|
|
247
|
+
stack.pop();
|
|
248
|
+
active.delete(node.id);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return deepFreeze({ resolved, types: [...composed.values()].sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0), metrics: { steps: budget.steps } });
|
|
252
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare class DataOwnershipLimitError extends RangeError {
|
|
2
|
+
}
|
|
3
|
+
export interface DataOwnershipLimits {
|
|
4
|
+
readonly maxEntries: number;
|
|
5
|
+
readonly maxText: number;
|
|
6
|
+
readonly maxDepth: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const DIRECT_METADATA_LIMITS: Readonly<{
|
|
9
|
+
maxEntries: 100000;
|
|
10
|
+
maxText: number;
|
|
11
|
+
maxDepth: 256;
|
|
12
|
+
}>;
|
|
13
|
+
export declare function createDataOwnership(chargeWork: (amount?: number) => void, limits?: DataOwnershipLimits): {
|
|
14
|
+
snapshot: <T>(value: T, check?: () => void) => T;
|
|
15
|
+
freeze: <T>(value: T) => Readonly<T>;
|
|
16
|
+
};
|
|
17
|
+
/** Routine data copies do not pretend to reserve CPU or heap. Owners enforce their input caps. */
|
|
18
|
+
export declare const dataOwnership: Readonly<{
|
|
19
|
+
snapshot: <T>(value: T, check?: () => void) => T;
|
|
20
|
+
freeze: <T>(value: T) => Readonly<T>;
|
|
21
|
+
}>;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/** Shared data ownership; the callback supplies cancellation or semantic accounting. */
|
|
2
|
+
import { types } from 'node:util';
|
|
3
|
+
export class DataOwnershipLimitError extends RangeError {
|
|
4
|
+
}
|
|
5
|
+
export const DIRECT_METADATA_LIMITS = Object.freeze({ maxEntries: 100_000, maxText: 1024 * 1024, maxDepth: 256 });
|
|
6
|
+
export function createDataOwnership(chargeWork, limits) {
|
|
7
|
+
// @why Canonical preparation revisits shared immutable source subtrees; only this owner's completed traversals are reusable.
|
|
8
|
+
const frozen = new WeakSet();
|
|
9
|
+
function arrayIndex(index) {
|
|
10
|
+
// Array positions are bounded by JavaScript's array length, so this is a
|
|
11
|
+
// constant-size numeric decision, followed by a precharged text conversion.
|
|
12
|
+
const digits = index < 10 ? 1 : index < 100 ? 2 : index < 1_000 ? 3 :
|
|
13
|
+
index < 10_000 ? 4 : index < 100_000 ? 5 : index < 1_000_000 ? 6 :
|
|
14
|
+
index < 10_000_000 ? 7 : index < 100_000_000 ? 8 : index < 1_000_000_000 ? 9 : 10;
|
|
15
|
+
chargeWork(1 + digits);
|
|
16
|
+
return String(index);
|
|
17
|
+
}
|
|
18
|
+
function snapshot(value, check) {
|
|
19
|
+
// Explicit stacks preserve sharing without recursive call-stack expansion.
|
|
20
|
+
chargeWork(3); // Identity map and source/target stacks.
|
|
21
|
+
const copied = new Map();
|
|
22
|
+
const sources = [];
|
|
23
|
+
const targets = [];
|
|
24
|
+
const depths = [];
|
|
25
|
+
let entries = 0, text = 0;
|
|
26
|
+
const countText = (length) => {
|
|
27
|
+
if (limits && length > limits.maxText - text)
|
|
28
|
+
throw new DataOwnershipLimitError('metadata text limit');
|
|
29
|
+
text += length;
|
|
30
|
+
};
|
|
31
|
+
function copy(current, depth = 0) {
|
|
32
|
+
check?.();
|
|
33
|
+
if (limits && (++entries > limits.maxEntries || depth > limits.maxDepth))
|
|
34
|
+
throw new DataOwnershipLimitError('metadata entry/depth limit');
|
|
35
|
+
chargeWork(); // Value access.
|
|
36
|
+
if (typeof current === 'string') {
|
|
37
|
+
countText(current.length);
|
|
38
|
+
chargeWork(current.length); // Produced/inspected immutable text.
|
|
39
|
+
return current;
|
|
40
|
+
}
|
|
41
|
+
if (current === null || typeof current !== 'object')
|
|
42
|
+
return current;
|
|
43
|
+
if (types.isProxy(current))
|
|
44
|
+
throw new TypeError('Metadata requires data records and arrays');
|
|
45
|
+
chargeWork(); // Identity-map read.
|
|
46
|
+
const prior = copied.get(current);
|
|
47
|
+
if (prior !== undefined)
|
|
48
|
+
return prior;
|
|
49
|
+
chargeWork(); // Array classification.
|
|
50
|
+
const array = Array.isArray(current);
|
|
51
|
+
if (!array)
|
|
52
|
+
chargeWork(); // Prototype introspection.
|
|
53
|
+
const prototype = array ? undefined : Object.getPrototypeOf(current);
|
|
54
|
+
if (!array && prototype !== Object.prototype && prototype !== null) {
|
|
55
|
+
throw new TypeError('RE01 snapshots require data records and arrays');
|
|
56
|
+
}
|
|
57
|
+
chargeWork(4); // Container, map insertion and two stack pushes.
|
|
58
|
+
const result = array ? [] : {};
|
|
59
|
+
copied.set(current, result);
|
|
60
|
+
sources.push(current);
|
|
61
|
+
targets.push(result);
|
|
62
|
+
depths.push(depth);
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
const result = copy(value);
|
|
66
|
+
while (sources.length > 0) {
|
|
67
|
+
chargeWork(2); // Both stack pops.
|
|
68
|
+
const source = sources.pop();
|
|
69
|
+
const target = targets.pop();
|
|
70
|
+
const depth = depths.pop();
|
|
71
|
+
chargeWork(); // Array classification for the traversal.
|
|
72
|
+
if (Array.isArray(source)) {
|
|
73
|
+
chargeWork(); // Length read.
|
|
74
|
+
const length = source.length;
|
|
75
|
+
if (limits && length > limits.maxEntries - entries)
|
|
76
|
+
throw new DataOwnershipLimitError('metadata entry limit');
|
|
77
|
+
for (let index = 0; index < length; index += 1) {
|
|
78
|
+
// Introspection plus its descriptor (record/four fields/35 key units),
|
|
79
|
+
// followed by the input value read and output entry.
|
|
80
|
+
chargeWork(43);
|
|
81
|
+
const descriptor = Object.getOwnPropertyDescriptor(source, arrayIndex(index));
|
|
82
|
+
if (descriptor === undefined || !('value' in descriptor)) {
|
|
83
|
+
throw new TypeError('RE01 arrays require present data entries');
|
|
84
|
+
}
|
|
85
|
+
target[index] = copy(descriptor.value, depth + 1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
for (const key in source) {
|
|
90
|
+
chargeWork(); // Own-field introspection.
|
|
91
|
+
if (!Object.hasOwn(source, key))
|
|
92
|
+
continue;
|
|
93
|
+
countText(key.length);
|
|
94
|
+
// The property descriptor is an allocated record with four fields
|
|
95
|
+
// and 35 field-name units, as well as the inspected/copied field.
|
|
96
|
+
chargeWork(83 + key.length);
|
|
97
|
+
const descriptor = Object.getOwnPropertyDescriptor(source, key);
|
|
98
|
+
if (descriptor === undefined || !('value' in descriptor)) {
|
|
99
|
+
throw new TypeError('RE01 records require data fields');
|
|
100
|
+
}
|
|
101
|
+
Object.defineProperty(target, key, {
|
|
102
|
+
value: copy(descriptor.value, depth + 1),
|
|
103
|
+
enumerable: true, configurable: true, writable: true,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
function freeze(value) {
|
|
111
|
+
chargeWork(2); // Visited set and traversal stack.
|
|
112
|
+
const seen = new Set();
|
|
113
|
+
const stack = [];
|
|
114
|
+
chargeWork();
|
|
115
|
+
stack.push(value);
|
|
116
|
+
while (stack.length > 0) {
|
|
117
|
+
chargeWork(); // Pop.
|
|
118
|
+
const current = stack.pop();
|
|
119
|
+
if (current === null || typeof current !== 'object')
|
|
120
|
+
continue;
|
|
121
|
+
chargeWork(); // Set read.
|
|
122
|
+
if (seen.has(current))
|
|
123
|
+
continue;
|
|
124
|
+
chargeWork();
|
|
125
|
+
if (frozen.has(current))
|
|
126
|
+
continue;
|
|
127
|
+
chargeWork(2); // Visit-state insertion and freeze traversal.
|
|
128
|
+
seen.add(current);
|
|
129
|
+
chargeWork(); // Array classification.
|
|
130
|
+
if (Array.isArray(current)) {
|
|
131
|
+
chargeWork(); // Length read.
|
|
132
|
+
const length = current.length;
|
|
133
|
+
for (let index = 0; index < length; index += 1) {
|
|
134
|
+
chargeWork(43); // Descriptor inspection/allocation, value read and push.
|
|
135
|
+
const descriptor = Object.getOwnPropertyDescriptor(current, arrayIndex(index));
|
|
136
|
+
if (descriptor === undefined || !('value' in descriptor)) {
|
|
137
|
+
throw new TypeError('RE01 arrays require present data entries');
|
|
138
|
+
}
|
|
139
|
+
stack.push(descriptor.value);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
for (const key in current) {
|
|
144
|
+
chargeWork(43 + key.length); // Descriptor, field access, name inspection and push.
|
|
145
|
+
const descriptor = Object.getOwnPropertyDescriptor(current, key);
|
|
146
|
+
if (descriptor === undefined)
|
|
147
|
+
continue;
|
|
148
|
+
if (!('value' in descriptor)) {
|
|
149
|
+
throw new TypeError('RE01 records require data fields');
|
|
150
|
+
}
|
|
151
|
+
stack.push(descriptor.value);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
Object.freeze(current);
|
|
155
|
+
}
|
|
156
|
+
// @constraints A shallow external freeze or interrupted traversal supplies no reusable deep-freeze evidence.
|
|
157
|
+
for (const current of seen) {
|
|
158
|
+
chargeWork(2);
|
|
159
|
+
if (!types.isProxy(current))
|
|
160
|
+
frozen.add(current);
|
|
161
|
+
}
|
|
162
|
+
return value;
|
|
163
|
+
}
|
|
164
|
+
return { snapshot, freeze };
|
|
165
|
+
}
|
|
166
|
+
/** Routine data copies do not pretend to reserve CPU or heap. Owners enforce their input caps. */
|
|
167
|
+
export const dataOwnership = Object.freeze(createDataOwnership(() => { }, DIRECT_METADATA_LIMITS));
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Neutral datatype calculations. No schema or payload authority/receipt is conferred here. */
|
|
2
|
+
import type { SemanticTypeReference as Reference } from "./semanticTypeReference.js";
|
|
3
|
+
import type { DatatypeLexicalOperand, DatatypeValueContext } from "./schemaValueContext.js";
|
|
4
|
+
import type { SyntaxSource } from '../loader/orderedSyntax.js';
|
|
5
|
+
import type { Calendar, Duration } from "./schemaExactCalendar.js";
|
|
6
|
+
export type DecimalOperand = Readonly<{
|
|
7
|
+
coefficient: bigint;
|
|
8
|
+
scale: number; /** Conservative digit bound, charged before conversion/copying. */
|
|
9
|
+
digits?: number;
|
|
10
|
+
}>;
|
|
11
|
+
export type DatatypeOperand = Readonly<{
|
|
12
|
+
family: string;
|
|
13
|
+
canonical: string;
|
|
14
|
+
length?: string;
|
|
15
|
+
decimal?: DecimalOperand;
|
|
16
|
+
ordered?: readonly DecimalOperand[];
|
|
17
|
+
zoned?: boolean;
|
|
18
|
+
/** Successful datatype/member normalization, only for schema operand checks. */
|
|
19
|
+
normalized?: string;
|
|
20
|
+
calendar?: Calendar;
|
|
21
|
+
duration?: Duration;
|
|
22
|
+
items?: readonly DatatypeOperand[];
|
|
23
|
+
selectedMembers?: readonly Reference[];
|
|
24
|
+
}>;
|
|
25
|
+
export type DatatypeListTokens = Readonly<{
|
|
26
|
+
normalized: string;
|
|
27
|
+
tokens: readonly string[];
|
|
28
|
+
source: SyntaxSource;
|
|
29
|
+
}>;
|
|
30
|
+
export declare const builtinListItem: (name: string) => "NMTOKEN" | "IDREF" | "ENTITY" | undefined;
|
|
31
|
+
export declare const builtinParents: Readonly<Record<string, string>>;
|
|
32
|
+
export declare const integerBounds: Readonly<Record<string, readonly [string | undefined, string | undefined]>>;
|
|
33
|
+
export declare const builtinPrimitive: (name: string) => string;
|
|
34
|
+
export declare const whitespaceFor: (name: string) => "preserve" | "replace" | "collapse";
|
|
35
|
+
export { normalizeWhitespace } from '../util/xmlWhitespace.js';
|
|
36
|
+
export declare function datatypeValues<Owner>(c: DatatypeValueContext<Owner>): {
|
|
37
|
+
atomic: (name: string, lexical: DatatypeLexicalOperand, owner: Owner, whitespace?: "replace" | "preserve" | "collapse") => DatatypeOperand;
|
|
38
|
+
builtin: (name: string, lexical: DatatypeLexicalOperand, owner: Owner) => DatatypeOperand;
|
|
39
|
+
listTokens: (lexical: DatatypeLexicalOperand, owner: Owner) => DatatypeListTokens;
|
|
40
|
+
listOperand: (tokens: DatatypeListTokens, items: readonly DatatypeOperand[], owner: Owner, builtinName?: string) => DatatypeOperand;
|
|
41
|
+
decimal: (text: string, owner: Owner) => DecimalOperand;
|
|
42
|
+
decimalKey: (d: DecimalOperand, owner: Owner) => string;
|
|
43
|
+
compareDecimal: (a: DecimalOperand, b: DecimalOperand, owner: Owner) => number;
|
|
44
|
+
sameValue: (a: DatatypeOperand, b: DatatypeOperand, owner: Owner) => boolean;
|
|
45
|
+
compare: (a: DatatypeOperand, b: DatatypeOperand, owner: Owner) => number | undefined;
|
|
46
|
+
};
|