@azure/provisioning-core 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +40 -0
- package/dist/browser/constructs/built-in-resources/resource-group.d.ts +50 -0
- package/dist/browser/constructs/built-in-resources/resource-group.d.ts.map +1 -0
- package/dist/browser/constructs/built-in-resources/resource-group.js +100 -0
- package/dist/browser/constructs/built-in-resources/resource-group.js.map +1 -0
- package/dist/browser/constructs/output.d.ts +80 -0
- package/dist/browser/constructs/output.d.ts.map +1 -0
- package/dist/browser/constructs/output.js +75 -0
- package/dist/browser/constructs/output.js.map +1 -0
- package/dist/browser/constructs/parameter.d.ts +77 -0
- package/dist/browser/constructs/parameter.d.ts.map +1 -0
- package/dist/browser/constructs/parameter.js +93 -0
- package/dist/browser/constructs/parameter.js.map +1 -0
- package/dist/browser/constructs/provisioning-component.d.ts +91 -0
- package/dist/browser/constructs/provisioning-component.d.ts.map +1 -0
- package/dist/browser/constructs/provisioning-component.js +150 -0
- package/dist/browser/constructs/provisioning-component.js.map +1 -0
- package/dist/browser/constructs/resource/resource-proxy.d.ts +134 -0
- package/dist/browser/constructs/resource/resource-proxy.d.ts.map +1 -0
- package/dist/browser/constructs/resource/resource-proxy.js +517 -0
- package/dist/browser/constructs/resource/resource-proxy.js.map +1 -0
- package/dist/browser/constructs/resource/resource-query.d.ts +23 -0
- package/dist/browser/constructs/resource/resource-query.d.ts.map +1 -0
- package/dist/browser/constructs/resource/resource-query.js +69 -0
- package/dist/browser/constructs/resource/resource-query.js.map +1 -0
- package/dist/browser/constructs/resource/resource-registry.d.ts +99 -0
- package/dist/browser/constructs/resource/resource-registry.d.ts.map +1 -0
- package/dist/browser/constructs/resource/resource-registry.js +51 -0
- package/dist/browser/constructs/resource/resource-registry.js.map +1 -0
- package/dist/browser/constructs/resource/resource-type-registry.d.ts +46 -0
- package/dist/browser/constructs/resource/resource-type-registry.d.ts.map +1 -0
- package/dist/browser/constructs/resource/resource-type-registry.js +156 -0
- package/dist/browser/constructs/resource/resource-type-registry.js.map +1 -0
- package/dist/browser/constructs/resource/resource-utils.d.ts +60 -0
- package/dist/browser/constructs/resource/resource-utils.d.ts.map +1 -0
- package/dist/browser/constructs/resource/resource-utils.js +75 -0
- package/dist/browser/constructs/resource/resource-utils.js.map +1 -0
- package/dist/browser/constructs/resource/resource.d.ts +460 -0
- package/dist/browser/constructs/resource/resource.d.ts.map +1 -0
- package/dist/browser/constructs/resource/resource.js +582 -0
- package/dist/browser/constructs/resource/resource.js.map +1 -0
- package/dist/browser/constructs/stack.d.ts +110 -0
- package/dist/browser/constructs/stack.d.ts.map +1 -0
- package/dist/browser/constructs/stack.js +110 -0
- package/dist/browser/constructs/stack.js.map +1 -0
- package/dist/browser/constructs/variable.d.ts +63 -0
- package/dist/browser/constructs/variable.d.ts.map +1 -0
- package/dist/browser/constructs/variable.js +74 -0
- package/dist/browser/constructs/variable.js.map +1 -0
- package/dist/browser/deployment-context/deployment-context.d.ts +27 -0
- package/dist/browser/deployment-context/deployment-context.d.ts.map +1 -0
- package/dist/browser/deployment-context/deployment-context.js +4 -0
- package/dist/browser/deployment-context/deployment-context.js.map +1 -0
- package/dist/browser/expression/ast-nodes.d.ts +100 -0
- package/dist/browser/expression/ast-nodes.d.ts.map +1 -0
- package/dist/browser/expression/ast-nodes.js +125 -0
- package/dist/browser/expression/ast-nodes.js.map +1 -0
- package/dist/browser/expression/expressions.d.ts +164 -0
- package/dist/browser/expression/expressions.d.ts.map +1 -0
- package/dist/browser/expression/expressions.js +211 -0
- package/dist/browser/expression/expressions.js.map +1 -0
- package/dist/browser/fn.d.ts +194 -0
- package/dist/browser/fn.d.ts.map +1 -0
- package/dist/browser/fn.js +334 -0
- package/dist/browser/fn.js.map +1 -0
- package/dist/browser/index.d.ts +25 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +17 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/internal.d.ts +13 -0
- package/dist/browser/internal.d.ts.map +1 -0
- package/dist/browser/internal.js +10 -0
- package/dist/browser/internal.js.map +1 -0
- package/dist/browser/naming/naming-policy.d.ts +56 -0
- package/dist/browser/naming/naming-policy.d.ts.map +1 -0
- package/dist/browser/naming/naming-policy.js +97 -0
- package/dist/browser/naming/naming-policy.js.map +1 -0
- package/dist/browser/naming/naming-rules.d.ts +15 -0
- package/dist/browser/naming/naming-rules.d.ts.map +1 -0
- package/dist/browser/naming/naming-rules.js +15 -0
- package/dist/browser/naming/naming-rules.js.map +1 -0
- package/dist/browser/package.json +8 -0
- package/dist/browser/serialization/contract/generated/ast.d.ts +508 -0
- package/dist/browser/serialization/contract/generated/ast.d.ts.map +1 -0
- package/dist/browser/serialization/contract/generated/ast.js +23 -0
- package/dist/browser/serialization/contract/generated/ast.js.map +1 -0
- package/dist/browser/serialization/contract/index.d.ts +2 -0
- package/dist/browser/serialization/contract/index.d.ts.map +1 -0
- package/dist/browser/serialization/contract/index.js +4 -0
- package/dist/browser/serialization/contract/index.js.map +1 -0
- package/dist/browser/serialization/index.d.ts +4 -0
- package/dist/browser/serialization/index.d.ts.map +1 -0
- package/dist/browser/serialization/index.js +5 -0
- package/dist/browser/serialization/index.js.map +1 -0
- package/dist/browser/serialization/json/deserialize.d.ts +24 -0
- package/dist/browser/serialization/json/deserialize.d.ts.map +1 -0
- package/dist/browser/serialization/json/deserialize.js +437 -0
- package/dist/browser/serialization/json/deserialize.js.map +1 -0
- package/dist/browser/serialization/json/encoding.d.ts +4 -0
- package/dist/browser/serialization/json/encoding.d.ts.map +1 -0
- package/dist/browser/serialization/json/encoding.js +319 -0
- package/dist/browser/serialization/json/encoding.js.map +1 -0
- package/dist/browser/serialization/json/expression.d.ts +32 -0
- package/dist/browser/serialization/json/expression.d.ts.map +1 -0
- package/dist/browser/serialization/json/expression.js +494 -0
- package/dist/browser/serialization/json/expression.js.map +1 -0
- package/dist/browser/serialization/json/lower.d.ts +41 -0
- package/dist/browser/serialization/json/lower.d.ts.map +1 -0
- package/dist/browser/serialization/json/lower.js +334 -0
- package/dist/browser/serialization/json/lower.js.map +1 -0
- package/dist/browser/serialization/json/pluralize-config.d.ts +3 -0
- package/dist/browser/serialization/json/pluralize-config.d.ts.map +1 -0
- package/dist/browser/serialization/json/pluralize-config.js +7 -0
- package/dist/browser/serialization/json/pluralize-config.js.map +1 -0
- package/dist/browser/serialization/json/serialize.d.ts +12 -0
- package/dist/browser/serialization/json/serialize.d.ts.map +1 -0
- package/dist/browser/serialization/json/serialize.js +389 -0
- package/dist/browser/serialization/json/serialize.js.map +1 -0
- package/dist/browser/serialization/json/util.d.ts +2 -0
- package/dist/browser/serialization/json/util.d.ts.map +1 -0
- package/dist/browser/serialization/json/util.js +19 -0
- package/dist/browser/serialization/json/util.js.map +1 -0
- package/dist/browser/serialization/utils.d.ts +3 -0
- package/dist/browser/serialization/utils.d.ts.map +1 -0
- package/dist/browser/serialization/utils.js +146 -0
- package/dist/browser/serialization/utils.js.map +1 -0
- package/dist/browser/shape/shape-registry.d.ts +51 -0
- package/dist/browser/shape/shape-registry.d.ts.map +1 -0
- package/dist/browser/shape/shape-registry.js +41 -0
- package/dist/browser/shape/shape-registry.js.map +1 -0
- package/dist/browser/shape/shape.d.ts +407 -0
- package/dist/browser/shape/shape.d.ts.map +1 -0
- package/dist/browser/shape/shape.js +424 -0
- package/dist/browser/shape/shape.js.map +1 -0
- package/dist/browser/shape/value-encoding.d.ts +121 -0
- package/dist/browser/shape/value-encoding.d.ts.map +1 -0
- package/dist/browser/shape/value-encoding.js +32 -0
- package/dist/browser/shape/value-encoding.js.map +1 -0
- package/dist/browser/types.d.ts +9 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +4 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/browser/util.d.ts +33 -0
- package/dist/browser/util.d.ts.map +1 -0
- package/dist/browser/util.js +74 -0
- package/dist/browser/util.js.map +1 -0
- package/dist/commonjs/constructs/built-in-resources/resource-group.d.ts +50 -0
- package/dist/commonjs/constructs/built-in-resources/resource-group.d.ts.map +1 -0
- package/dist/commonjs/constructs/built-in-resources/resource-group.js +114 -0
- package/dist/commonjs/constructs/built-in-resources/resource-group.js.map +7 -0
- package/dist/commonjs/constructs/output.d.ts +80 -0
- package/dist/commonjs/constructs/output.d.ts.map +1 -0
- package/dist/commonjs/constructs/output.js +75 -0
- package/dist/commonjs/constructs/output.js.map +7 -0
- package/dist/commonjs/constructs/parameter.d.ts +77 -0
- package/dist/commonjs/constructs/parameter.d.ts.map +1 -0
- package/dist/commonjs/constructs/parameter.js +95 -0
- package/dist/commonjs/constructs/parameter.js.map +7 -0
- package/dist/commonjs/constructs/provisioning-component.d.ts +91 -0
- package/dist/commonjs/constructs/provisioning-component.d.ts.map +1 -0
- package/dist/commonjs/constructs/provisioning-component.js +130 -0
- package/dist/commonjs/constructs/provisioning-component.js.map +7 -0
- package/dist/commonjs/constructs/resource/resource-proxy.d.ts +134 -0
- package/dist/commonjs/constructs/resource/resource-proxy.d.ts.map +1 -0
- package/dist/commonjs/constructs/resource/resource-proxy.js +456 -0
- package/dist/commonjs/constructs/resource/resource-proxy.js.map +7 -0
- package/dist/commonjs/constructs/resource/resource-query.d.ts +23 -0
- package/dist/commonjs/constructs/resource/resource-query.d.ts.map +1 -0
- package/dist/commonjs/constructs/resource/resource-query.js +68 -0
- package/dist/commonjs/constructs/resource/resource-query.js.map +7 -0
- package/dist/commonjs/constructs/resource/resource-registry.d.ts +99 -0
- package/dist/commonjs/constructs/resource/resource-registry.d.ts.map +1 -0
- package/dist/commonjs/constructs/resource/resource-registry.js +49 -0
- package/dist/commonjs/constructs/resource/resource-registry.js.map +7 -0
- package/dist/commonjs/constructs/resource/resource-type-registry.d.ts +46 -0
- package/dist/commonjs/constructs/resource/resource-type-registry.d.ts.map +1 -0
- package/dist/commonjs/constructs/resource/resource-type-registry.js +178 -0
- package/dist/commonjs/constructs/resource/resource-type-registry.js.map +7 -0
- package/dist/commonjs/constructs/resource/resource-utils.d.ts +60 -0
- package/dist/commonjs/constructs/resource/resource-utils.d.ts.map +1 -0
- package/dist/commonjs/constructs/resource/resource-utils.js +51 -0
- package/dist/commonjs/constructs/resource/resource-utils.js.map +7 -0
- package/dist/commonjs/constructs/resource/resource.d.ts +460 -0
- package/dist/commonjs/constructs/resource/resource.d.ts.map +1 -0
- package/dist/commonjs/constructs/resource/resource.js +455 -0
- package/dist/commonjs/constructs/resource/resource.js.map +7 -0
- package/dist/commonjs/constructs/stack.d.ts +110 -0
- package/dist/commonjs/constructs/stack.d.ts.map +1 -0
- package/dist/commonjs/constructs/stack.js +101 -0
- package/dist/commonjs/constructs/stack.js.map +7 -0
- package/dist/commonjs/constructs/variable.d.ts +63 -0
- package/dist/commonjs/constructs/variable.d.ts.map +1 -0
- package/dist/commonjs/constructs/variable.js +85 -0
- package/dist/commonjs/constructs/variable.js.map +7 -0
- package/dist/commonjs/deployment-context/deployment-context.d.ts +27 -0
- package/dist/commonjs/deployment-context/deployment-context.d.ts.map +1 -0
- package/dist/commonjs/deployment-context/deployment-context.js +16 -0
- package/dist/commonjs/deployment-context/deployment-context.js.map +7 -0
- package/dist/commonjs/expression/ast-nodes.d.ts +100 -0
- package/dist/commonjs/expression/ast-nodes.d.ts.map +1 -0
- package/dist/commonjs/expression/ast-nodes.js +152 -0
- package/dist/commonjs/expression/ast-nodes.js.map +7 -0
- package/dist/commonjs/expression/expressions.d.ts +164 -0
- package/dist/commonjs/expression/expressions.d.ts.map +1 -0
- package/dist/commonjs/expression/expressions.js +171 -0
- package/dist/commonjs/expression/expressions.js.map +7 -0
- package/dist/commonjs/fn.d.ts +194 -0
- package/dist/commonjs/fn.d.ts.map +1 -0
- package/dist/commonjs/fn.js +382 -0
- package/dist/commonjs/fn.js.map +7 -0
- package/dist/commonjs/index.d.ts +25 -0
- package/dist/commonjs/index.d.ts.map +1 -0
- package/dist/commonjs/index.js +93 -0
- package/dist/commonjs/index.js.map +7 -0
- package/dist/commonjs/internal.d.ts +13 -0
- package/dist/commonjs/internal.d.ts.map +1 -0
- package/dist/commonjs/internal.js +88 -0
- package/dist/commonjs/internal.js.map +7 -0
- package/dist/commonjs/naming/naming-policy.d.ts +56 -0
- package/dist/commonjs/naming/naming-policy.d.ts.map +1 -0
- package/dist/commonjs/naming/naming-policy.js +99 -0
- package/dist/commonjs/naming/naming-policy.js.map +7 -0
- package/dist/commonjs/naming/naming-rules.d.ts +15 -0
- package/dist/commonjs/naming/naming-rules.d.ts.map +1 -0
- package/dist/commonjs/naming/naming-rules.js +39 -0
- package/dist/commonjs/naming/naming-rules.js.map +7 -0
- package/dist/commonjs/package.json +8 -0
- package/dist/commonjs/serialization/contract/generated/ast.d.ts +508 -0
- package/dist/commonjs/serialization/contract/generated/ast.d.ts.map +1 -0
- package/dist/commonjs/serialization/contract/generated/ast.js +40 -0
- package/dist/commonjs/serialization/contract/generated/ast.js.map +7 -0
- package/dist/commonjs/serialization/contract/index.d.ts +2 -0
- package/dist/commonjs/serialization/contract/index.d.ts.map +1 -0
- package/dist/commonjs/serialization/contract/index.js +22 -0
- package/dist/commonjs/serialization/contract/index.js.map +7 -0
- package/dist/commonjs/serialization/index.d.ts +4 -0
- package/dist/commonjs/serialization/index.d.ts.map +1 -0
- package/dist/commonjs/serialization/index.js +31 -0
- package/dist/commonjs/serialization/index.js.map +7 -0
- package/dist/commonjs/serialization/json/deserialize.d.ts +24 -0
- package/dist/commonjs/serialization/json/deserialize.d.ts.map +1 -0
- package/dist/commonjs/serialization/json/deserialize.js +385 -0
- package/dist/commonjs/serialization/json/deserialize.js.map +7 -0
- package/dist/commonjs/serialization/json/encoding.d.ts +4 -0
- package/dist/commonjs/serialization/json/encoding.d.ts.map +1 -0
- package/dist/commonjs/serialization/json/encoding.js +306 -0
- package/dist/commonjs/serialization/json/encoding.js.map +7 -0
- package/dist/commonjs/serialization/json/expression.d.ts +32 -0
- package/dist/commonjs/serialization/json/expression.d.ts.map +1 -0
- package/dist/commonjs/serialization/json/expression.js +509 -0
- package/dist/commonjs/serialization/json/expression.js.map +7 -0
- package/dist/commonjs/serialization/json/lower.d.ts +41 -0
- package/dist/commonjs/serialization/json/lower.d.ts.map +1 -0
- package/dist/commonjs/serialization/json/lower.js +272 -0
- package/dist/commonjs/serialization/json/lower.js.map +7 -0
- package/dist/commonjs/serialization/json/pluralize-config.d.ts +3 -0
- package/dist/commonjs/serialization/json/pluralize-config.d.ts.map +1 -0
- package/dist/commonjs/serialization/json/pluralize-config.js +37 -0
- package/dist/commonjs/serialization/json/pluralize-config.js.map +7 -0
- package/dist/commonjs/serialization/json/serialize.d.ts +12 -0
- package/dist/commonjs/serialization/json/serialize.d.ts.map +1 -0
- package/dist/commonjs/serialization/json/serialize.js +352 -0
- package/dist/commonjs/serialization/json/serialize.js.map +7 -0
- package/dist/commonjs/serialization/json/util.d.ts +2 -0
- package/dist/commonjs/serialization/json/util.d.ts.map +1 -0
- package/dist/commonjs/serialization/json/util.js +37 -0
- package/dist/commonjs/serialization/json/util.js.map +7 -0
- package/dist/commonjs/serialization/utils.d.ts +3 -0
- package/dist/commonjs/serialization/utils.d.ts.map +1 -0
- package/dist/commonjs/serialization/utils.js +169 -0
- package/dist/commonjs/serialization/utils.js.map +7 -0
- package/dist/commonjs/shape/shape-registry.d.ts +51 -0
- package/dist/commonjs/shape/shape-registry.d.ts.map +1 -0
- package/dist/commonjs/shape/shape-registry.js +40 -0
- package/dist/commonjs/shape/shape-registry.js.map +7 -0
- package/dist/commonjs/shape/shape.d.ts +407 -0
- package/dist/commonjs/shape/shape.d.ts.map +1 -0
- package/dist/commonjs/shape/shape.js +290 -0
- package/dist/commonjs/shape/shape.js.map +7 -0
- package/dist/commonjs/shape/value-encoding.d.ts +121 -0
- package/dist/commonjs/shape/value-encoding.d.ts.map +1 -0
- package/dist/commonjs/shape/value-encoding.js +62 -0
- package/dist/commonjs/shape/value-encoding.js.map +7 -0
- package/dist/commonjs/tsdoc-metadata.json +11 -0
- package/dist/commonjs/types.d.ts +9 -0
- package/dist/commonjs/types.d.ts.map +1 -0
- package/dist/commonjs/types.js +16 -0
- package/dist/commonjs/types.js.map +7 -0
- package/dist/commonjs/util.d.ts +33 -0
- package/dist/commonjs/util.d.ts.map +1 -0
- package/dist/commonjs/util.js +73 -0
- package/dist/commonjs/util.js.map +7 -0
- package/dist/esm/constructs/built-in-resources/resource-group.d.ts +50 -0
- package/dist/esm/constructs/built-in-resources/resource-group.d.ts.map +1 -0
- package/dist/esm/constructs/built-in-resources/resource-group.js +100 -0
- package/dist/esm/constructs/built-in-resources/resource-group.js.map +1 -0
- package/dist/esm/constructs/output.d.ts +80 -0
- package/dist/esm/constructs/output.d.ts.map +1 -0
- package/dist/esm/constructs/output.js +75 -0
- package/dist/esm/constructs/output.js.map +1 -0
- package/dist/esm/constructs/parameter.d.ts +77 -0
- package/dist/esm/constructs/parameter.d.ts.map +1 -0
- package/dist/esm/constructs/parameter.js +93 -0
- package/dist/esm/constructs/parameter.js.map +1 -0
- package/dist/esm/constructs/provisioning-component.d.ts +91 -0
- package/dist/esm/constructs/provisioning-component.d.ts.map +1 -0
- package/dist/esm/constructs/provisioning-component.js +150 -0
- package/dist/esm/constructs/provisioning-component.js.map +1 -0
- package/dist/esm/constructs/resource/resource-proxy.d.ts +134 -0
- package/dist/esm/constructs/resource/resource-proxy.d.ts.map +1 -0
- package/dist/esm/constructs/resource/resource-proxy.js +517 -0
- package/dist/esm/constructs/resource/resource-proxy.js.map +1 -0
- package/dist/esm/constructs/resource/resource-query.d.ts +23 -0
- package/dist/esm/constructs/resource/resource-query.d.ts.map +1 -0
- package/dist/esm/constructs/resource/resource-query.js +69 -0
- package/dist/esm/constructs/resource/resource-query.js.map +1 -0
- package/dist/esm/constructs/resource/resource-registry.d.ts +99 -0
- package/dist/esm/constructs/resource/resource-registry.d.ts.map +1 -0
- package/dist/esm/constructs/resource/resource-registry.js +51 -0
- package/dist/esm/constructs/resource/resource-registry.js.map +1 -0
- package/dist/esm/constructs/resource/resource-type-registry.d.ts +46 -0
- package/dist/esm/constructs/resource/resource-type-registry.d.ts.map +1 -0
- package/dist/esm/constructs/resource/resource-type-registry.js +156 -0
- package/dist/esm/constructs/resource/resource-type-registry.js.map +1 -0
- package/dist/esm/constructs/resource/resource-utils.d.ts +60 -0
- package/dist/esm/constructs/resource/resource-utils.d.ts.map +1 -0
- package/dist/esm/constructs/resource/resource-utils.js +75 -0
- package/dist/esm/constructs/resource/resource-utils.js.map +1 -0
- package/dist/esm/constructs/resource/resource.d.ts +460 -0
- package/dist/esm/constructs/resource/resource.d.ts.map +1 -0
- package/dist/esm/constructs/resource/resource.js +582 -0
- package/dist/esm/constructs/resource/resource.js.map +1 -0
- package/dist/esm/constructs/stack.d.ts +110 -0
- package/dist/esm/constructs/stack.d.ts.map +1 -0
- package/dist/esm/constructs/stack.js +110 -0
- package/dist/esm/constructs/stack.js.map +1 -0
- package/dist/esm/constructs/variable.d.ts +63 -0
- package/dist/esm/constructs/variable.d.ts.map +1 -0
- package/dist/esm/constructs/variable.js +74 -0
- package/dist/esm/constructs/variable.js.map +1 -0
- package/dist/esm/deployment-context/deployment-context.d.ts +27 -0
- package/dist/esm/deployment-context/deployment-context.d.ts.map +1 -0
- package/dist/esm/deployment-context/deployment-context.js +4 -0
- package/dist/esm/deployment-context/deployment-context.js.map +1 -0
- package/dist/esm/expression/ast-nodes.d.ts +100 -0
- package/dist/esm/expression/ast-nodes.d.ts.map +1 -0
- package/dist/esm/expression/ast-nodes.js +125 -0
- package/dist/esm/expression/ast-nodes.js.map +1 -0
- package/dist/esm/expression/expressions.d.ts +164 -0
- package/dist/esm/expression/expressions.d.ts.map +1 -0
- package/dist/esm/expression/expressions.js +211 -0
- package/dist/esm/expression/expressions.js.map +1 -0
- package/dist/esm/fn.d.ts +194 -0
- package/dist/esm/fn.d.ts.map +1 -0
- package/dist/esm/fn.js +334 -0
- package/dist/esm/fn.js.map +1 -0
- package/dist/esm/index.d.ts +25 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +17 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal.d.ts +13 -0
- package/dist/esm/internal.d.ts.map +1 -0
- package/dist/esm/internal.js +10 -0
- package/dist/esm/internal.js.map +1 -0
- package/dist/esm/naming/naming-policy.d.ts +56 -0
- package/dist/esm/naming/naming-policy.d.ts.map +1 -0
- package/dist/esm/naming/naming-policy.js +97 -0
- package/dist/esm/naming/naming-policy.js.map +1 -0
- package/dist/esm/naming/naming-rules.d.ts +15 -0
- package/dist/esm/naming/naming-rules.d.ts.map +1 -0
- package/dist/esm/naming/naming-rules.js +15 -0
- package/dist/esm/naming/naming-rules.js.map +1 -0
- package/dist/esm/package.json +8 -0
- package/dist/esm/serialization/contract/generated/ast.d.ts +508 -0
- package/dist/esm/serialization/contract/generated/ast.d.ts.map +1 -0
- package/dist/esm/serialization/contract/generated/ast.js +23 -0
- package/dist/esm/serialization/contract/generated/ast.js.map +1 -0
- package/dist/esm/serialization/contract/index.d.ts +2 -0
- package/dist/esm/serialization/contract/index.d.ts.map +1 -0
- package/dist/esm/serialization/contract/index.js +4 -0
- package/dist/esm/serialization/contract/index.js.map +1 -0
- package/dist/esm/serialization/index.d.ts +4 -0
- package/dist/esm/serialization/index.d.ts.map +1 -0
- package/dist/esm/serialization/index.js +5 -0
- package/dist/esm/serialization/index.js.map +1 -0
- package/dist/esm/serialization/json/deserialize.d.ts +24 -0
- package/dist/esm/serialization/json/deserialize.d.ts.map +1 -0
- package/dist/esm/serialization/json/deserialize.js +437 -0
- package/dist/esm/serialization/json/deserialize.js.map +1 -0
- package/dist/esm/serialization/json/encoding.d.ts +4 -0
- package/dist/esm/serialization/json/encoding.d.ts.map +1 -0
- package/dist/esm/serialization/json/encoding.js +319 -0
- package/dist/esm/serialization/json/encoding.js.map +1 -0
- package/dist/esm/serialization/json/expression.d.ts +32 -0
- package/dist/esm/serialization/json/expression.d.ts.map +1 -0
- package/dist/esm/serialization/json/expression.js +494 -0
- package/dist/esm/serialization/json/expression.js.map +1 -0
- package/dist/esm/serialization/json/lower.d.ts +41 -0
- package/dist/esm/serialization/json/lower.d.ts.map +1 -0
- package/dist/esm/serialization/json/lower.js +334 -0
- package/dist/esm/serialization/json/lower.js.map +1 -0
- package/dist/esm/serialization/json/pluralize-config.d.ts +3 -0
- package/dist/esm/serialization/json/pluralize-config.d.ts.map +1 -0
- package/dist/esm/serialization/json/pluralize-config.js +7 -0
- package/dist/esm/serialization/json/pluralize-config.js.map +1 -0
- package/dist/esm/serialization/json/serialize.d.ts +12 -0
- package/dist/esm/serialization/json/serialize.d.ts.map +1 -0
- package/dist/esm/serialization/json/serialize.js +389 -0
- package/dist/esm/serialization/json/serialize.js.map +1 -0
- package/dist/esm/serialization/json/util.d.ts +2 -0
- package/dist/esm/serialization/json/util.d.ts.map +1 -0
- package/dist/esm/serialization/json/util.js +19 -0
- package/dist/esm/serialization/json/util.js.map +1 -0
- package/dist/esm/serialization/utils.d.ts +3 -0
- package/dist/esm/serialization/utils.d.ts.map +1 -0
- package/dist/esm/serialization/utils.js +146 -0
- package/dist/esm/serialization/utils.js.map +1 -0
- package/dist/esm/shape/shape-registry.d.ts +51 -0
- package/dist/esm/shape/shape-registry.d.ts.map +1 -0
- package/dist/esm/shape/shape-registry.js +41 -0
- package/dist/esm/shape/shape-registry.js.map +1 -0
- package/dist/esm/shape/shape.d.ts +407 -0
- package/dist/esm/shape/shape.d.ts.map +1 -0
- package/dist/esm/shape/shape.js +424 -0
- package/dist/esm/shape/shape.js.map +1 -0
- package/dist/esm/shape/value-encoding.d.ts +121 -0
- package/dist/esm/shape/value-encoding.d.ts.map +1 -0
- package/dist/esm/shape/value-encoding.js +32 -0
- package/dist/esm/shape/value-encoding.js.map +1 -0
- package/dist/esm/types.d.ts +9 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +4 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/util.d.ts +33 -0
- package/dist/esm/util.d.ts.map +1 -0
- package/dist/esm/util.js +74 -0
- package/dist/esm/util.js.map +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
import { isResourceDeclaration, isLoopedResource, isLoopedResourceOf } from "./resource-utils.js";
|
|
4
|
+
import { deref } from "./resource-proxy.js";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Query engine (module-private)
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Imports only brand guards (`resource-utils`) — which do not import
|
|
9
|
+
// `ProvisioningComponent`/`Stack` at runtime — plus types (type-only), so there is no
|
|
10
|
+
// import cycle.
|
|
11
|
+
/**
|
|
12
|
+
* Collect the resource declarations beneath `root` (the root itself is never
|
|
13
|
+
* included). `recursive` descends the whole subtree via `visit`; otherwise
|
|
14
|
+
* only `root`'s direct children are considered. `wantLooped` selects the
|
|
15
|
+
* looped declarations (`Ctor.fromLoop(...)`) vs. the scalar ones.
|
|
16
|
+
*/
|
|
17
|
+
function collectResourcesUnder(root, wantLooped, recursive) {
|
|
18
|
+
const result = [];
|
|
19
|
+
const consider = (node) => {
|
|
20
|
+
if (!isResourceDeclaration(node))
|
|
21
|
+
return;
|
|
22
|
+
const r = node.self;
|
|
23
|
+
if (isLoopedResource(r) === wantLooped)
|
|
24
|
+
result.push(r);
|
|
25
|
+
};
|
|
26
|
+
for (const child of root.children) {
|
|
27
|
+
if (recursive)
|
|
28
|
+
child.visit(consider);
|
|
29
|
+
else
|
|
30
|
+
consider(child);
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Engine entry points — thin, loosely-typed; `Stack` supplies the public
|
|
36
|
+
// typed overloads and delegates here.
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
/** Scalar (un-looped) resource declarations. */
|
|
39
|
+
export function getResources(root, typeOrOptions, maybeOptions) {
|
|
40
|
+
const isCtor = typeof typeOrOptions === "function";
|
|
41
|
+
const type = isCtor ? typeOrOptions : undefined;
|
|
42
|
+
const options = (isCtor ? maybeOptions : typeOrOptions);
|
|
43
|
+
const recursive = options?.recursive ?? true;
|
|
44
|
+
const found = collectResourcesUnder(root, false, recursive);
|
|
45
|
+
return type === undefined ? found : found.filter((r) => r instanceof type);
|
|
46
|
+
}
|
|
47
|
+
/** Loop-expanded resource declarations (`Ctor.fromLoop(...)`). */
|
|
48
|
+
export function getLoopedResources(root, typeOrOptions, maybeOptions) {
|
|
49
|
+
const isCtor = typeof typeOrOptions === "function";
|
|
50
|
+
const type = isCtor ? typeOrOptions : undefined;
|
|
51
|
+
const options = (isCtor ? maybeOptions : typeOrOptions);
|
|
52
|
+
const recursive = options?.recursive ?? true;
|
|
53
|
+
const found = collectResourcesUnder(root, true, recursive);
|
|
54
|
+
return type === undefined ? found : found.filter((r) => isLoopedResourceOf(r, type));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* First scalar resource of `type` whose literal name equals `name`, or
|
|
58
|
+
* `undefined`. `deref` resolves the name's expression proxy to its literal
|
|
59
|
+
* (a `Resource`'s `name` is an `Expression`, so `r.name === name` is always
|
|
60
|
+
* false without it).
|
|
61
|
+
*/
|
|
62
|
+
export function getResource(root, type, name, options) {
|
|
63
|
+
for (const r of getResources(root, type, options)) {
|
|
64
|
+
if (deref(r.name) === name)
|
|
65
|
+
return r;
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=resource-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-query.js","sourceRoot":"","sources":["../../../../src/constructs/resource/resource-query.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { isResourceDeclaration, isLoopedResource, isLoopedResourceOf } from \"./resource-utils.js\";\nimport { deref } from \"./resource-proxy.js\";\nimport type { ProvisioningComponent } from \"../provisioning-component.js\";\nimport type { LoopedResource, Resource } from \"./resource.js\";\nimport type { ResourceCtor } from \"./resource-registry.js\";\n\n// ---------------------------------------------------------------------------\n// Query result types\n// ---------------------------------------------------------------------------\n\n/** Options accepted by the `Stack` resource queries. */\nexport interface QueryOptions {\n /**\n * Whether to walk the stack's entire subtree (default `true`) or only its\n * **direct children** (`false`).\n */\n readonly recursive?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Query engine (module-private)\n// ---------------------------------------------------------------------------\n// Imports only brand guards (`resource-utils`) — which do not import\n// `ProvisioningComponent`/`Stack` at runtime — plus types (type-only), so there is no\n// import cycle.\n\n/**\n * Collect the resource declarations beneath `root` (the root itself is never\n * included). `recursive` descends the whole subtree via `visit`; otherwise\n * only `root`'s direct children are considered. `wantLooped` selects the\n * looped declarations (`Ctor.fromLoop(...)`) vs. the scalar ones.\n */\nfunction collectResourcesUnder(\n root: ProvisioningComponent,\n wantLooped: boolean,\n recursive: boolean,\n): (Resource | LoopedResource<Resource>)[] {\n const result: (Resource | LoopedResource<Resource>)[] = [];\n const consider = (node: ProvisioningComponent): void => {\n if (!isResourceDeclaration(node)) return;\n const r = node.self as Resource | LoopedResource<Resource>;\n if (isLoopedResource(r) === wantLooped) result.push(r);\n };\n for (const child of root.children) {\n if (recursive) child.visit(consider);\n else consider(child);\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Engine entry points — thin, loosely-typed; `Stack` supplies the public\n// typed overloads and delegates here.\n// ---------------------------------------------------------------------------\n\n/** Scalar (un-looped) resource declarations. */\nexport function getResources(\n root: ProvisioningComponent,\n typeOrOptions?: ResourceCtor<Resource> | QueryOptions,\n maybeOptions?: QueryOptions,\n): Resource[] {\n const isCtor = typeof typeOrOptions === \"function\";\n const type = isCtor ? (typeOrOptions as ResourceCtor<Resource>) : undefined;\n const options = (isCtor ? maybeOptions : typeOrOptions) as QueryOptions | undefined;\n const recursive = options?.recursive ?? true;\n const found = collectResourcesUnder(root, false, recursive) as Resource[];\n return type === undefined ? found : found.filter((r) => r instanceof type);\n}\n\n/** Loop-expanded resource declarations (`Ctor.fromLoop(...)`). */\nexport function getLoopedResources(\n root: ProvisioningComponent,\n typeOrOptions?: ResourceCtor<Resource> | QueryOptions,\n maybeOptions?: QueryOptions,\n): LoopedResource<Resource>[] {\n const isCtor = typeof typeOrOptions === \"function\";\n const type = isCtor ? (typeOrOptions as ResourceCtor<Resource>) : undefined;\n const options = (isCtor ? maybeOptions : typeOrOptions) as QueryOptions | undefined;\n const recursive = options?.recursive ?? true;\n const found = collectResourcesUnder(root, true, recursive) as LoopedResource<Resource>[];\n return type === undefined ? found : found.filter((r) => isLoopedResourceOf(r, type));\n}\n\n/**\n * First scalar resource of `type` whose literal name equals `name`, or\n * `undefined`. `deref` resolves the name's expression proxy to its literal\n * (a `Resource`'s `name` is an `Expression`, so `r.name === name` is always\n * false without it).\n */\nexport function getResource<T extends Resource>(\n root: ProvisioningComponent,\n type: ResourceCtor<T>,\n name: string,\n options?: QueryOptions,\n): T | undefined {\n for (const r of getResources(root, type, options)) {\n if (deref((r as Resource).name) === name) return r as T;\n }\n return undefined;\n}\n"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global registry mapping a resource class's registry key to its
|
|
3
|
+
* constructor.
|
|
4
|
+
*
|
|
5
|
+
* Populated at module load by each class's `static {}` initializer
|
|
6
|
+
* (via {@link Resource.register}). The deserializer reads this
|
|
7
|
+
* registry to construct the correct class instance — preserving
|
|
8
|
+
* identity, prototype methods, and constructor-initialized child
|
|
9
|
+
* collections — instead of materialising a base `Resource`.
|
|
10
|
+
*
|
|
11
|
+
* Each `type@apiVersion` entry is either one flat constructor or a flat list
|
|
12
|
+
* of concrete constructors paired with ordered variant selectors. A selector
|
|
13
|
+
* can contain singleton `name`, model discriminators such as `kind`, and
|
|
14
|
+
* nested discriminator segments.
|
|
15
|
+
*
|
|
16
|
+
* Resolution has two modes:
|
|
17
|
+
*
|
|
18
|
+
* - **Best-effort (default).** Exact `(type, apiVersion)` first, then
|
|
19
|
+
* falls back to the highest registered `apiVersion` for the same
|
|
20
|
+
* selector. Enables
|
|
21
|
+
* deserializing older JSON against a newer package version without
|
|
22
|
+
* losing typed handles.
|
|
23
|
+
* - **Strict** (opt-in via `{ strict: true }`). Exact match only;
|
|
24
|
+
* returns `undefined` for any apiVersion the package doesn't ship.
|
|
25
|
+
*
|
|
26
|
+
* The shared registry tracks the highest `apiVersion` per `(type, selector)`.
|
|
27
|
+
* Best-effort lookups consult it in O(1); no scanning is needed.
|
|
28
|
+
*
|
|
29
|
+
* Keyed on a process-global symbol so multiple copies of `@azure/provisioning-core`
|
|
30
|
+
* in the same realm share one registry, mirroring the cross-realm
|
|
31
|
+
* strategy used by {@link isResource}'s brand symbol.
|
|
32
|
+
*/
|
|
33
|
+
import type { Resource } from "./resource.js";
|
|
34
|
+
import { type FlatVariantSelector } from "./resource-type-registry.js";
|
|
35
|
+
/**
|
|
36
|
+
* A `Resource` class that's eligible to live in the registry.
|
|
37
|
+
*
|
|
38
|
+
* - The construct signature uses `any` for both `context` and `props`
|
|
39
|
+
* because concrete classes narrow these (child resources require a
|
|
40
|
+
* specific parent class as context; each resource has its own `Props`
|
|
41
|
+
* shape). TypeScript's parameter contravariance would reject any
|
|
42
|
+
* concrete parameter types here. The deserializer is the sole caller
|
|
43
|
+
* of resolved constructors and forwards already-correct values it
|
|
44
|
+
* built from the wire document.
|
|
45
|
+
* - The two static fields `resourceType` and `apiVersion` form the
|
|
46
|
+
* registry key and are always present on emitter-generated classes
|
|
47
|
+
* (and on the hand-maintained `ResourceGroup`).
|
|
48
|
+
* - The generic `T` propagates the instance type — used by the query
|
|
49
|
+
* API (`stack.getResources(KeyVault)` → `KeyVault[]`) to narrow
|
|
50
|
+
* return types without needing a separate descriptor object.
|
|
51
|
+
*/
|
|
52
|
+
export type ResourceCtor<T extends Resource = Resource> = {
|
|
53
|
+
new (context: any, props: any, options?: any): T;
|
|
54
|
+
readonly resourceType: string;
|
|
55
|
+
readonly apiVersion: string;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Options controlling how {@link resolveResource} handles
|
|
59
|
+
* apiVersion mismatches.
|
|
60
|
+
*/
|
|
61
|
+
export interface ResolveOptions {
|
|
62
|
+
/**
|
|
63
|
+
* When `true`, only an exact `(resourceType, apiVersion)` match is
|
|
64
|
+
* returned; the best-effort fallback to the highest registered
|
|
65
|
+
* version for the type is skipped. Defaults to `false`.
|
|
66
|
+
*/
|
|
67
|
+
readonly strict?: boolean;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Register `ctor` as the canonical class for its
|
|
71
|
+
* `(resourceType, apiVersion[, variantSelector])` key.
|
|
72
|
+
*
|
|
73
|
+
* Pass an ordered selector for variants; omit it for ordinary resources.
|
|
74
|
+
* Re-registering the same constructor for the
|
|
75
|
+
* same key is a silent no-op so module-graph re-entry (test
|
|
76
|
+
* harnesses, dual-format builds) is safe. Registering a *different*
|
|
77
|
+
* constructor for an existing key throws — that's a genuine conflict
|
|
78
|
+
* (e.g. two packages claiming the same ARM type).
|
|
79
|
+
*
|
|
80
|
+
* A `(resourceType, apiVersion)` pair is either entirely flat or entirely
|
|
81
|
+
* variant-based. Attempting to mix both modes throws,
|
|
82
|
+
* preserving the invariant the deserializer relies on.
|
|
83
|
+
*/
|
|
84
|
+
export declare function registerResource(ctor: ResourceCtor, variantSelector?: FlatVariantSelector): void;
|
|
85
|
+
/**
|
|
86
|
+
* Resolve the registered class for a wire resource.
|
|
87
|
+
*
|
|
88
|
+
* Default is best-effort:
|
|
89
|
+
* 1. Try the exact `(type, apiVersion)` entry and match its selectors
|
|
90
|
+
* against ARM-side keys in `state`.
|
|
91
|
+
* 2. On miss, retry with the highest registered version of each selector.
|
|
92
|
+
*
|
|
93
|
+
* Pass `{ strict: true }` to skip step 2 and require an exact match.
|
|
94
|
+
*
|
|
95
|
+
* Returns `undefined` when nothing matches — callers (notably the
|
|
96
|
+
* deserializer) then fall back to constructing a base `Resource`.
|
|
97
|
+
*/
|
|
98
|
+
export declare function resolveResource(type: string, apiVersion: string, state?: Record<string, unknown>, options?: ResolveOptions): ResourceCtor | undefined;
|
|
99
|
+
//# sourceMappingURL=resource-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-registry.d.ts","sourceRoot":"","sources":["../../../../src/constructs/resource/resource-registry.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAE7F;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI;IACxD,KAAK,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;IACjD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAkBD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAEhG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE,cAAc,GACvB,YAAY,GAAG,SAAS,CAK1B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
import { ResourceTypeRegistry } from "./resource-type-registry.js";
|
|
4
|
+
const REGISTRY_SYMBOL = Symbol.for("@azure/provisioning-core.resourceRegistry");
|
|
5
|
+
function getRegistry() {
|
|
6
|
+
const host = globalThis;
|
|
7
|
+
let registry = host[REGISTRY_SYMBOL];
|
|
8
|
+
if (registry === undefined) {
|
|
9
|
+
registry = new ResourceTypeRegistry();
|
|
10
|
+
host[REGISTRY_SYMBOL] = registry;
|
|
11
|
+
}
|
|
12
|
+
return registry;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Register `ctor` as the canonical class for its
|
|
16
|
+
* `(resourceType, apiVersion[, variantSelector])` key.
|
|
17
|
+
*
|
|
18
|
+
* Pass an ordered selector for variants; omit it for ordinary resources.
|
|
19
|
+
* Re-registering the same constructor for the
|
|
20
|
+
* same key is a silent no-op so module-graph re-entry (test
|
|
21
|
+
* harnesses, dual-format builds) is safe. Registering a *different*
|
|
22
|
+
* constructor for an existing key throws — that's a genuine conflict
|
|
23
|
+
* (e.g. two packages claiming the same ARM type).
|
|
24
|
+
*
|
|
25
|
+
* A `(resourceType, apiVersion)` pair is either entirely flat or entirely
|
|
26
|
+
* variant-based. Attempting to mix both modes throws,
|
|
27
|
+
* preserving the invariant the deserializer relies on.
|
|
28
|
+
*/
|
|
29
|
+
export function registerResource(ctor, variantSelector) {
|
|
30
|
+
getRegistry().register(ctor.resourceType, ctor.apiVersion, ctor, variantSelector);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the registered class for a wire resource.
|
|
34
|
+
*
|
|
35
|
+
* Default is best-effort:
|
|
36
|
+
* 1. Try the exact `(type, apiVersion)` entry and match its selectors
|
|
37
|
+
* against ARM-side keys in `state`.
|
|
38
|
+
* 2. On miss, retry with the highest registered version of each selector.
|
|
39
|
+
*
|
|
40
|
+
* Pass `{ strict: true }` to skip step 2 and require an exact match.
|
|
41
|
+
*
|
|
42
|
+
* Returns `undefined` when nothing matches — callers (notably the
|
|
43
|
+
* deserializer) then fall back to constructing a base `Resource`.
|
|
44
|
+
*/
|
|
45
|
+
export function resolveResource(type, apiVersion, state, options) {
|
|
46
|
+
return getRegistry().resolve(type, apiVersion, state ?? {}, {
|
|
47
|
+
strict: options?.strict ?? false,
|
|
48
|
+
valueKeyedBy: "arm",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=resource-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-registry.js","sourceRoot":"","sources":["../../../../src/constructs/resource/resource-registry.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAoClC,OAAO,EAAE,oBAAoB,EAA4B,MAAM,6BAA6B,CAAC;AAsC7F,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;AAMhF,SAAS,WAAW;IAClB,MAAM,IAAI,GAAG,UAAqC,CAAC;IACnD,IAAI,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;IACrC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,QAAQ,GAAG,IAAI,oBAAoB,EAAgB,CAAC;QACpD,IAAI,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC;IACnC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAkB,EAAE,eAAqC;IACxF,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,UAAkB,EAClB,KAA+B,EAC/B,OAAwB;IAExB,OAAO,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,IAAI,EAAE,EAAE;QAC1D,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK;QAChC,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;AACL,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Global registry mapping a resource class's registry key to its\n * constructor.\n *\n * Populated at module load by each class's `static {}` initializer\n * (via {@link Resource.register}). The deserializer reads this\n * registry to construct the correct class instance — preserving\n * identity, prototype methods, and constructor-initialized child\n * collections — instead of materialising a base `Resource`.\n *\n * Each `type@apiVersion` entry is either one flat constructor or a flat list\n * of concrete constructors paired with ordered variant selectors. A selector\n * can contain singleton `name`, model discriminators such as `kind`, and\n * nested discriminator segments.\n *\n * Resolution has two modes:\n *\n * - **Best-effort (default).** Exact `(type, apiVersion)` first, then\n * falls back to the highest registered `apiVersion` for the same\n * selector. Enables\n * deserializing older JSON against a newer package version without\n * losing typed handles.\n * - **Strict** (opt-in via `{ strict: true }`). Exact match only;\n * returns `undefined` for any apiVersion the package doesn't ship.\n *\n * The shared registry tracks the highest `apiVersion` per `(type, selector)`.\n * Best-effort lookups consult it in O(1); no scanning is needed.\n *\n * Keyed on a process-global symbol so multiple copies of `@azure/provisioning-core`\n * in the same realm share one registry, mirroring the cross-realm\n * strategy used by {@link isResource}'s brand symbol.\n */\n\nimport type { Resource } from \"./resource.js\";\nimport { ResourceTypeRegistry, type FlatVariantSelector } from \"./resource-type-registry.js\";\n\n/**\n * A `Resource` class that's eligible to live in the registry.\n *\n * - The construct signature uses `any` for both `context` and `props`\n * because concrete classes narrow these (child resources require a\n * specific parent class as context; each resource has its own `Props`\n * shape). TypeScript's parameter contravariance would reject any\n * concrete parameter types here. The deserializer is the sole caller\n * of resolved constructors and forwards already-correct values it\n * built from the wire document.\n * - The two static fields `resourceType` and `apiVersion` form the\n * registry key and are always present on emitter-generated classes\n * (and on the hand-maintained `ResourceGroup`).\n * - The generic `T` propagates the instance type — used by the query\n * API (`stack.getResources(KeyVault)` → `KeyVault[]`) to narrow\n * return types without needing a separate descriptor object.\n */\nexport type ResourceCtor<T extends Resource = Resource> = {\n new (context: any, props: any, options?: any): T;\n readonly resourceType: string;\n readonly apiVersion: string;\n};\n\n/**\n * Options controlling how {@link resolveResource} handles\n * apiVersion mismatches.\n */\nexport interface ResolveOptions {\n /**\n * When `true`, only an exact `(resourceType, apiVersion)` match is\n * returned; the best-effort fallback to the highest registered\n * version for the type is skipped. Defaults to `false`.\n */\n readonly strict?: boolean;\n}\n\nconst REGISTRY_SYMBOL = Symbol.for(\"@azure/provisioning-core.resourceRegistry\");\n\ninterface RegistryHost {\n [REGISTRY_SYMBOL]?: ResourceTypeRegistry<ResourceCtor>;\n}\n\nfunction getRegistry(): ResourceTypeRegistry<ResourceCtor> {\n const host = globalThis as unknown as RegistryHost;\n let registry = host[REGISTRY_SYMBOL];\n if (registry === undefined) {\n registry = new ResourceTypeRegistry<ResourceCtor>();\n host[REGISTRY_SYMBOL] = registry;\n }\n return registry;\n}\n\n/**\n * Register `ctor` as the canonical class for its\n * `(resourceType, apiVersion[, variantSelector])` key.\n *\n * Pass an ordered selector for variants; omit it for ordinary resources.\n * Re-registering the same constructor for the\n * same key is a silent no-op so module-graph re-entry (test\n * harnesses, dual-format builds) is safe. Registering a *different*\n * constructor for an existing key throws — that's a genuine conflict\n * (e.g. two packages claiming the same ARM type).\n *\n * A `(resourceType, apiVersion)` pair is either entirely flat or entirely\n * variant-based. Attempting to mix both modes throws,\n * preserving the invariant the deserializer relies on.\n */\nexport function registerResource(ctor: ResourceCtor, variantSelector?: FlatVariantSelector): void {\n getRegistry().register(ctor.resourceType, ctor.apiVersion, ctor, variantSelector);\n}\n\n/**\n * Resolve the registered class for a wire resource.\n *\n * Default is best-effort:\n * 1. Try the exact `(type, apiVersion)` entry and match its selectors\n * against ARM-side keys in `state`.\n * 2. On miss, retry with the highest registered version of each selector.\n *\n * Pass `{ strict: true }` to skip step 2 and require an exact match.\n *\n * Returns `undefined` when nothing matches — callers (notably the\n * deserializer) then fall back to constructing a base `Resource`.\n */\nexport function resolveResource(\n type: string,\n apiVersion: string,\n state?: Record<string, unknown>,\n options?: ResolveOptions,\n): ResourceCtor | undefined {\n return getRegistry().resolve(type, apiVersion, state ?? {}, {\n strict: options?.strict ?? false,\n valueKeyedBy: \"arm\",\n });\n}\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { DiscriminatorNames } from "../../shape/shape.js";
|
|
2
|
+
/** One discriminator pinned to a fixed value by a concrete flat variant. */
|
|
3
|
+
export interface FlatVariantPin {
|
|
4
|
+
readonly discriminator: DiscriminatorNames;
|
|
5
|
+
readonly value: string;
|
|
6
|
+
}
|
|
7
|
+
/** Pins selecting one concrete flat variant. */
|
|
8
|
+
export type FlatVariantSelector = readonly FlatVariantPin[];
|
|
9
|
+
/** One concrete variant together with a selector that chooses it. */
|
|
10
|
+
export interface FlatVariantSelection<T> {
|
|
11
|
+
readonly variant: T;
|
|
12
|
+
readonly selector: FlatVariantSelector;
|
|
13
|
+
}
|
|
14
|
+
/** One selector-to-target record stored in a variant registry bucket. */
|
|
15
|
+
export interface FlatVariantRegistryEntry<T> {
|
|
16
|
+
readonly selector: FlatVariantSelector;
|
|
17
|
+
readonly target: T;
|
|
18
|
+
}
|
|
19
|
+
/** One `(resourceType, apiVersion)` registry bucket. */
|
|
20
|
+
export type ResourceTypeRegistryEntry<T> = {
|
|
21
|
+
readonly kind: "flat";
|
|
22
|
+
readonly target: T;
|
|
23
|
+
} | {
|
|
24
|
+
readonly kind: "variants";
|
|
25
|
+
readonly variants: FlatVariantRegistryEntry<T>[];
|
|
26
|
+
};
|
|
27
|
+
export interface ResourceTypeRegistryResolveOptions {
|
|
28
|
+
readonly strict: boolean;
|
|
29
|
+
readonly valueKeyedBy: "js" | "arm";
|
|
30
|
+
}
|
|
31
|
+
/** Registry for versioned resource-type targets with optional variants. */
|
|
32
|
+
export declare class ResourceTypeRegistry<T> {
|
|
33
|
+
#private;
|
|
34
|
+
register(resourceType: string, apiVersion: string, target: T, variantSelector?: FlatVariantSelector): void;
|
|
35
|
+
resolve(resourceType: string, apiVersion: string, state: Record<string, unknown>, options: ResourceTypeRegistryResolveOptions): T | undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Stable identity for duplicate detection and version indexes.
|
|
39
|
+
* Pins are sorted in the key because the matched state is flat and selector
|
|
40
|
+
* matching is a conjunction of discriminator/value pairs, independent of
|
|
41
|
+
* hierarchy order. The selector itself is not mutated.
|
|
42
|
+
*/
|
|
43
|
+
export declare function flatVariantSelectorKey(selector: FlatVariantSelector): string;
|
|
44
|
+
/** Resolve the first registered selector exactly matched by `state`. */
|
|
45
|
+
export declare function resolveFlatVariant<T>(entries: readonly FlatVariantRegistryEntry<T>[], state: Record<string, unknown> | undefined, valueKeyedBy: "js" | "arm"): T | undefined;
|
|
46
|
+
//# sourceMappingURL=resource-type-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-type-registry.d.ts","sourceRoot":"","sources":["../../../../src/constructs/resource/resource-type-registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,kBAAkB,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,gDAAgD;AAChD,MAAM,MAAM,mBAAmB,GAAG,SAAS,cAAc,EAAE,CAAC;AAE5D,qEAAqE;AACrE,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;CACxC;AAED,yEAAyE;AACzE,MAAM,WAAW,wBAAwB,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;CACpB;AAED,wDAAwD;AACxD,MAAM,MAAM,yBAAyB,CAAC,CAAC,IACnC;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;CACpB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC;CAClD,CAAC;AAEN,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,IAAI,GAAG,KAAK,CAAC;CACrC;AAOD,2EAA2E;AAC3E,qBAAa,oBAAoB,CAAC,CAAC;;IAIjC,QAAQ,CACN,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,CAAC,EACT,eAAe,CAAC,EAAE,mBAAmB,GACpC,IAAI;IAYP,OAAO,CACL,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,kCAAkC,GAC1C,CAAC,GAAG,SAAS;CA6DjB;AAgFD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CAM5E;AAaD,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,OAAO,EAAE,SAAS,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAC/C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,YAAY,EAAE,IAAI,GAAG,KAAK,GACzB,CAAC,GAAG,SAAS,CASf"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
/** Registry for versioned resource-type targets with optional variants. */
|
|
4
|
+
export class ResourceTypeRegistry {
|
|
5
|
+
#exact = new Map();
|
|
6
|
+
#highest = new Map();
|
|
7
|
+
register(resourceType, apiVersion, target, variantSelector) {
|
|
8
|
+
const selector = variantSelector?.length ? variantSelector : undefined;
|
|
9
|
+
const exactKey = resourceTypeVersionKey(resourceType, apiVersion);
|
|
10
|
+
const exactEntry = this.#exact.get(exactKey);
|
|
11
|
+
const highestEntry = this.#highest.get(resourceType);
|
|
12
|
+
assertMode(exactEntry, selector, exactKey);
|
|
13
|
+
assertMode(highestEntry, selector, resourceType);
|
|
14
|
+
registerExact(this.#exact, exactKey, target, selector);
|
|
15
|
+
this.#updateHighest(resourceType, apiVersion, target, selector);
|
|
16
|
+
}
|
|
17
|
+
resolve(resourceType, apiVersion, state, options) {
|
|
18
|
+
const exact = resolveEntry(this.#exact.get(resourceTypeVersionKey(resourceType, apiVersion)), state, options.valueKeyedBy);
|
|
19
|
+
if (exact !== undefined || options.strict)
|
|
20
|
+
return exact;
|
|
21
|
+
const fallback = resolveEntry(this.#highest.get(resourceType), state, options.valueKeyedBy);
|
|
22
|
+
return fallback?.target;
|
|
23
|
+
}
|
|
24
|
+
#updateHighest(resourceType, apiVersion, target, selector) {
|
|
25
|
+
const entry = this.#highest.get(resourceType);
|
|
26
|
+
const versionedTarget = { apiVersion, target };
|
|
27
|
+
if (!entry) {
|
|
28
|
+
this.#highest.set(resourceType, selector
|
|
29
|
+
? {
|
|
30
|
+
kind: "variants",
|
|
31
|
+
variants: [{ selector: [...selector], target: versionedTarget }],
|
|
32
|
+
}
|
|
33
|
+
: { kind: "flat", target: versionedTarget });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (entry.kind === "flat") {
|
|
37
|
+
if (apiVersionCompare(apiVersion, entry.target.apiVersion) > 0) {
|
|
38
|
+
this.#highest.set(resourceType, {
|
|
39
|
+
kind: "flat",
|
|
40
|
+
target: versionedTarget,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const selectorKey = flatVariantSelectorKey(selector);
|
|
46
|
+
const priorIndex = entry.variants.findIndex((variant) => flatVariantSelectorKey(variant.selector) === selectorKey);
|
|
47
|
+
const prior = entry.variants[priorIndex];
|
|
48
|
+
if (!prior) {
|
|
49
|
+
entry.variants.push({
|
|
50
|
+
selector: [...selector],
|
|
51
|
+
target: versionedTarget,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else if (apiVersionCompare(apiVersion, prior.target.apiVersion) > 0) {
|
|
55
|
+
entry.variants[priorIndex] = {
|
|
56
|
+
selector: [...selector],
|
|
57
|
+
target: versionedTarget,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function assertMode(entry, selector, key) {
|
|
63
|
+
if (!entry)
|
|
64
|
+
return;
|
|
65
|
+
if (!selector && entry.kind === "variants") {
|
|
66
|
+
throw new Error(`Cannot register flat target for ${key}: variants are already registered.`);
|
|
67
|
+
}
|
|
68
|
+
if (selector && entry.kind === "flat") {
|
|
69
|
+
throw new Error(`Cannot register variant target for ${key}: a flat target is already registered.`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function registerExact(entries, key, target, selector) {
|
|
73
|
+
const entry = entries.get(key);
|
|
74
|
+
if (!entry) {
|
|
75
|
+
entries.set(key, selector
|
|
76
|
+
? {
|
|
77
|
+
kind: "variants",
|
|
78
|
+
variants: [{ selector: [...selector], target }],
|
|
79
|
+
}
|
|
80
|
+
: { kind: "flat", target });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (entry.kind === "flat") {
|
|
84
|
+
if (entry.target !== target) {
|
|
85
|
+
throw new Error(`Conflicting flat target registration for ${key}.`);
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const selectorKey = flatVariantSelectorKey(selector);
|
|
90
|
+
const existing = entry.variants.find((variant) => flatVariantSelectorKey(variant.selector) === selectorKey);
|
|
91
|
+
if (existing) {
|
|
92
|
+
if (existing.target !== target) {
|
|
93
|
+
throw new Error(`Conflicting variant target registration for ${key}@${selectorKey}.`);
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
entry.variants.push({ selector: [...selector], target });
|
|
98
|
+
}
|
|
99
|
+
function resolveEntry(entry, state, valueKeyedBy) {
|
|
100
|
+
if (!entry)
|
|
101
|
+
return undefined;
|
|
102
|
+
if (entry.kind === "flat")
|
|
103
|
+
return entry.target;
|
|
104
|
+
return resolveFlatVariant(entry.variants, state, valueKeyedBy);
|
|
105
|
+
}
|
|
106
|
+
function resourceTypeVersionKey(resourceType, apiVersion) {
|
|
107
|
+
return `${resourceType}@${apiVersion}`;
|
|
108
|
+
}
|
|
109
|
+
/** Compare ARM API versions for best-effort fallback selection. */
|
|
110
|
+
function apiVersionCompare(left, right) {
|
|
111
|
+
if (left === right)
|
|
112
|
+
return 0;
|
|
113
|
+
if (right.startsWith(`${left}-`))
|
|
114
|
+
return 1;
|
|
115
|
+
if (left.startsWith(`${right}-`))
|
|
116
|
+
return -1;
|
|
117
|
+
return left < right ? -1 : 1;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Stable identity for duplicate detection and version indexes.
|
|
121
|
+
* Pins are sorted in the key because the matched state is flat and selector
|
|
122
|
+
* matching is a conjunction of discriminator/value pairs, independent of
|
|
123
|
+
* hierarchy order. The selector itself is not mutated.
|
|
124
|
+
*/
|
|
125
|
+
export function flatVariantSelectorKey(selector) {
|
|
126
|
+
const pins = selector.map(({ discriminator, value }) => [discriminator.jsName, discriminator.armName, value]);
|
|
127
|
+
pins.sort(comparePinTuples);
|
|
128
|
+
return JSON.stringify(pins);
|
|
129
|
+
}
|
|
130
|
+
function comparePinTuples(left, right) {
|
|
131
|
+
for (let index = 0; index < left.length; index++) {
|
|
132
|
+
if (left[index] < right[index])
|
|
133
|
+
return -1;
|
|
134
|
+
if (left[index] > right[index])
|
|
135
|
+
return 1;
|
|
136
|
+
}
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
/** Resolve the first registered selector exactly matched by `state`. */
|
|
140
|
+
export function resolveFlatVariant(entries, state, valueKeyedBy) {
|
|
141
|
+
if (!state)
|
|
142
|
+
return undefined;
|
|
143
|
+
for (const entry of entries) {
|
|
144
|
+
if (matchesSelector(entry.selector, state, valueKeyedBy)) {
|
|
145
|
+
return entry.target;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
function matchesSelector(selector, state, valueKeyedBy) {
|
|
151
|
+
return selector.every(({ discriminator, value }) => {
|
|
152
|
+
const key = valueKeyedBy === "js" ? discriminator.jsName : discriminator.armName;
|
|
153
|
+
return state[key] === value;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=resource-type-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-type-registry.js","sourceRoot":"","sources":["../../../../src/constructs/resource/resource-type-registry.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { DiscriminatorNames } from \"../../shape/shape.js\";\n\n/** One discriminator pinned to a fixed value by a concrete flat variant. */\nexport interface FlatVariantPin {\n readonly discriminator: DiscriminatorNames;\n readonly value: string;\n}\n\n/** Pins selecting one concrete flat variant. */\nexport type FlatVariantSelector = readonly FlatVariantPin[];\n\n/** One concrete variant together with a selector that chooses it. */\nexport interface FlatVariantSelection<T> {\n readonly variant: T;\n readonly selector: FlatVariantSelector;\n}\n\n/** One selector-to-target record stored in a variant registry bucket. */\nexport interface FlatVariantRegistryEntry<T> {\n readonly selector: FlatVariantSelector;\n readonly target: T;\n}\n\n/** One `(resourceType, apiVersion)` registry bucket. */\nexport type ResourceTypeRegistryEntry<T> =\n | {\n readonly kind: \"flat\";\n readonly target: T;\n }\n | {\n readonly kind: \"variants\";\n readonly variants: FlatVariantRegistryEntry<T>[];\n };\n\nexport interface ResourceTypeRegistryResolveOptions {\n readonly strict: boolean;\n readonly valueKeyedBy: \"js\" | \"arm\";\n}\n\ninterface VersionedTarget<T> {\n readonly apiVersion: string;\n readonly target: T;\n}\n\n/** Registry for versioned resource-type targets with optional variants. */\nexport class ResourceTypeRegistry<T> {\n readonly #exact = new Map<string, ResourceTypeRegistryEntry<T>>();\n readonly #highest = new Map<string, ResourceTypeRegistryEntry<VersionedTarget<T>>>();\n\n register(\n resourceType: string,\n apiVersion: string,\n target: T,\n variantSelector?: FlatVariantSelector,\n ): void {\n const selector = variantSelector?.length ? variantSelector : undefined;\n const exactKey = resourceTypeVersionKey(resourceType, apiVersion);\n const exactEntry = this.#exact.get(exactKey);\n const highestEntry = this.#highest.get(resourceType);\n\n assertMode(exactEntry, selector, exactKey);\n assertMode(highestEntry, selector, resourceType);\n registerExact(this.#exact, exactKey, target, selector);\n this.#updateHighest(resourceType, apiVersion, target, selector);\n }\n\n resolve(\n resourceType: string,\n apiVersion: string,\n state: Record<string, unknown>,\n options: ResourceTypeRegistryResolveOptions,\n ): T | undefined {\n const exact = resolveEntry(\n this.#exact.get(resourceTypeVersionKey(resourceType, apiVersion)),\n state,\n options.valueKeyedBy,\n );\n if (exact !== undefined || options.strict) return exact;\n\n const fallback = resolveEntry(this.#highest.get(resourceType), state, options.valueKeyedBy);\n return fallback?.target;\n }\n\n #updateHighest(\n resourceType: string,\n apiVersion: string,\n target: T,\n selector: FlatVariantSelector | undefined,\n ): void {\n const entry = this.#highest.get(resourceType);\n const versionedTarget = { apiVersion, target };\n\n if (!entry) {\n this.#highest.set(\n resourceType,\n selector\n ? {\n kind: \"variants\",\n variants: [{ selector: [...selector], target: versionedTarget }],\n }\n : { kind: \"flat\", target: versionedTarget },\n );\n return;\n }\n\n if (entry.kind === \"flat\") {\n if (apiVersionCompare(apiVersion, entry.target.apiVersion) > 0) {\n this.#highest.set(resourceType, {\n kind: \"flat\",\n target: versionedTarget,\n });\n }\n return;\n }\n\n const selectorKey = flatVariantSelectorKey(selector!);\n const priorIndex = entry.variants.findIndex(\n (variant) => flatVariantSelectorKey(variant.selector) === selectorKey,\n );\n const prior = entry.variants[priorIndex];\n if (!prior) {\n entry.variants.push({\n selector: [...selector!],\n target: versionedTarget,\n });\n } else if (apiVersionCompare(apiVersion, prior.target.apiVersion) > 0) {\n entry.variants[priorIndex] = {\n selector: [...selector!],\n target: versionedTarget,\n };\n }\n }\n}\n\nfunction assertMode<T>(\n entry: ResourceTypeRegistryEntry<T> | undefined,\n selector: FlatVariantSelector | undefined,\n key: string,\n): void {\n if (!entry) return;\n if (!selector && entry.kind === \"variants\") {\n throw new Error(`Cannot register flat target for ${key}: variants are already registered.`);\n }\n if (selector && entry.kind === \"flat\") {\n throw new Error(\n `Cannot register variant target for ${key}: a flat target is already registered.`,\n );\n }\n}\n\nfunction registerExact<T>(\n entries: Map<string, ResourceTypeRegistryEntry<T>>,\n key: string,\n target: T,\n selector: FlatVariantSelector | undefined,\n): void {\n const entry = entries.get(key);\n if (!entry) {\n entries.set(\n key,\n selector\n ? {\n kind: \"variants\",\n variants: [{ selector: [...selector], target }],\n }\n : { kind: \"flat\", target },\n );\n return;\n }\n\n if (entry.kind === \"flat\") {\n if (entry.target !== target) {\n throw new Error(`Conflicting flat target registration for ${key}.`);\n }\n return;\n }\n\n const selectorKey = flatVariantSelectorKey(selector!);\n const existing = entry.variants.find(\n (variant) => flatVariantSelectorKey(variant.selector) === selectorKey,\n );\n if (existing) {\n if (existing.target !== target) {\n throw new Error(`Conflicting variant target registration for ${key}@${selectorKey}.`);\n }\n return;\n }\n entry.variants.push({ selector: [...selector!], target });\n}\n\nfunction resolveEntry<T>(\n entry: ResourceTypeRegistryEntry<T> | undefined,\n state: Record<string, unknown>,\n valueKeyedBy: \"js\" | \"arm\",\n): T | undefined {\n if (!entry) return undefined;\n if (entry.kind === \"flat\") return entry.target;\n return resolveFlatVariant(entry.variants, state, valueKeyedBy);\n}\n\nfunction resourceTypeVersionKey(resourceType: string, apiVersion: string): string {\n return `${resourceType}@${apiVersion}`;\n}\n\n/** Compare ARM API versions for best-effort fallback selection. */\nfunction apiVersionCompare(left: string, right: string): number {\n if (left === right) return 0;\n if (right.startsWith(`${left}-`)) return 1;\n if (left.startsWith(`${right}-`)) return -1;\n return left < right ? -1 : 1;\n}\n\n/**\n * Stable identity for duplicate detection and version indexes.\n * Pins are sorted in the key because the matched state is flat and selector\n * matching is a conjunction of discriminator/value pairs, independent of\n * hierarchy order. The selector itself is not mutated.\n */\nexport function flatVariantSelectorKey(selector: FlatVariantSelector): string {\n const pins = selector.map(\n ({ discriminator, value }) => [discriminator.jsName, discriminator.armName, value] as const,\n );\n pins.sort(comparePinTuples);\n return JSON.stringify(pins);\n}\n\nfunction comparePinTuples(\n left: readonly [string, string, string],\n right: readonly [string, string, string],\n): number {\n for (let index = 0; index < left.length; index++) {\n if (left[index]! < right[index]!) return -1;\n if (left[index]! > right[index]!) return 1;\n }\n return 0;\n}\n\n/** Resolve the first registered selector exactly matched by `state`. */\nexport function resolveFlatVariant<T>(\n entries: readonly FlatVariantRegistryEntry<T>[],\n state: Record<string, unknown> | undefined,\n valueKeyedBy: \"js\" | \"arm\",\n): T | undefined {\n if (!state) return undefined;\n\n for (const entry of entries) {\n if (matchesSelector(entry.selector, state, valueKeyedBy)) {\n return entry.target;\n }\n }\n return undefined;\n}\n\nfunction matchesSelector(\n selector: FlatVariantSelector,\n state: Record<string, unknown>,\n valueKeyedBy: \"js\" | \"arm\",\n): boolean {\n return selector.every(({ discriminator, value }) => {\n const key = valueKeyedBy === \"js\" ? discriminator.jsName : discriminator.armName;\n return state[key] === value;\n });\n}\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Resource, ResourceDeclaration, LoopedResource } from "./resource.js";
|
|
2
|
+
import type { ResourceCtor } from "./resource-registry.js";
|
|
3
|
+
/**
|
|
4
|
+
* Cross-realm-safe brand guards for resource declarations.
|
|
5
|
+
*
|
|
6
|
+
* These live in a standalone module — importing only the brand **symbols**
|
|
7
|
+
* (from `resource-proxy.ts`) and `resource.ts` **types** — so tree-walking
|
|
8
|
+
* utilities (e.g. the query layer, `ProvisioningComponent`) can identify resources
|
|
9
|
+
* WITHOUT a runtime import of `resource.ts`, which `extends ProvisioningComponent` and
|
|
10
|
+
* would otherwise create an eval-time import cycle
|
|
11
|
+
* (`ProvisioningComponent` → `query` → `resource` → `ProvisioningComponent`).
|
|
12
|
+
*
|
|
13
|
+
* The public guard API is these standalone functions (`isResource`,
|
|
14
|
+
* `isResourceDeclaration`, `isLoopedResource`, `isResourceOf`,
|
|
15
|
+
* `isLoopedResourceOf`) — there are no class-static guards, so a subclass
|
|
16
|
+
* like `Secret` never inherits a misleading `Secret.isResource(...)`.
|
|
17
|
+
*/
|
|
18
|
+
/** Is `x` a scalar {@link Resource} (not a looped declaration)? */
|
|
19
|
+
export declare function isResource(x: unknown): x is Resource;
|
|
20
|
+
/**
|
|
21
|
+
* Is `x` a Bicep resource declaration — either a scalar {@link Resource} or
|
|
22
|
+
* a {@link LoopedResource}?
|
|
23
|
+
*/
|
|
24
|
+
export declare function isResourceDeclaration(x: unknown): x is ResourceDeclaration;
|
|
25
|
+
/** Is `x` a {@link LoopedResource} (`Ctor.fromLoop(...)`)? */
|
|
26
|
+
export declare function isLoopedResource(x: unknown): x is LoopedResource<Resource>;
|
|
27
|
+
/**
|
|
28
|
+
* Type guard: is `x` an instance of the resource class `ctor`?
|
|
29
|
+
* Narrows `x` to the class's instance type, so callers can access
|
|
30
|
+
* subclass-specific accessors (e.g. `kv.secrets`) inside the guarded
|
|
31
|
+
* block.
|
|
32
|
+
*
|
|
33
|
+
* Accepts any value (`unknown`), like the other brand guards. A
|
|
34
|
+
* `LoopedResource<T>` is not a `Resource`, so `instanceof ctor` returns
|
|
35
|
+
* `false` for it — the narrowing is safe. `instanceof` alone is sufficient
|
|
36
|
+
* (and stricter than a brand + ARM-type-string check: a base-`Resource`
|
|
37
|
+
* impostor carrying the same `type`/`apiVersion` is correctly rejected), so
|
|
38
|
+
* no `isResource` pre-check is needed.
|
|
39
|
+
*
|
|
40
|
+
* Matches scalar resource **declarations** (from a constructor / query /
|
|
41
|
+
* collection). It does NOT match a `parent.at(i)` element reference of a
|
|
42
|
+
* looped declaration: that proxy intentionally keeps `LoopedResource`'s
|
|
43
|
+
* prototype (no `getPrototypeOf` trap), so `instanceof` is `false` for it
|
|
44
|
+
* even though its ARM reads work. If we ever need cross-realm subclass
|
|
45
|
+
* matching (per-subclass `Symbol.for` brands, mirroring the base
|
|
46
|
+
* `RESOURCE_BRAND`), this is the one place to swap.
|
|
47
|
+
*/
|
|
48
|
+
export declare function isResourceOf<T extends Resource>(x: unknown, ctor: ResourceCtor<T>): x is T;
|
|
49
|
+
/**
|
|
50
|
+
* Type guard: is `x` a {@link LoopedResource} whose wrapped resource class is
|
|
51
|
+
* `ctor` (i.e. a `LoopedResource<T>` produced by `T.fromLoop(...)`)? Narrows
|
|
52
|
+
* `x` to `LoopedResource<T>`, the looped analogue of {@link isResourceOf}.
|
|
53
|
+
*
|
|
54
|
+
* Matches on the declaration's `wrappedCtor` identity — the concrete subclass
|
|
55
|
+
* passed to `fromLoop` — so `isLoopedResourceOf(x, StorageAccount)`
|
|
56
|
+
* replaces the `x.wrappedCtor === StorageAccount` checks scattered across the
|
|
57
|
+
* query / collection layers.
|
|
58
|
+
*/
|
|
59
|
+
export declare function isLoopedResourceOf<T extends Resource>(x: unknown, ctor: ResourceCtor<T>): x is LoopedResource<T>;
|
|
60
|
+
//# sourceMappingURL=resource-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-utils.d.ts","sourceRoot":"","sources":["../../../../src/constructs/resource/resource-utils.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;;;;;;;;;;;;GAcG;AAEH,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,QAAQ,CAIpD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,mBAAmB,CAM1E;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAM1E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAE1F;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,QAAQ,EACnD,CAAC,EAAE,OAAO,EACV,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GACpB,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAExB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
import { RESOURCE_BRAND, RESOURCE_DECLARATION_BRAND, LOOPED_RESOURCE_BRAND, } from "./resource-proxy.js";
|
|
4
|
+
/**
|
|
5
|
+
* Cross-realm-safe brand guards for resource declarations.
|
|
6
|
+
*
|
|
7
|
+
* These live in a standalone module — importing only the brand **symbols**
|
|
8
|
+
* (from `resource-proxy.ts`) and `resource.ts` **types** — so tree-walking
|
|
9
|
+
* utilities (e.g. the query layer, `ProvisioningComponent`) can identify resources
|
|
10
|
+
* WITHOUT a runtime import of `resource.ts`, which `extends ProvisioningComponent` and
|
|
11
|
+
* would otherwise create an eval-time import cycle
|
|
12
|
+
* (`ProvisioningComponent` → `query` → `resource` → `ProvisioningComponent`).
|
|
13
|
+
*
|
|
14
|
+
* The public guard API is these standalone functions (`isResource`,
|
|
15
|
+
* `isResourceDeclaration`, `isLoopedResource`, `isResourceOf`,
|
|
16
|
+
* `isLoopedResourceOf`) — there are no class-static guards, so a subclass
|
|
17
|
+
* like `Secret` never inherits a misleading `Secret.isResource(...)`.
|
|
18
|
+
*/
|
|
19
|
+
/** Is `x` a scalar {@link Resource} (not a looped declaration)? */
|
|
20
|
+
export function isResource(x) {
|
|
21
|
+
return (typeof x === "object" && x !== null && x[RESOURCE_BRAND] === true);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Is `x` a Bicep resource declaration — either a scalar {@link Resource} or
|
|
25
|
+
* a {@link LoopedResource}?
|
|
26
|
+
*/
|
|
27
|
+
export function isResourceDeclaration(x) {
|
|
28
|
+
return (typeof x === "object" &&
|
|
29
|
+
x !== null &&
|
|
30
|
+
x[RESOURCE_DECLARATION_BRAND] === true);
|
|
31
|
+
}
|
|
32
|
+
/** Is `x` a {@link LoopedResource} (`Ctor.fromLoop(...)`)? */
|
|
33
|
+
export function isLoopedResource(x) {
|
|
34
|
+
return (typeof x === "object" &&
|
|
35
|
+
x !== null &&
|
|
36
|
+
x[LOOPED_RESOURCE_BRAND] === true);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Type guard: is `x` an instance of the resource class `ctor`?
|
|
40
|
+
* Narrows `x` to the class's instance type, so callers can access
|
|
41
|
+
* subclass-specific accessors (e.g. `kv.secrets`) inside the guarded
|
|
42
|
+
* block.
|
|
43
|
+
*
|
|
44
|
+
* Accepts any value (`unknown`), like the other brand guards. A
|
|
45
|
+
* `LoopedResource<T>` is not a `Resource`, so `instanceof ctor` returns
|
|
46
|
+
* `false` for it — the narrowing is safe. `instanceof` alone is sufficient
|
|
47
|
+
* (and stricter than a brand + ARM-type-string check: a base-`Resource`
|
|
48
|
+
* impostor carrying the same `type`/`apiVersion` is correctly rejected), so
|
|
49
|
+
* no `isResource` pre-check is needed.
|
|
50
|
+
*
|
|
51
|
+
* Matches scalar resource **declarations** (from a constructor / query /
|
|
52
|
+
* collection). It does NOT match a `parent.at(i)` element reference of a
|
|
53
|
+
* looped declaration: that proxy intentionally keeps `LoopedResource`'s
|
|
54
|
+
* prototype (no `getPrototypeOf` trap), so `instanceof` is `false` for it
|
|
55
|
+
* even though its ARM reads work. If we ever need cross-realm subclass
|
|
56
|
+
* matching (per-subclass `Symbol.for` brands, mirroring the base
|
|
57
|
+
* `RESOURCE_BRAND`), this is the one place to swap.
|
|
58
|
+
*/
|
|
59
|
+
export function isResourceOf(x, ctor) {
|
|
60
|
+
return x instanceof ctor;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Type guard: is `x` a {@link LoopedResource} whose wrapped resource class is
|
|
64
|
+
* `ctor` (i.e. a `LoopedResource<T>` produced by `T.fromLoop(...)`)? Narrows
|
|
65
|
+
* `x` to `LoopedResource<T>`, the looped analogue of {@link isResourceOf}.
|
|
66
|
+
*
|
|
67
|
+
* Matches on the declaration's `wrappedCtor` identity — the concrete subclass
|
|
68
|
+
* passed to `fromLoop` — so `isLoopedResourceOf(x, StorageAccount)`
|
|
69
|
+
* replaces the `x.wrappedCtor === StorageAccount` checks scattered across the
|
|
70
|
+
* query / collection layers.
|
|
71
|
+
*/
|
|
72
|
+
export function isLoopedResourceOf(x, ctor) {
|
|
73
|
+
return isLoopedResource(x) && x.wrappedCtor === ctor;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=resource-utils.js.map
|