@voxgig/sdkgen 4.9.0 → 4.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/helpers/manifest.d.ts +2 -1
- package/dist/helpers/manifest.js +75 -1
- package/dist/helpers/manifest.js.map +1 -1
- package/dist/helpers/modelNames.d.ts +7 -0
- package/dist/helpers/modelNames.js +232 -0
- package/dist/helpers/modelNames.js.map +1 -0
- package/dist/helpers/naming.d.ts +2 -1
- package/dist/helpers/naming.js +45 -1
- package/dist/helpers/naming.js.map +1 -1
- package/dist/sdkgen.d.ts +3 -2
- package/dist/sdkgen.js +12 -3
- package/dist/sdkgen.js.map +1 -1
- package/dist/testkit.d.ts +2 -0
- package/dist/testkit.js +80 -24
- package/dist/testkit.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utility.js +17 -7
- package/dist/utility.js.map +1 -1
- package/package.json +1 -1
- package/project/.sdk/model/feature/secrets.aon +671 -0
- package/project/.sdk/model/target/clojure.aon +10 -0
- package/project/.sdk/model/target/csharp.aon +5 -0
- package/project/.sdk/model/target/elixir.aon +6 -0
- package/project/.sdk/model/target/java.aon +5 -0
- package/project/.sdk/model/target/js.aon +5 -0
- package/project/.sdk/model/target/kotlin.aon +7 -0
- package/project/.sdk/model/target/perl.aon +5 -0
- package/project/.sdk/model/target/php.aon +5 -0
- package/project/.sdk/model/target/rb.aon +5 -0
- package/project/.sdk/model/target/rust.aon +5 -0
- package/project/.sdk/model/target/scala.aon +38 -2
- package/project/.sdk/model/target/swift.aon +10 -0
- package/project/.sdk/src/cmp/clojure/Config_clojure.ts +51 -4
- package/project/.sdk/src/cmp/clojure/Main_clojure.ts +43 -1
- package/project/.sdk/src/cmp/clojure/Package_clojure.ts +17 -1
- package/project/.sdk/src/cmp/clojure/featureextra_clojure.ts +130 -0
- package/project/.sdk/src/cmp/csharp/Config_csharp.ts +70 -0
- package/project/.sdk/src/cmp/csharp/Main_csharp.ts +9 -1
- package/project/.sdk/src/cmp/csharp/Package_csharp.ts +25 -1
- package/project/.sdk/src/cmp/elixir/Config_elixir.ts +68 -2
- package/project/.sdk/src/cmp/elixir/Main_elixir.ts +16 -0
- package/project/.sdk/src/cmp/go-cli/Main_go-cli.ts +14 -1
- package/project/.sdk/src/cmp/java/Config_java.ts +84 -2
- package/project/.sdk/src/cmp/java/Main_java.ts +10 -1
- package/project/.sdk/src/cmp/js/Config_js.ts +75 -8
- package/project/.sdk/src/cmp/js/Main_js.ts +66 -2
- package/project/.sdk/src/cmp/js/fragment/Config.data.fragment.js +18 -1
- package/project/.sdk/src/cmp/js/fragment/Config.fragment.js +18 -1
- package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +7 -0
- package/project/.sdk/src/cmp/kotlin/Config_kotlin.ts +63 -1
- package/project/.sdk/src/cmp/kotlin/Main_kotlin.ts +32 -2
- package/project/.sdk/src/cmp/perl/Config_perl.ts +129 -3
- package/project/.sdk/src/cmp/perl/Main_perl.ts +41 -1
- package/project/.sdk/src/cmp/perl/Package_perl.ts +13 -1
- package/project/.sdk/src/cmp/perl/fragment/Main.fragment.pm +1 -0
- package/project/.sdk/src/cmp/php/Config_php.ts +105 -1
- package/project/.sdk/src/cmp/php/Gitignore_php.ts +4 -2
- package/project/.sdk/src/cmp/php/Main_php.ts +16 -1
- package/project/.sdk/src/cmp/rb/Config_rb.ts +92 -2
- package/project/.sdk/src/cmp/rb/EntityTypes_rb.ts +11 -1
- package/project/.sdk/src/cmp/rb/Main_rb.ts +7 -1
- package/project/.sdk/src/cmp/rust/Main_rust.ts +99 -1
- package/project/.sdk/src/cmp/rust/Package_rust.ts +72 -6
- package/project/.sdk/src/cmp/scala/Config_scala.ts +44 -0
- package/project/.sdk/src/cmp/scala/Main_scala.ts +68 -1
- package/project/.sdk/src/cmp/swift/Config_swift.ts +62 -1
- package/project/.sdk/src/cmp/swift/Main_swift.ts +35 -1
- package/project/.sdk/src/cmp/swift/Package_swift.ts +81 -11
- package/project/.sdk/src/cmp/swift/fragment/Main.fragment.swift +58 -44
- package/project/.sdk/src/cmp/swift/utility_swift.ts +22 -0
- package/project/.sdk/tm/c/tests/vendor/omni/json.c +2 -2
- package/project/.sdk/tm/c/tests/vendor/omni/omni.h +2 -2
- package/project/.sdk/tm/c/tests/vendor/omni/runner.c +2 -2
- package/project/.sdk/tm/c/tests/vendor/omni/util.c +2 -2
- package/project/.sdk/tm/clojure/Makefile +3 -0
- package/project/.sdk/tm/clojure/feature/secrets/sdk/feature/secrets.clj +503 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/capability.clj +84 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/catalog.clj +44 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/config.clj +240 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/depend.clj +199 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/env.clj +111 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/export.clj +46 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/graph.clj +122 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/host.clj +1018 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/json.clj +106 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/order.clj +157 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/point.clj +77 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/ref.clj +92 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/resolve.clj +46 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/types.clj +177 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin/version.clj +90 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/plugin.clj +40 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/addr.clj +111 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/chain.clj +297 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/core.clj +192 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/json.clj +261 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/aws.clj +165 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/azuresecrets.clj +111 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/boru.clj +107 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/doppler.clj +61 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/gcpsecrets.clj +88 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/hashicorp.clj +115 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/httpjson.clj +214 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/infisical.clj +80 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/onepassword.clj +93 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/proc.clj +63 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/secretspec.clj +99 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/plugins/sigv4.clj +142 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/provider.clj +25 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto/providers.clj +196 -0
- package/project/.sdk/tm/clojure/feature/secrets/voxgig/sekreto.clj +113 -0
- package/project/.sdk/tm/clojure/src/sdk/core.clj +9 -0
- package/project/.sdk/tm/clojure/src/sdk/features.clj +13 -1
- package/project/.sdk/tm/clojure/test/sdk/test/feature/secrets.clj +547 -0
- package/project/.sdk/tm/clojure/test/sdk/test_runner.clj +103 -14
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/json.clj +2 -2
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/runner.clj +2 -2
- package/project/.sdk/tm/clojure/test/vendor/omni/voxgig/omni/util.clj +2 -2
- package/project/.sdk/tm/cpp/test/vendor/omni/json.hpp +2 -2
- package/project/.sdk/tm/cpp/test/vendor/omni/omni.hpp +2 -2
- package/project/.sdk/tm/cpp/test/vendor/omni/util.hpp +2 -2
- package/project/.sdk/tm/csharp/feature/SecretsFeature.cs +889 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Capability.cs +196 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Catalog.cs +70 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Config.cs +505 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Definition.cs +52 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Depend.cs +285 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Entry.cs +55 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Env.cs +228 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Export.cs +102 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Graph.cs +256 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Host.cs +1379 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Inst.cs +177 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Json.cs +326 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Order.cs +295 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Plugin.cs +113 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Point.cs +177 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Refs.cs +198 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Resolve.cs +95 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Types.cs +351 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugin/Version.cs +196 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Aws.cs +325 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/AzureSecrets.cs +195 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Boru.cs +192 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Child.cs +75 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Doppler.cs +112 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/GcpSecrets.cs +167 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Hashicorp.cs +221 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/HttpJson.cs +213 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Infisical.cs +155 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/OnePassword.cs +169 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/SecretSpec.cs +172 -0
- package/project/.sdk/tm/csharp/feature/secrets/plugins/Sigv4.cs +240 -0
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Json.cs +192 -0
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Providers.cs +503 -0
- package/project/.sdk/tm/csharp/feature/secrets/sekreto/Sekreto.cs +775 -0
- package/project/.sdk/tm/csharp/test/feature/secrets/SecretsFeatureTest.cs +1702 -0
- package/project/.sdk/tm/csharp/test/vendor/omni/Runner.cs +2 -2
- package/project/.sdk/tm/csharp/test/vendor/omni/Util.cs +2 -2
- package/project/.sdk/tm/csharp/utility/MakeOptions.cs +10 -0
- package/project/.sdk/tm/csharp/utility/struct/Struct.cs +1 -1
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/capability.ex +118 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/catalog.ex +56 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/config.ex +320 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/depend.ex +205 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/env.ex +166 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/error.ex +13 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/export.ex +73 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/graph.ex +185 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/host.ex +1182 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/inst.ex +139 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/json.ex +132 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/order.ex +179 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/point.ex +99 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/ref.ex +129 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/resolve.ex +59 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/types.ex +190 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/version.ex +136 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/plugin/voxgig_plugin.ex +42 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/json.ex +368 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/aws.ex +257 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/azuresecrets.ex +160 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/boru.ex +127 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/doppler.ex +96 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/gcpsecrets.ex +124 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/hashicorp.ex +162 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/http.ex +627 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/httpjson.ex +134 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/infisical.ex +125 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/onepassword.ex +152 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/proc.ex +80 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/secretspec.ex +101 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/plugins/sigv4.ex +176 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/provider.ex +67 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/providers.ex +536 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets/sekreto/sekreto.ex +662 -0
- package/project/.sdk/tm/elixir/lib/projectname/feature/secrets.ex +824 -0
- package/project/.sdk/tm/elixir/test/feature/secrets/secrets_test.exs +1072 -0
- package/project/.sdk/tm/elixir/test/vendor/omni/json.ex +2 -2
- package/project/.sdk/tm/elixir/test/vendor/omni/runner.ex +2 -2
- package/project/.sdk/tm/elixir/test/vendor/omni/util.ex +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugin/capability.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/catalog.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/config.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/depend.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/env.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/export.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/graph.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/host.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/order.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/point.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/ref.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/resolve.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/types.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/util.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugin/version.go +1 -1
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/aws.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/aws/sigv4.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/azuresecrets/azuresecrets.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/boru/boru.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/doppler/doppler.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/gcpsecrets/gcpsecrets.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/hashicorp/hashicorp.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/httpjson/httpjson.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/infisical/infisical.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/onepassword/onepassword.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/plugins/secretspec/secretspec.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/addr.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/providers.go +2 -2
- package/project/.sdk/tm/go/feature/secrets/sekreto/sekreto.go +2 -2
- package/project/.sdk/tm/go/feature/secrets_feature.go +16 -0
- package/project/.sdk/tm/go/test/feature/secrets/secrets_feature_test.go +123 -0
- package/project/.sdk/tm/go/test/omni/omni.go +2 -2
- package/project/.sdk/tm/go/test/omni/util.go +2 -2
- package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +1 -1
- package/project/.sdk/tm/java/feature/SecretsFeature.java +766 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Capability.java +181 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Catalog.java +64 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Config.java +433 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Definition.java +54 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Depend.java +292 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Entry.java +49 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Env.java +204 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Export.java +93 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Graph.java +244 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Host.java +1196 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Inst.java +173 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Json.java +339 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Order.java +274 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Plugin.java +94 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/PluginException.java +37 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Point.java +172 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Refs.java +171 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Resolve.java +89 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Types.java +232 -0
- package/project/.sdk/tm/java/feature/secrets/plugin/Version.java +198 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Addr.java +142 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Builtins.java +229 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Json.java +302 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Provider.java +21 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Sekreto.java +698 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/Support.java +100 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Aws.java +294 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Azuresecrets.java +164 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Boru.java +161 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Doppler.java +103 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Gcpsecrets.java +143 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Hashicorp.java +186 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Httpjson.java +192 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Infisical.java +139 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Onepassword.java +143 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Proc.java +80 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Secretspec.java +138 -0
- package/project/.sdk/tm/java/feature/secrets/sekreto/plugins/Sigv4.java +243 -0
- package/project/.sdk/tm/java/test/feature/secrets/SecretsFeatureTest.java +986 -0
- package/project/.sdk/tm/java/test/vendor/omni/Json.java +2 -2
- package/project/.sdk/tm/java/test/vendor/omni/Runner.java +2 -2
- package/project/.sdk/tm/java/test/vendor/omni/Util.java +2 -2
- package/project/.sdk/tm/java/utility/MakeOptions.java +7 -0
- package/project/.sdk/tm/java/utility/struct/Struct.java +1 -1
- package/project/.sdk/tm/js/src/feature/secrets/SecretsFeature.js +431 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/capability.js +119 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/catalog.js +42 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/config.js +323 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/depend.js +196 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/env.js +120 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/export.js +48 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/graph.js +150 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/host.js +949 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/index.js +35 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/order.js +165 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/point.js +94 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/ref.js +106 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/resolve.js +59 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/types.js +79 -0
- package/project/.sdk/tm/js/src/feature/secrets/plugin/version.js +100 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/Sekreto.js +574 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/index.js +56 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/aws.js +188 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/azuresecrets.js +135 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/boru.js +128 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/doppler.js +67 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/gcpsecrets.js +115 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/hashicorp.js +139 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/httpjson.js +93 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/infisical.js +99 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/onepassword.js +111 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/secretspec.js +105 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/plugins/sigv4.js +157 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/addr.js +119 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/builtin.js +39 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/dotenv.js +40 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/env.js +21 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/file.js +42 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/memory.js +18 -0
- package/project/.sdk/tm/js/src/feature/secrets/sekreto/provider/support.js +151 -0
- package/project/.sdk/tm/js/src/utility/StructUtility.js +1 -1
- package/project/.sdk/tm/js/test/feature/secrets/Secrets.test.js +946 -0
- package/project/.sdk/tm/js/test/vendor/omni/index.js +1 -1
- package/project/.sdk/tm/js/test/vendor/omni/runner.js +1 -1
- package/project/.sdk/tm/js/test/vendor/omni/util.js +1 -1
- package/project/.sdk/tm/kotlin/feature/SecretsFeature.kt +659 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Capability.kt +117 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Catalog.kt +40 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Config.kt +322 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Depend.kt +227 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Env.kt +163 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Export.kt +57 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Graph.kt +179 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Host.kt +1131 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Json.kt +241 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Order.kt +180 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Plugin.kt +64 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Point.kt +124 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Refs.kt +125 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Resolve.kt +66 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Types.kt +171 -0
- package/project/.sdk/tm/kotlin/feature/secrets/plugin/Version.kt +132 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Json.kt +359 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Provider.kt +21 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Providers.kt +308 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Sekreto.kt +525 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Spec.kt +126 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/Support.kt +205 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Aws.kt +251 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Azuresecrets.kt +145 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Boru.kt +130 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Doppler.kt +77 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Gcpsecrets.kt +119 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Hashicorp.kt +156 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Httpjson.kt +219 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Infisical.kt +114 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Onepassword.kt +114 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Secretspec.kt +118 -0
- package/project/.sdk/tm/kotlin/feature/secrets/sekreto/plugins/Sigv4.kt +220 -0
- package/project/.sdk/tm/kotlin/test/feature/secrets/SecretsTest.kt +1148 -0
- package/project/.sdk/tm/kotlin/test/vendor/omni/Json.kt +2 -2
- package/project/.sdk/tm/kotlin/test/vendor/omni/Runner.kt +2 -2
- package/project/.sdk/tm/kotlin/test/vendor/omni/Util.kt +2 -2
- package/project/.sdk/tm/kotlin/utility/struct/Struct.kt +1 -1
- package/project/.sdk/tm/lua/test/vendor/omni/json.lua +2 -2
- package/project/.sdk/tm/lua/test/vendor/omni/regex.lua +2 -2
- package/project/.sdk/tm/lua/test/vendor/omni/runner.lua +2 -2
- package/project/.sdk/tm/lua/test/vendor/omni/util.lua +2 -2
- package/project/.sdk/tm/lua/utility/struct/regex.lua +1 -1
- package/project/.sdk/tm/lua/utility/struct/struct.lua +1 -1
- package/project/.sdk/tm/ocaml/test/vendor/omni/omni.ml +2 -2
- package/project/.sdk/tm/perl/Makefile +6 -1
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Capability.pm +141 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Catalog.pm +65 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Config.pm +346 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Depend.pm +216 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Env.pm +176 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Export.pm +59 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Graph.pm +157 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Host.pm +1139 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Order.pm +187 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Point.pm +100 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Ref.pm +119 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Resolve.pm +71 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Types.pm +251 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin/Version.pm +122 -0
- package/project/.sdk/tm/perl/feature/secrets/plugin/Voxgig/Plugin.pm +70 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Aws.pm +263 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Azuresecrets.pm +159 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Boru.pm +180 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Doppler.pm +92 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Gcpsecrets.pm +138 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Hashicorp.pm +213 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Httpjson.pm +173 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Infisical.pm +132 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Onepassword.pm +132 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Proc.pm +102 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Secretspec.pm +132 -0
- package/project/.sdk/tm/perl/feature/secrets/plugins/Voxgig/Sekreto/Plugins/Sigv4.pm +190 -0
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Addr.pm +124 -0
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto/Providers.pm +301 -0
- package/project/.sdk/tm/perl/feature/secrets/sekreto/Voxgig/Sekreto.pm +605 -0
- package/project/.sdk/tm/perl/feature/secrets_feature.pm +675 -0
- package/project/.sdk/tm/perl/lib/Voxgig/Struct.pm +1 -1
- package/project/.sdk/tm/perl/t/feature/secrets/secrets.t +957 -0
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Runner.pm +1 -1
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni/Util.pm +1 -1
- package/project/.sdk/tm/perl/t/vendor/omni/Voxgig/Omni.pm +1 -1
- package/project/.sdk/tm/php/feature/SecretsFeature.php +670 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Capability.php +226 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Catalog.php +75 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Config.php +444 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Depend.php +262 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Env.php +202 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Export.php +74 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Graph.php +195 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Host.php +1514 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Order.php +260 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Point.php +129 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Ref.php +169 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Resolve.php +79 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Types.php +348 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/Version.php +163 -0
- package/project/.sdk/tm/php/feature/secrets/plugin/plugin.php +40 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/aws.php +274 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/azuresecrets.php +170 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/boru.php +163 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/doppler.php +106 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/gcpsecrets.php +144 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/hashicorp.php +194 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/httpjson.php +113 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/infisical.php +131 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/onepassword.php +150 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/runcmd.php +101 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/secretspec.php +146 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/plugins/sigv4.php +161 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Addr.php +129 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Providers.php +322 -0
- package/project/.sdk/tm/php/feature/secrets/sekreto/src/Sekreto.php +724 -0
- package/project/.sdk/tm/php/test/feature/secrets/SecretsTest.php +1067 -0
- package/project/.sdk/tm/php/test/vendor/omni/Runner.php +2 -2
- package/project/.sdk/tm/php/test/vendor/omni/Util.php +2 -2
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/__init__.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/capability.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/catalog.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/config.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/depend.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/env.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/export.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/graph.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/host.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/order.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/point.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/ref.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/resolve.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/types.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_plugin/version.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/__init__.py +2 -2
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/addr.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/aws.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/azuresecrets.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/boru.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/doppler.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/hashicorp.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/httpjson.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/infisical.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/onepassword.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/secretspec.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/plugins/sigv4.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/providers.py +1 -1
- package/project/.sdk/tm/py/pkg/feature/secrets/voxgig_sekreto/sekreto.py +1 -1
- package/project/.sdk/tm/py/pkg/utility/voxgig_struct/voxgig_struct.py +1 -1
- package/project/.sdk/tm/py/test/voxgig_omni/__init__.py +1 -1
- package/project/.sdk/tm/py/test/voxgig_omni/runner.py +1 -1
- package/project/.sdk/tm/py/test/voxgig_omni/util.py +1 -1
- package/project/.sdk/tm/rb/Makefile +7 -1
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/capability.rb +118 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/catalog.rb +55 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/config.rb +315 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/depend.rb +197 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/env.rb +143 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/export.rb +52 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/graph.rb +147 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/host.rb +1079 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/order.rb +169 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/point.rb +93 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/ref.rb +112 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/resolve.rb +56 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/types.rb +99 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin/version.rb +106 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_plugin.rb +24 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/addr.rb +111 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/aws.rb +200 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/azuresecrets.rb +130 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/boru.rb +121 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/doppler.rb +66 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/gcpsecrets.rb +107 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/hashicorp.rb +137 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/httpjson.rb +136 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/infisical.rb +97 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/onepassword.rb +104 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/secretspec.rb +113 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/plugins/sigv4.rb +127 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/providers.rb +210 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto/sekreto.rb +465 -0
- package/project/.sdk/tm/rb/feature/secrets/voxgig_sekreto.rb +30 -0
- package/project/.sdk/tm/rb/feature/secrets_feature.rb +561 -0
- package/project/.sdk/tm/rb/test/feature/secrets/secrets_feature_test.rb +842 -0
- package/project/.sdk/tm/rb/test/vendor/omni/runner.rb +2 -2
- package/project/.sdk/tm/rb/test/vendor/omni/util.rb +2 -2
- package/project/.sdk/tm/rb/test/vendor/omni/voxgig_omni.rb +2 -2
- package/project/.sdk/tm/rust/feature/secrets/plugin/capability.rs +130 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/catalog.rs +114 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/config.rs +416 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/depend.rs +245 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/env.rs +200 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/export.rs +90 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/graph.rs +231 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/host.rs +1565 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/mod.rs +18 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/order.rs +226 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/point.rs +137 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/refs.rs +148 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/resolve.rs +83 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/types.rs +132 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/value.rs +433 -0
- package/project/.sdk/tm/rust/feature/secrets/plugin/version.rs +174 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws/crypto.rs +146 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws/sigv4.rs +230 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/aws.rs +328 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/azuresecrets.rs +184 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/boru.rs +172 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/doppler.rs +102 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/gcpsecrets.rs +153 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/hashicorp.rs +228 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/http.rs +537 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson/json.rs +300 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/httpjson.rs +137 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/infisical.rs +148 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/onepassword.rs +165 -0
- package/project/.sdk/tm/rust/feature/secrets/plugins/secretspec.rs +150 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/addr.rs +144 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/mod.rs +51 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/providers.rs +637 -0
- package/project/.sdk/tm/rust/feature/secrets/sekreto/sekreto.rs +677 -0
- package/project/.sdk/tm/rust/feature/secrets.rs +961 -0
- package/project/.sdk/tm/rust/tests/feature/secrets/main.rs +1509 -0
- package/project/.sdk/tm/rust/tests/vendor/omni/json.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/mod.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/regex.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/runner.rs +2 -2
- package/project/.sdk/tm/rust/tests/vendor/omni/util.rs +2 -2
- package/project/.sdk/tm/scala/Makefile +8 -3
- package/project/.sdk/tm/scala/feature/SecretsFeature.scala +556 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Capability.scala +96 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Config.scala +270 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Depend.scala +216 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Env.scala +144 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Export.scala +59 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Graph.scala +149 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Host.scala +1089 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Json.scala +156 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Order.scala +169 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Plugin.scala +47 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Point.scala +107 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Refs.scala +131 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Resolve.scala +53 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Types.scala +110 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Value.scala +157 -0
- package/project/.sdk/tm/scala/feature/secrets/plugin/Version.scala +136 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Json.scala +302 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Provider.scala +20 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Providers.scala +281 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Sekreto.scala +473 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Spec.scala +123 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/Support.scala +216 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Aws.scala +225 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Azuresecrets.scala +124 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Boru.scala +104 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Doppler.scala +68 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Gcpsecrets.scala +97 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Hashicorp.scala +131 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Httpjson.scala +209 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Infisical.scala +98 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Onepassword.scala +90 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Secretspec.scala +95 -0
- package/project/.sdk/tm/scala/feature/secrets/sekreto/plugins/Sigv4.scala +214 -0
- package/project/.sdk/tm/scala/sdktest/feature/secrets/SecretsTestMain.scala +971 -0
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Json.scala +2 -2
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Runner.scala +2 -2
- package/project/.sdk/tm/scala/sdktest/vendor/omni/Util.scala +2 -2
- package/project/.sdk/tm/scala/utility/Make.scala +7 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/SecretsFeature.swift +669 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Capability.swift +98 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Catalog.swift +87 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Config.swift +298 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Depend.swift +209 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Env.swift +191 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Export.swift +63 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Graph.swift +158 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Host.swift +1141 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Json.swift +192 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Order.swift +183 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Point.swift +130 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Refs.swift +141 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Resolve.swift +59 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Types.swift +125 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Value.swift +198 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugin/Version.swift +139 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Aws.swift +271 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Azuresecrets.swift +173 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Boru.swift +139 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Crypto.swift +198 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Doppler.swift +86 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Gcpsecrets.swift +129 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Hashicorp.swift +175 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Httpjson.swift +310 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Infisical.swift +140 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Onepassword.swift +118 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Proc.swift +105 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Secretspec.swift +111 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/plugins/Sigv4.swift +297 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Addr.swift +120 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Json.swift +452 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Provider.swift +25 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Providers.swift +689 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/feature/secrets/sekreto/Sekreto.swift +755 -0
- package/project/.sdk/tm/swift/Sources/ProjectNameSDK/utility/MakeOptions.swift +9 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/PrimaryUtilityTest.swift +30 -0
- package/project/.sdk/tm/swift/Tests/ProjectNameSDKTests/feature/secrets/SecretsFeatureTest.swift +1030 -0
- package/project/.sdk/tm/swift/Tests/vendor/omni/Json.swift +2 -2
- package/project/.sdk/tm/swift/Tests/vendor/omni/Runner.swift +2 -2
- package/project/.sdk/tm/swift/Tests/vendor/omni/Util.swift +2 -2
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Capability.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Catalog.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Config.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Depend.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Env.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Export.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/FeatureHost.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Graph.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Host.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Order.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Point.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Ref.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Resolve.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Types.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/Version.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/plugin/index.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/Sekreto.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/index.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/aws.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/azuresecrets.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/boru.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/doppler.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/gcpsecrets.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/hashicorp.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/httpjson.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/infisical.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/onepassword.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/secretspec.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/plugins/sigv4.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/addr.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/builtin.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/dotenv.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/env.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/file.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/memory.ts +1 -1
- package/project/.sdk/tm/ts/src/feature/secrets/sekreto/provider/support.ts +1 -1
- package/project/.sdk/tm/ts/src/utility/StructUtility.ts +1 -1
- package/project/.sdk/tm/ts/test/vendor/omni/Runner.ts +1 -1
- package/project/.sdk/tm/ts/test/vendor/omni/Util.ts +1 -1
- package/project/.sdk/tm/ts/test/vendor/omni/index.ts +1 -1
- package/project/.sdk/tm/zig/test/vendor/omni/omni.zig +2 -2
- package/project/.sdk/tm/zig/test/vendor/omni/regex.zig +2 -2
- package/project/.sdk/tm/zig/utility/voxgigstruct/regex.zig +2 -2
- package/project/.sdk/tm/zig/utility/voxgigstruct/struct.zig +2 -2
- package/project/sdkgen-package.json +1 -4
- package/src/helpers/manifest.ts +81 -1
- package/src/helpers/modelNames.ts +284 -0
- package/src/helpers/naming.ts +45 -1
- package/src/sdkgen.ts +11 -1
- package/src/testkit.ts +115 -26
- package/src/utility.ts +17 -7
- package/project/.sdk/model/target/dart.aon +0 -58
- package/project/.sdk/model/target/lean.aon +0 -91
- package/project/.sdk/model/target/seneca-provider.aon +0 -120
- package/project/.sdk/src/cmp/dart/Config_dart.ts +0 -176
- package/project/.sdk/src/cmp/dart/EntityBase_dart.ts +0 -34
- package/project/.sdk/src/cmp/dart/EntityOperation_dart.ts +0 -43
- package/project/.sdk/src/cmp/dart/EntityTypes_dart.ts +0 -207
- package/project/.sdk/src/cmp/dart/Entity_dart.ts +0 -87
- package/project/.sdk/src/cmp/dart/Gitignore_dart.ts +0 -34
- package/project/.sdk/src/cmp/dart/MainEntity_dart.ts +0 -33
- package/project/.sdk/src/cmp/dart/Main_dart.ts +0 -106
- package/project/.sdk/src/cmp/dart/Package_dart.ts +0 -82
- package/project/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +0 -177
- package/project/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +0 -238
- package/project/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +0 -53
- package/project/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +0 -152
- package/project/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +0 -59
- package/project/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +0 -65
- package/project/.sdk/src/cmp/dart/ReadmeModel_dart.ts +0 -151
- package/project/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +0 -63
- package/project/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +0 -225
- package/project/.sdk/src/cmp/dart/ReadmeRef_dart.ts +0 -397
- package/project/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +0 -24
- package/project/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +0 -106
- package/project/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +0 -78
- package/project/.sdk/src/cmp/dart/SdkError_dart.ts +0 -42
- package/project/.sdk/src/cmp/dart/TestDirect_dart.ts +0 -516
- package/project/.sdk/src/cmp/dart/TestEntity_dart.ts +0 -628
- package/project/.sdk/src/cmp/dart/Test_dart.ts +0 -116
- package/project/.sdk/src/cmp/dart/fragment/Config.data.fragment.dart +0 -79
- package/project/.sdk/src/cmp/dart/fragment/Config.fragment.dart +0 -51
- package/project/.sdk/src/cmp/dart/fragment/Direct.test.fragment.dart +0 -25
- package/project/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +0 -29
- package/project/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +0 -28
- package/project/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +0 -302
- package/project/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +0 -98
- package/project/.sdk/src/cmp/dart/fragment/EntityListOp.fragment.dart +0 -90
- package/project/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +0 -102
- package/project/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +0 -108
- package/project/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +0 -102
- package/project/.sdk/src/cmp/dart/fragment/Main.fragment.dart +0 -338
- package/project/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +0 -26
- package/project/.sdk/src/cmp/dart/tsconfig.json +0 -15
- package/project/.sdk/src/cmp/dart/utility_dart.ts +0 -155
- package/project/.sdk/src/cmp/lean/Config_lean.ts +0 -93
- package/project/.sdk/src/cmp/lean/Entity_lean.ts +0 -9
- package/project/.sdk/src/cmp/lean/Gitignore_lean.ts +0 -18
- package/project/.sdk/src/cmp/lean/Main_lean.ts +0 -120
- package/project/.sdk/src/cmp/lean/Package_lean.ts +0 -93
- package/project/.sdk/src/cmp/lean/ReadmeEntity_lean.ts +0 -29
- package/project/.sdk/src/cmp/lean/ReadmeExplanation_lean.ts +0 -19
- package/project/.sdk/src/cmp/lean/ReadmeHowto_lean.ts +0 -25
- package/project/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +0 -39
- package/project/.sdk/src/cmp/lean/ReadmeIntro_lean.ts +0 -25
- package/project/.sdk/src/cmp/lean/ReadmeModel_lean.ts +0 -24
- package/project/.sdk/src/cmp/lean/ReadmeOptions_lean.ts +0 -22
- package/project/.sdk/src/cmp/lean/ReadmeQuick_lean.ts +0 -50
- package/project/.sdk/src/cmp/lean/ReadmeRef_lean.ts +0 -40
- package/project/.sdk/src/cmp/lean/ReadmeTopHowto_lean.ts +0 -16
- package/project/.sdk/src/cmp/lean/ReadmeTopQuick_lean.ts +0 -23
- package/project/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +0 -19
- package/project/.sdk/src/cmp/lean/Test_lean.ts +0 -261
- package/project/.sdk/src/cmp/lean/utility_lean.ts +0 -129
- package/project/.sdk/src/cmp/seneca-provider/Extras_seneca-provider.ts +0 -4080
- package/project/.sdk/src/cmp/seneca-provider/Gitignore_seneca-provider.ts +0 -161
- package/project/.sdk/src/cmp/seneca-provider/Main_seneca-provider.ts +0 -1011
- package/project/.sdk/tm/dart/LICENSE +0 -22
- package/project/.sdk/tm/dart/Makefile +0 -50
- package/project/.sdk/tm/dart/lib/Context.dart +0 -150
- package/project/.sdk/tm/dart/lib/Control.dart +0 -15
- package/project/.sdk/tm/dart/lib/Operation.dart +0 -31
- package/project/.sdk/tm/dart/lib/Point.dart +0 -51
- package/project/.sdk/tm/dart/lib/Response.dart +0 -32
- package/project/.sdk/tm/dart/lib/Result.dart +0 -39
- package/project/.sdk/tm/dart/lib/Spec.dart +0 -49
- package/project/.sdk/tm/dart/lib/feature/audit/AuditFeature.dart +0 -103
- package/project/.sdk/tm/dart/lib/feature/base/BaseFeature.dart +0 -76
- package/project/.sdk/tm/dart/lib/feature/cache/CacheFeature.dart +0 -152
- package/project/.sdk/tm/dart/lib/feature/clienttrack/ClienttrackFeature.dart +0 -104
- package/project/.sdk/tm/dart/lib/feature/cost/CostFeature.dart +0 -446
- package/project/.sdk/tm/dart/lib/feature/debug/DebugFeature.dart +0 -153
- package/project/.sdk/tm/dart/lib/feature/idempotency/IdempotencyFeature.dart +0 -92
- package/project/.sdk/tm/dart/lib/feature/log/LogFeature.dart +0 -85
- package/project/.sdk/tm/dart/lib/feature/metrics/MetricsFeature.dart +0 -103
- package/project/.sdk/tm/dart/lib/feature/netsim/NetsimFeature.dart +0 -186
- package/project/.sdk/tm/dart/lib/feature/paging/PagingFeature.dart +0 -240
- package/project/.sdk/tm/dart/lib/feature/proxy/ProxyFeature.dart +0 -118
- package/project/.sdk/tm/dart/lib/feature/ratelimit/RatelimitFeature.dart +0 -103
- package/project/.sdk/tm/dart/lib/feature/rbac/RbacFeature.dart +0 -121
- package/project/.sdk/tm/dart/lib/feature/retry/RetryFeature.dart +0 -155
- package/project/.sdk/tm/dart/lib/feature/streaming/StreamingFeature.dart +0 -97
- package/project/.sdk/tm/dart/lib/feature/telemetry/TelemetryFeature.dart +0 -136
- package/project/.sdk/tm/dart/lib/feature/test/TestFeature.dart +0 -328
- package/project/.sdk/tm/dart/lib/feature/timeout/TimeoutFeature.dart +0 -104
- package/project/.sdk/tm/dart/lib/utility/CleanUtility.dart +0 -12
- package/project/.sdk/tm/dart/lib/utility/DoneUtility.dart +0 -18
- package/project/.sdk/tm/dart/lib/utility/ErrUtility.dart +0 -46
- package/project/.sdk/tm/dart/lib/utility/FeatureAddUtility.dart +0 -35
- package/project/.sdk/tm/dart/lib/utility/FeatureHookUtility.dart +0 -20
- package/project/.sdk/tm/dart/lib/utility/FeatureInitUtility.dart +0 -9
- package/project/.sdk/tm/dart/lib/utility/FetcherUtility.dart +0 -104
- package/project/.sdk/tm/dart/lib/utility/GraphqlUtility.dart +0 -162
- package/project/.sdk/tm/dart/lib/utility/MakeContextUtility.dart +0 -6
- package/project/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +0 -71
- package/project/.sdk/tm/dart/lib/utility/MakeFetchDefUtility.dart +0 -42
- package/project/.sdk/tm/dart/lib/utility/MakeOptionsUtility.dart +0 -233
- package/project/.sdk/tm/dart/lib/utility/MakePointUtility.dart +0 -130
- package/project/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +0 -66
- package/project/.sdk/tm/dart/lib/utility/MakeResponseUtility.dart +0 -59
- package/project/.sdk/tm/dart/lib/utility/MakeResultUtility.dart +0 -49
- package/project/.sdk/tm/dart/lib/utility/MakeSpecUtility.dart +0 -77
- package/project/.sdk/tm/dart/lib/utility/MakeUrlUtility.dart +0 -51
- package/project/.sdk/tm/dart/lib/utility/ParamUtility.dart +0 -56
- package/project/.sdk/tm/dart/lib/utility/PrepareAuthUtility.dart +0 -46
- package/project/.sdk/tm/dart/lib/utility/PrepareBodyUtility.dart +0 -19
- package/project/.sdk/tm/dart/lib/utility/PrepareHeadersUtility.dart +0 -11
- package/project/.sdk/tm/dart/lib/utility/PrepareMethodUtility.dart +0 -30
- package/project/.sdk/tm/dart/lib/utility/PrepareParamsUtility.dart +0 -23
- package/project/.sdk/tm/dart/lib/utility/PreparePathUtility.dart +0 -9
- package/project/.sdk/tm/dart/lib/utility/PrepareQueryUtility.dart +0 -18
- package/project/.sdk/tm/dart/lib/utility/ResultBasicUtility.dart +0 -29
- package/project/.sdk/tm/dart/lib/utility/ResultBodyUtility.dart +0 -15
- package/project/.sdk/tm/dart/lib/utility/ResultHeadersUtility.dart +0 -18
- package/project/.sdk/tm/dart/lib/utility/StructUtility.dart +0 -127
- package/project/.sdk/tm/dart/lib/utility/TransformRequestUtility.dart +0 -28
- package/project/.sdk/tm/dart/lib/utility/TransformResponseUtility.dart +0 -44
- package/project/.sdk/tm/dart/lib/utility/Utility.dart +0 -239
- package/project/.sdk/tm/dart/lib/utility/voxgig_struct.dart +0 -2462
- package/project/.sdk/tm/dart/src/feature/README.md +0 -3
- package/project/.sdk/tm/dart/src/feature/proxy/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/ratelimit/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/rbac/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/retry/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/streaming/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/telemetry/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/test/.gitkeep +0 -0
- package/project/.sdk/tm/dart/src/feature/timeout/.gitkeep +0 -0
- package/project/.sdk/tm/dart/test/custom_test.dart +0 -65
- package/project/.sdk/tm/dart/test/exists_test.dart +0 -12
- package/project/.sdk/tm/dart/test/feature/harness.dart +0 -329
- package/project/.sdk/tm/dart/test/feature_test.dart +0 -1193
- package/project/.sdk/tm/dart/test/harness.dart +0 -153
- package/project/.sdk/tm/dart/test/netsim_test.dart +0 -48
- package/project/.sdk/tm/dart/test/omni.dart +0 -520
- package/project/.sdk/tm/dart/test/omni_smoke_test.dart +0 -143
- package/project/.sdk/tm/dart/test/pipeline_test.dart +0 -608
- package/project/.sdk/tm/dart/test/primary_test.dart +0 -476
- package/project/.sdk/tm/dart/test/sdk-test-control.json +0 -19
- package/project/.sdk/tm/dart/test/struct_test.dart +0 -468
- package/project/.sdk/tm/dart/test/utility.dart +0 -198
- package/project/.sdk/tm/dart/test/vendor/omni/omni.dart +0 -7
- package/project/.sdk/tm/dart/test/vendor/omni/runner.dart +0 -653
- package/project/.sdk/tm/dart/test/vendor/omni/util.dart +0 -232
- package/project/.sdk/tm/lean/LICENSE +0 -21
- package/project/.sdk/tm/lean/Makefile +0 -32
- package/project/.sdk/tm/lean/VERSION +0 -1
- package/project/.sdk/tm/lean/src/SdkFeature.lean +0 -171
- package/project/.sdk/tm/lean/src/SdkFeatures.lean +0 -787
- package/project/.sdk/tm/lean/src/SdkJson.lean +0 -134
- package/project/.sdk/tm/lean/src/SdkRuntime.lean +0 -374
- package/project/.sdk/tm/lean/src/SdkUtility.lean +0 -809
- package/project/.sdk/tm/lean/src/VoxgigStruct.lean +0 -2880
- package/project/.sdk/tm/lean/src/Vregex.lean +0 -412
- package/project/.sdk/tm/lean/src/feature/README.md +0 -5
- package/project/.sdk/tm/lean/src/feature/audit/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/base/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/cache/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/clienttrack/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/cost/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/debug/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/idempotency/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/log/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/metrics/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/netsim/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/paging/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/proxy/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/ratelimit/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/rbac/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/retry/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/streaming/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/telemetry/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/test/.gitkeep +0 -0
- package/project/.sdk/tm/lean/src/feature/timeout/.gitkeep +0 -0
- package/project/.sdk/tm/lean/test/OmniResolver.lean +0 -358
- package/project/.sdk/tm/lean/test/OmniSmoke.lean +0 -174
- package/project/.sdk/tm/lean/test/StructCorpus.lean +0 -368
- package/project/.sdk/tm/lean/test/TFeature.lean +0 -281
- package/project/.sdk/tm/lean/test/TPrimaryUtility.lean +0 -227
- package/project/.sdk/tm/lean/test/vendor/omni/Omni.lean +0 -997
- package/project/.sdk/tm/seneca-provider/CODE_OF_CONDUCT.md +0 -132
- package/project/.sdk/tm/seneca-provider/LICENSE +0 -21
- package/project/.sdk/tm/seneca-provider/Makefile +0 -15
- package/project/.sdk/tm/seneca-provider/src/tsconfig.json +0 -18
- package/project/.sdk/tm/seneca-provider/test/tsconfig.json +0 -16
- package/project/.sdk/tm/seneca-provider/tsfmt.json +0 -3
- /package/project/.sdk/tm/{dart/src/feature/audit → clojure/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/base → csharp/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/cache → elixir/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/clienttrack → java/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/cost → kotlin/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/debug → perl/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/idempotency → php/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/log → rb/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/metrics → rust/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/netsim → scala/src/feature/secrets}/.gitkeep +0 -0
- /package/project/.sdk/tm/{dart/src/feature/paging → swift/src/feature/secrets}/.gitkeep +0 -0
|
@@ -0,0 +1,1514 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
// VENDORED: @voxgig/plugin sdk-20260908-1556-0 (php/src/Host.php)
|
|
3
|
+
// Source: https://github.com/voxgig/plugin @ 48392f5e2b6d1434ee9b1a4a9a11f4480aaeb46a [tag: sdk-20260908-1556-0]
|
|
4
|
+
// License: MIT (c) voxgig - see repository LICENSE. Do not edit: resync from upstream.
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The host: the lifecycle state machine (§5), extension points (§6), and
|
|
8
|
+
* resource capture (§8).
|
|
9
|
+
*
|
|
10
|
+
* TWO RULES SHAPE EVERY METHOD BELOW.
|
|
11
|
+
*
|
|
12
|
+
* Transitions are SEQUENTIAL (§5.2). One at a time, in call order, never
|
|
13
|
+
* interleaved; a transition triggered from inside a lifecycle callback is
|
|
14
|
+
* `plugin_reentrant`. A hard rule, because it is the only way the
|
|
15
|
+
* semantics can be identical in Go, in PHP and in single-threaded
|
|
16
|
+
* JavaScript.
|
|
17
|
+
*
|
|
18
|
+
* Reconciliation is EAGER (§18's portability budget). A transition settles
|
|
19
|
+
* by running the state machine to a fixed point, not by suspending on a
|
|
20
|
+
* promise.
|
|
21
|
+
*
|
|
22
|
+
* AND ONE RULE SHAPES THE SHAPE. A PHP array is a VALUE: reading an
|
|
23
|
+
* instance record out of the registry copies it, and writing to the copy
|
|
24
|
+
* changes nothing. Every record the host mutates is therefore an `Entry`
|
|
25
|
+
* OBJECT, and `Inst` holds that object rather than an array.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
declare(strict_types=1);
|
|
29
|
+
|
|
30
|
+
namespace Voxgig\Plugin;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* One instance's record. An object, not an array, so that the registry,
|
|
34
|
+
* the `Inst` handed to callbacks and any closure that captured it all see
|
|
35
|
+
* one set of values (see the file header).
|
|
36
|
+
*/
|
|
37
|
+
class Entry
|
|
38
|
+
{
|
|
39
|
+
public string $ref;
|
|
40
|
+
|
|
41
|
+
/** @var array<string,mixed> */
|
|
42
|
+
public array $def;
|
|
43
|
+
|
|
44
|
+
public string $status = 'declared';
|
|
45
|
+
|
|
46
|
+
public int $pos = 0;
|
|
47
|
+
|
|
48
|
+
public int $seq = 0;
|
|
49
|
+
|
|
50
|
+
/** @var array<string,mixed> */
|
|
51
|
+
public array $options = [];
|
|
52
|
+
|
|
53
|
+
/** The mutable per-instance state a definition owns (§5.4). */
|
|
54
|
+
public Bag $state;
|
|
55
|
+
|
|
56
|
+
/** @var mixed */
|
|
57
|
+
public $order = null;
|
|
58
|
+
|
|
59
|
+
/** @var string[] */
|
|
60
|
+
public array $unmet = [];
|
|
61
|
+
|
|
62
|
+
/** @var array<int,callable> */
|
|
63
|
+
public array $scope = [];
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* §11.4's ALWAYS-RELUCTANT rebinding made concrete: the provider ref
|
|
67
|
+
* this instance's activation actually chose, per requirement name.
|
|
68
|
+
* Re-ranking on every question silently re-points a live consumer at
|
|
69
|
+
* any better newcomer, and then losing the provider it was really
|
|
70
|
+
* using does not restart it.
|
|
71
|
+
*
|
|
72
|
+
* @var array<string,string>
|
|
73
|
+
*/
|
|
74
|
+
public array $selected = [];
|
|
75
|
+
|
|
76
|
+
/** @var array<int,array<string,mixed>> */
|
|
77
|
+
public array $bindings = [];
|
|
78
|
+
|
|
79
|
+
/** @var array<string,mixed> */
|
|
80
|
+
public array $exports = [];
|
|
81
|
+
|
|
82
|
+
/** @var array<int,array<string,mixed>> */
|
|
83
|
+
public array $provides = [];
|
|
84
|
+
|
|
85
|
+
public ?Host $inner = null;
|
|
86
|
+
|
|
87
|
+
public bool $barred = false;
|
|
88
|
+
|
|
89
|
+
public function __construct(string $ref, array $def)
|
|
90
|
+
{
|
|
91
|
+
$this->ref = $ref;
|
|
92
|
+
$this->def = $def;
|
|
93
|
+
$this->state = new Bag();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* What a definition's callbacks see. Deliberately not the internal record:
|
|
99
|
+
* a plugin that could reach `status` could also write it.
|
|
100
|
+
*/
|
|
101
|
+
class Inst
|
|
102
|
+
{
|
|
103
|
+
public string $ref;
|
|
104
|
+
|
|
105
|
+
public string $name;
|
|
106
|
+
|
|
107
|
+
public string $tag;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The instance's own mutable state. A `Bag` rather than an array so
|
|
111
|
+
* that `$i->state['count'] = 1` and `$i->state['unwound'][] = 2` reach
|
|
112
|
+
* the instance instead of a copy - PHP's arrays are values, and this
|
|
113
|
+
* is the one place a plugin author would never expect that.
|
|
114
|
+
*/
|
|
115
|
+
public Bag $state;
|
|
116
|
+
|
|
117
|
+
private Host $hostref;
|
|
118
|
+
|
|
119
|
+
private Entry $entry;
|
|
120
|
+
|
|
121
|
+
public function __construct(Host $host, Entry $entry)
|
|
122
|
+
{
|
|
123
|
+
$this->hostref = $host;
|
|
124
|
+
$this->entry = $entry;
|
|
125
|
+
$this->ref = $entry->ref;
|
|
126
|
+
$parsed = parse_ref($entry->ref);
|
|
127
|
+
$this->name = $parsed['name'];
|
|
128
|
+
$this->tag = $parsed['tag'];
|
|
129
|
+
$this->state = $entry->state;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* The resolved options, READ FRESH. `apply` and `options` replace the
|
|
134
|
+
* map wholesale, so a callback that cached this at `define` would hold
|
|
135
|
+
* the values a later document already changed.
|
|
136
|
+
*
|
|
137
|
+
* @return array<string,mixed>
|
|
138
|
+
*/
|
|
139
|
+
public function options(): array
|
|
140
|
+
{
|
|
141
|
+
return $this->entry->options;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public function host(): Host
|
|
145
|
+
{
|
|
146
|
+
return $this->hostref;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Foreign resources the host did not hand out are registered
|
|
151
|
+
* explicitly (§8.3); host calls are recorded automatically.
|
|
152
|
+
*
|
|
153
|
+
* SYMMETRIC WITH `acquire`, and it has to be: `open` counts the
|
|
154
|
+
* resources CURRENTLY HELD, so an entry that is registered and then
|
|
155
|
+
* unwound must leave the count where it found it.
|
|
156
|
+
*/
|
|
157
|
+
public function release(callable $fn): void
|
|
158
|
+
{
|
|
159
|
+
// §8.3: "`inst.release` outside `activate` is
|
|
160
|
+
// `plugin_release_scope`". `intransition` is true in `define` too,
|
|
161
|
+
// and a scope entry registered there is never unwound.
|
|
162
|
+
if ('activate' !== $this->hostref->phase()) {
|
|
163
|
+
fail_with('plugin_release_scope', 'release called outside activate');
|
|
164
|
+
}
|
|
165
|
+
$host = $this->hostref;
|
|
166
|
+
$done = new \stdClass();
|
|
167
|
+
$done->at = false;
|
|
168
|
+
$this->entry->scope[] = static function () use ($done, $host, $fn) {
|
|
169
|
+
if (!$done->at) {
|
|
170
|
+
$done->at = true;
|
|
171
|
+
$host->open_dec();
|
|
172
|
+
$fn();
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
$host->open_inc();
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* The synthetic counter the driver owns, so "what is open" is data
|
|
180
|
+
* rather than an assertion each port words differently.
|
|
181
|
+
*
|
|
182
|
+
* Returns its own release, so a plugin can hand one back early. The
|
|
183
|
+
* scope still holds the entry and unwinding it twice is a no-op -
|
|
184
|
+
* releasing early must not make teardown wrong.
|
|
185
|
+
*/
|
|
186
|
+
public function acquire(): callable
|
|
187
|
+
{
|
|
188
|
+
// §8.1: resources are "acquired during `activate` - the scope's
|
|
189
|
+
// actual job". Same reason as `release` above.
|
|
190
|
+
if ('activate' !== $this->hostref->phase()) {
|
|
191
|
+
fail_with('plugin_release_scope', 'acquire called outside activate');
|
|
192
|
+
}
|
|
193
|
+
$host = $this->hostref;
|
|
194
|
+
$done = new \stdClass();
|
|
195
|
+
$done->at = false;
|
|
196
|
+
$rel = static function () use ($done, $host) {
|
|
197
|
+
if (!$done->at) {
|
|
198
|
+
$done->at = true;
|
|
199
|
+
$host->open_dec();
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
$this->entry->scope[] = $rel;
|
|
203
|
+
$host->open_inc();
|
|
204
|
+
return $rel;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Bind into a host point. Declared in `define`; the host inserts it
|
|
209
|
+
* only after `activate` returns successfully (§8.1), which is why a
|
|
210
|
+
* failing activate leaves no live binding behind.
|
|
211
|
+
*/
|
|
212
|
+
public function bind(string $point, callable $fn, $band = null): void
|
|
213
|
+
{
|
|
214
|
+
// §12 has carried `plugin_bind_scope` - "binding declared outside
|
|
215
|
+
// `define`" - since before anything raised it. §8.1 puts binding
|
|
216
|
+
// DECLARATION in `define` and INSERTION at a successful activate,
|
|
217
|
+
// and the guard was the half nobody wrote: a binding added from
|
|
218
|
+
// `activate` went live without being part of the loaded
|
|
219
|
+
// definition, and a deactivate/activate cycle appended it again.
|
|
220
|
+
if ('define' !== $this->hostref->phase()) {
|
|
221
|
+
fail_with('plugin_bind_scope', 'bind called outside define: ' . $point,
|
|
222
|
+
['ref' => $this->ref, 'point' => $point]);
|
|
223
|
+
}
|
|
224
|
+
if (!$this->hostref->haspoint($point)) {
|
|
225
|
+
fail_with('plugin_point_unknown', 'no such point: ' . $point,
|
|
226
|
+
['point' => $point]);
|
|
227
|
+
}
|
|
228
|
+
$this->entry->bindings[] = ['ref' => $this->ref, 'point' => $point,
|
|
229
|
+
'fn' => $fn, 'band' => $band ?? 0];
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Published for other plugins and for the application (§11). */
|
|
233
|
+
public function export(string $key, $value): void
|
|
234
|
+
{
|
|
235
|
+
$this->entry->exports[$key] = $value;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/** What this instance can do for others (§11.1). */
|
|
239
|
+
public function provides(array $prov): void
|
|
240
|
+
{
|
|
241
|
+
$this->entry->provides[] = $prov;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Where this binding landed (§6.6) - the plugin-side counterpart to a
|
|
246
|
+
* host pin. THE HOST DOES NOT POLICE THIS; it just makes the fact
|
|
247
|
+
* available. Verification tells a plugin it was misplaced; a pin (§7)
|
|
248
|
+
* stops the misplacement from being expressible at all. The two are
|
|
249
|
+
* not substitutes.
|
|
250
|
+
*
|
|
251
|
+
* @return array<string,mixed>
|
|
252
|
+
*/
|
|
253
|
+
public function position(?string $point): array
|
|
254
|
+
{
|
|
255
|
+
return $this->hostref->positionof($this->ref, $point);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* AN INSTANCE MAY ITSELF BE A HOST (§6.5), and THE OUTER ONE OWNS THE
|
|
260
|
+
* INNER ONE'S LIFETIME. Registering the teardown in the instance scope
|
|
261
|
+
* is what makes that true rather than aspirational.
|
|
262
|
+
*/
|
|
263
|
+
public function nest(?array $nestopts = null): Host
|
|
264
|
+
{
|
|
265
|
+
if (!$this->hostref->intransition()) {
|
|
266
|
+
fail_with('plugin_release_scope',
|
|
267
|
+
'nest called outside a lifecycle callback');
|
|
268
|
+
}
|
|
269
|
+
$inner = new Host($nestopts);
|
|
270
|
+
$this->entry->scope[] = static function () use ($inner) {
|
|
271
|
+
$inner->close();
|
|
272
|
+
};
|
|
273
|
+
$this->entry->inner = $inner;
|
|
274
|
+
return $inner;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
class Host
|
|
279
|
+
{
|
|
280
|
+
public Catalog $catalog;
|
|
281
|
+
|
|
282
|
+
/** @var array<string,mixed> */
|
|
283
|
+
private array $opts;
|
|
284
|
+
|
|
285
|
+
private string $dependency;
|
|
286
|
+
|
|
287
|
+
/** Set for the duration of a bulk teardown, so `held` knows this is a
|
|
288
|
+
* coordinated operation rather than an ad-hoc deactivation. */
|
|
289
|
+
private bool $coordinated = false;
|
|
290
|
+
|
|
291
|
+
/** @var string[] */
|
|
292
|
+
private array $reserved;
|
|
293
|
+
|
|
294
|
+
/** @var array<string,mixed> */
|
|
295
|
+
private array $points;
|
|
296
|
+
|
|
297
|
+
/** @var array<string,Entry> */
|
|
298
|
+
private array $inst = [];
|
|
299
|
+
|
|
300
|
+
/** @var string[] */
|
|
301
|
+
private array $log = [];
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* §14: the lifecycle event record. `seq` distinguishes ONE INCARNATION
|
|
305
|
+
* of stripe$test from the next, which is the whole reason it is not
|
|
306
|
+
* `pos` (§4 rule 4).
|
|
307
|
+
*
|
|
308
|
+
* @var array<int,array<string,mixed>>
|
|
309
|
+
*/
|
|
310
|
+
private array $events = [];
|
|
311
|
+
|
|
312
|
+
private int $seqn = 0;
|
|
313
|
+
|
|
314
|
+
private int $open = 0;
|
|
315
|
+
|
|
316
|
+
private bool $transitioning = false;
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* WHICH callback is running, not merely that one is. §8.1 puts
|
|
320
|
+
* resource capture in `activate` and 8.3 says `release` outside
|
|
321
|
+
* `activate` is `plugin_release_scope` - and a flag alone cannot tell
|
|
322
|
+
* `activate` from `define`, so it admitted an acquire in `define`
|
|
323
|
+
* whose scope `unload` would never unwind.
|
|
324
|
+
*/
|
|
325
|
+
private ?string $phase = null;
|
|
326
|
+
|
|
327
|
+
public function __construct(?array $options = null)
|
|
328
|
+
{
|
|
329
|
+
$this->opts = $options ?? [];
|
|
330
|
+
// `??` covers both an absent key and an explicit null, which is
|
|
331
|
+
// what a driver passing an unset command field hands over.
|
|
332
|
+
$this->dependency = $this->opts['dependency'] ?? 'restart';
|
|
333
|
+
$this->catalog = $this->opts['catalog'] ?? make_catalog();
|
|
334
|
+
$this->reserved = $this->opts['reserved'] ?? [];
|
|
335
|
+
$this->points = $this->opts['points'] ?? [];
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
public function intransition(): bool
|
|
339
|
+
{
|
|
340
|
+
return $this->transitioning;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
public function phase(): ?string
|
|
344
|
+
{
|
|
345
|
+
return $this->phase;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
public function haspoint(string $name): bool
|
|
349
|
+
{
|
|
350
|
+
return array_key_exists($name, $this->points);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
public function open_inc(): void
|
|
354
|
+
{
|
|
355
|
+
$this->open++;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
public function open_dec(): void
|
|
359
|
+
{
|
|
360
|
+
$this->open--;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// --- observation ------------------------------------------------
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Introspection NEVER advances the state (§5.2). A status page must
|
|
367
|
+
* not be a way to accidentally import twenty packages.
|
|
368
|
+
*
|
|
369
|
+
* @return array<string,string>
|
|
370
|
+
*/
|
|
371
|
+
public function list(): array
|
|
372
|
+
{
|
|
373
|
+
$out = [];
|
|
374
|
+
foreach (Util::sortedkeys($this->inst) as $r) {
|
|
375
|
+
$out[$r] = $this->inst[$r]->status;
|
|
376
|
+
}
|
|
377
|
+
return $out;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
public function instance($ref): ?Entry
|
|
381
|
+
{
|
|
382
|
+
return $this->inst[canon_ref($ref)] ?? null;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/** @return array<int,array<string,mixed>> */
|
|
386
|
+
public function trace(): array
|
|
387
|
+
{
|
|
388
|
+
return $this->events;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* @param mixed $result
|
|
393
|
+
* @return array<string,mixed>
|
|
394
|
+
*/
|
|
395
|
+
public function observable($result = null): array
|
|
396
|
+
{
|
|
397
|
+
return ['status' => $this->list(), 'open' => $this->open,
|
|
398
|
+
'log' => $this->log, 'result' => $result];
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// --- the state machine ------------------------------------------
|
|
402
|
+
|
|
403
|
+
public function guard(): void
|
|
404
|
+
{
|
|
405
|
+
if (!$this->transitioning) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
fail_with('plugin_reentrant',
|
|
409
|
+
'transition attempted from inside a lifecycle callback');
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
private function need($ref): Entry
|
|
413
|
+
{
|
|
414
|
+
$r = canon_ref($ref);
|
|
415
|
+
$entry = $this->inst[$r] ?? null;
|
|
416
|
+
if (null === $entry) {
|
|
417
|
+
fail_with('plugin_not_loaded', 'no such instance: ' . $r, ['ref' => $r]);
|
|
418
|
+
}
|
|
419
|
+
return $entry;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
private function checkreserved(string $ref): void
|
|
423
|
+
{
|
|
424
|
+
if (empty($this->reserved)) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (!in_array(refname($ref), $this->reserved, true)) {
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
fail_with('plugin_ref_reserved', 'ref is reserved by the host: ' . $ref,
|
|
431
|
+
['ref' => $ref]);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
private function run(Entry $entry, string $callback, string $at): void
|
|
435
|
+
{
|
|
436
|
+
$fn = $entry->def[$callback] ?? null;
|
|
437
|
+
$this->log[] = $entry->ref . ':' . $at;
|
|
438
|
+
$this->events[] = ['ref' => $entry->ref, 'event' => $at,
|
|
439
|
+
'seq' => $entry->seq, 'status' => $entry->status];
|
|
440
|
+
if (!is_callable($fn)) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
$this->transitioning = true;
|
|
445
|
+
$this->phase = $at;
|
|
446
|
+
try {
|
|
447
|
+
$fn(new Inst($this, $entry));
|
|
448
|
+
} catch (\Throwable $e) {
|
|
449
|
+
// §12: `plugin_define_failed` and its three siblings are "a
|
|
450
|
+
// callback raised; wraps the cause". AN ERROR THAT ALREADY
|
|
451
|
+
// CARRIES A CODE KEEPS IT - the code is the error's identity,
|
|
452
|
+
// and a plugin raising `store_unreachable` must not have it
|
|
453
|
+
// rewritten. Only a code-less error is wrapped.
|
|
454
|
+
if ('' !== codeof($e)) {
|
|
455
|
+
throw $e;
|
|
456
|
+
}
|
|
457
|
+
fail_with('plugin_' . $at . '_failed',
|
|
458
|
+
$entry->ref . ' raised in ' . $at . ': ' . $e->getMessage(),
|
|
459
|
+
['ref' => $entry->ref, 'cause' => $e->getMessage()]);
|
|
460
|
+
} finally {
|
|
461
|
+
$this->transitioning = false;
|
|
462
|
+
$this->phase = null;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* AUTO-TAGGING IS EXPLICIT (§4 rule 3). `declare('stripe', ['tag' =>
|
|
468
|
+
* '?'])` assigns the LOWEST UNUSED POSITIVE INTEGER tag and returns
|
|
469
|
+
* the assigned pair. Without `'?'`, a collision is an error.
|
|
470
|
+
*/
|
|
471
|
+
private function autotag(string $name): string
|
|
472
|
+
{
|
|
473
|
+
$n = 1;
|
|
474
|
+
while (true) {
|
|
475
|
+
$cand = format_ref($name, (string)$n);
|
|
476
|
+
if (!array_key_exists($cand, $this->inst)) {
|
|
477
|
+
return $cand;
|
|
478
|
+
}
|
|
479
|
+
$n++;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* @param array<string,mixed>|null $spec
|
|
485
|
+
*/
|
|
486
|
+
public function declare($ref, ?array $spec = null): Entry
|
|
487
|
+
{
|
|
488
|
+
$spec = $spec ?? [];
|
|
489
|
+
if ('?' === ($spec['tag'] ?? null)) {
|
|
490
|
+
$ref = $this->autotag(refname(canon_ref($ref)));
|
|
491
|
+
}
|
|
492
|
+
$r = canon_ref($ref);
|
|
493
|
+
if (!Util::truthy($spec['hostowned'] ?? null)) {
|
|
494
|
+
$this->checkreserved($r);
|
|
495
|
+
}
|
|
496
|
+
$defname = $spec['definition'] ?? refname($r);
|
|
497
|
+
$definition = $this->catalog->get($defname);
|
|
498
|
+
if (null === $definition) {
|
|
499
|
+
fail_with('plugin_unknown_definition', 'not in catalog: ' . $defname,
|
|
500
|
+
['name' => $defname]);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
$existing = $this->inst[$r] ?? null;
|
|
504
|
+
if (null !== $existing) {
|
|
505
|
+
// §4 rule 1: a pair addresses at most one instance.
|
|
506
|
+
// Re-declaring the SAME definition is the idempotent case; a
|
|
507
|
+
// different one is a duplicate, not a silent overwrite
|
|
508
|
+
// (seneca) and not an impossibility (sdkgen).
|
|
509
|
+
if ($existing->def['name'] !== $definition['name']) {
|
|
510
|
+
fail_with('plugin_ref_duplicate', 'instance already declared: ' . $r,
|
|
511
|
+
['ref' => $r]);
|
|
512
|
+
}
|
|
513
|
+
return $existing;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
$entry = new Entry($r, $definition);
|
|
517
|
+
$entry->pos = null === ($spec['pos'] ?? null)
|
|
518
|
+
? count($this->inst) : $spec['pos'];
|
|
519
|
+
$entry->seq = $this->seqn;
|
|
520
|
+
$entry->options = $spec['options'] ?? [];
|
|
521
|
+
$entry->order = $spec['order'] ?? null;
|
|
522
|
+
$this->seqn++;
|
|
523
|
+
$this->inst[$r] = $entry;
|
|
524
|
+
return $entry;
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* §9.1: a host that reserves a name MUST still be able to declare the
|
|
529
|
+
* instance it reserved - "The host declares those instances itself,
|
|
530
|
+
* after the user merge, and always wins."
|
|
531
|
+
*
|
|
532
|
+
* THE BOUNDARY IS BY METHOD, NOT BY CALLER, and that is a real limit:
|
|
533
|
+
* no language here can tell the embedding host from a plugin holding
|
|
534
|
+
* the same host object. What reservation protects is CONFIGURATION -
|
|
535
|
+
* documents, overlays, `VOXGIG_PLUGIN_*`, construction options and
|
|
536
|
+
* ordinary declare/load/options - and all of that still checks.
|
|
537
|
+
*/
|
|
538
|
+
public function hostdeclare($ref, ?array $spec = null): Entry
|
|
539
|
+
{
|
|
540
|
+
$this->guard();
|
|
541
|
+
$spec = $spec ?? [];
|
|
542
|
+
$spec['hostowned'] = true;
|
|
543
|
+
return $this->declare($ref, $spec);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
public function load($ref, ?array $spec = null): Entry
|
|
547
|
+
{
|
|
548
|
+
$this->guard();
|
|
549
|
+
$spec = $spec ?? [];
|
|
550
|
+
$entry = $this->declare($ref, $spec);
|
|
551
|
+
if ('declared' !== $entry->status) {
|
|
552
|
+
return $entry; // idempotent trivially
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// PRESENCE, NOT TRUTH. An empty options map must CLEAR what the
|
|
556
|
+
// instance was declared with, and `if ($spec['options'])` is false
|
|
557
|
+
// for `[]` in PHP - which would keep options a document just
|
|
558
|
+
// removed.
|
|
559
|
+
if (null !== ($spec['options'] ?? null)) {
|
|
560
|
+
$entry->options = $spec['options'];
|
|
561
|
+
}
|
|
562
|
+
try {
|
|
563
|
+
$this->run($entry, 'define', 'define');
|
|
564
|
+
} catch (\Throwable $e) {
|
|
565
|
+
$entry->status = 'failed';
|
|
566
|
+
throw $e;
|
|
567
|
+
}
|
|
568
|
+
$entry->status = 'loaded';
|
|
569
|
+
|
|
570
|
+
// AT LOAD, and before anything runs: a cycle through
|
|
571
|
+
// restart-causing requirements does not settle, and the only safe
|
|
572
|
+
// time to report a non-terminating reconcile is before it starts
|
|
573
|
+
// (§11.3). `provides` is populated by `define`, which has just
|
|
574
|
+
// run, so this is the first moment the graph is complete.
|
|
575
|
+
try {
|
|
576
|
+
checkcycle($this->graphnodes());
|
|
577
|
+
} catch (\Throwable $e) {
|
|
578
|
+
$entry->status = 'failed';
|
|
579
|
+
throw $e;
|
|
580
|
+
}
|
|
581
|
+
return $entry;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
/**
|
|
585
|
+
* The requirement graph as plain data, for the pure detector.
|
|
586
|
+
*
|
|
587
|
+
* @return array<int,array<string,mixed>>
|
|
588
|
+
*/
|
|
589
|
+
private function graphnodes(): array
|
|
590
|
+
{
|
|
591
|
+
$out = [];
|
|
592
|
+
foreach (Util::sortedkeys($this->inst) as $r) {
|
|
593
|
+
$entry = $this->inst[$r];
|
|
594
|
+
$provides = [];
|
|
595
|
+
foreach ($entry->provides as $p) {
|
|
596
|
+
$provides[] = $p['name'];
|
|
597
|
+
}
|
|
598
|
+
$out[] = ['ref' => $r, 'provides' => $provides,
|
|
599
|
+
'requires' => requirements($entry->options)];
|
|
600
|
+
}
|
|
601
|
+
return $out;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
public function activate($ref): Entry
|
|
605
|
+
{
|
|
606
|
+
$this->guard();
|
|
607
|
+
$entry = $this->need($ref);
|
|
608
|
+
if ('live' === $entry->status) {
|
|
609
|
+
return $entry; // no-op returning success
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
if ('failed' === $entry->status) {
|
|
613
|
+
fail_with('plugin_bad_state', 'instance has failed: ' . $entry->ref,
|
|
614
|
+
['ref' => $entry->ref]);
|
|
615
|
+
}
|
|
616
|
+
// §9.6: `active: false` bars the instance from running, and the
|
|
617
|
+
// bar is on the INSTANCE rather than on the apply that set it.
|
|
618
|
+
// `ready` reaches this through `activate`, so one guard covers
|
|
619
|
+
// both verbs the design names.
|
|
620
|
+
if ($entry->barred) {
|
|
621
|
+
fail_with('plugin_inactive',
|
|
622
|
+
'instance is barred by active: false: ' . $entry->ref,
|
|
623
|
+
['ref' => $entry->ref]);
|
|
624
|
+
}
|
|
625
|
+
if ('declared' === $entry->status) {
|
|
626
|
+
$this->load($entry->ref);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
// A declared requirement that is not live means `pending`:
|
|
630
|
+
// activation is a STANDING REQUEST, not a one-shot event.
|
|
631
|
+
$unmet = $this->unmetof($entry);
|
|
632
|
+
if (!empty($unmet)) {
|
|
633
|
+
$entry->unmet = $unmet;
|
|
634
|
+
$entry->status = 'pending';
|
|
635
|
+
return $entry;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
try {
|
|
639
|
+
$this->run($entry, 'activate', 'activate');
|
|
640
|
+
} catch (\Throwable $e) {
|
|
641
|
+
// Unwind whatever the partial activation captured, in reverse.
|
|
642
|
+
$this->unwind($entry);
|
|
643
|
+
$entry->status = 'failed';
|
|
644
|
+
throw $e;
|
|
645
|
+
}
|
|
646
|
+
// §11.4: THE SELECTION IS MADE HERE, once, and remembered. Every
|
|
647
|
+
// later question - the cascade, `hold`, `unmet` - reads it back
|
|
648
|
+
// rather than re-ranking, which is what "always-reluctant" means.
|
|
649
|
+
foreach (requirements($entry->options) as $req) {
|
|
650
|
+
$this->chosen($entry, $req, true);
|
|
651
|
+
}
|
|
652
|
+
$entry->status = 'live';
|
|
653
|
+
$this->reconcile();
|
|
654
|
+
return $entry;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
public function deactivate($ref): Entry
|
|
658
|
+
{
|
|
659
|
+
$this->guard();
|
|
660
|
+
$entry = $this->need($ref);
|
|
661
|
+
if (in_array($entry->status, ['loaded', 'declared'], true)) {
|
|
662
|
+
return $entry;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
// §5.2: `unload` is THE ONLY TRANSITION OUT OF `failed`.
|
|
666
|
+
if ('failed' === $entry->status) {
|
|
667
|
+
fail_with('plugin_bad_state', 'instance has failed: ' . $entry->ref,
|
|
668
|
+
['ref' => $entry->ref]);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
if ('pending' === $entry->status) {
|
|
672
|
+
// DEACTIVATING A PENDING INSTANCE RUNS NO CALLBACK (§5.2). It
|
|
673
|
+
// never reached activate, so it holds no scope and no live
|
|
674
|
+
// bindings; running the definition's deactivate there would be
|
|
675
|
+
// teardown without matching setup, which plugins are not
|
|
676
|
+
// written to survive and which could fail an instance that had
|
|
677
|
+
// done nothing wrong. It cannot fail.
|
|
678
|
+
$entry->status = 'loaded';
|
|
679
|
+
$entry->unmet = [];
|
|
680
|
+
return $entry;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
$this->held($entry);
|
|
684
|
+
$this->cascade($entry, new Bag());
|
|
685
|
+
|
|
686
|
+
try {
|
|
687
|
+
$this->run($entry, 'deactivate', 'deactivate');
|
|
688
|
+
} catch (\Throwable $e) {
|
|
689
|
+
$this->unwind($entry);
|
|
690
|
+
$entry->status = 'failed';
|
|
691
|
+
throw $e;
|
|
692
|
+
}
|
|
693
|
+
$this->releasecheck($entry, $this->unwind($entry));
|
|
694
|
+
$entry->status = 'loaded';
|
|
695
|
+
$this->reconcile();
|
|
696
|
+
return $entry;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
public function unload($ref): void
|
|
700
|
+
{
|
|
701
|
+
$this->guard();
|
|
702
|
+
$entry = $this->need($ref);
|
|
703
|
+
if (in_array($entry->status, ['live', 'pending'], true)) {
|
|
704
|
+
if ('live' === $entry->status) {
|
|
705
|
+
$this->held($entry);
|
|
706
|
+
$this->cascade($entry, new Bag());
|
|
707
|
+
try {
|
|
708
|
+
$this->run($entry, 'deactivate', 'deactivate');
|
|
709
|
+
} catch (\Throwable $e) {
|
|
710
|
+
// §5.2: ANY failure during a transition lands the
|
|
711
|
+
// instance in `failed`, with the scope STILL FULLY
|
|
712
|
+
// UNWOUND - and the instance STAYS REGISTERED, because
|
|
713
|
+
// `failed` is a state an operator has to be able to
|
|
714
|
+
// see.
|
|
715
|
+
$this->unwind($entry);
|
|
716
|
+
$entry->status = 'failed';
|
|
717
|
+
throw $e;
|
|
718
|
+
}
|
|
719
|
+
$this->releasecheck($entry, $this->unwind($entry));
|
|
720
|
+
}
|
|
721
|
+
$entry->status = 'loaded';
|
|
722
|
+
}
|
|
723
|
+
if (in_array($entry->status, ['loaded', 'failed'], true)) {
|
|
724
|
+
try {
|
|
725
|
+
$this->run($entry, 'close', 'close');
|
|
726
|
+
} finally {
|
|
727
|
+
unset($this->inst[$entry->ref]);
|
|
728
|
+
}
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
unset($this->inst[$entry->ref]);
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
/** Runs the whole forward path in one call (§5.1). */
|
|
735
|
+
public function ready($ref): Entry
|
|
736
|
+
{
|
|
737
|
+
$this->guard();
|
|
738
|
+
$r = canon_ref($ref);
|
|
739
|
+
if (!array_key_exists($r, $this->inst)) {
|
|
740
|
+
$this->declare($r);
|
|
741
|
+
}
|
|
742
|
+
if ('declared' === $this->inst[$r]->status) {
|
|
743
|
+
$this->load($r);
|
|
744
|
+
}
|
|
745
|
+
return $this->activate($r);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
/**
|
|
749
|
+
* Bindings go live only when activation succeeds (§8.1), so the
|
|
750
|
+
* teardown is the exact inverse: reverse order, always. Returns the
|
|
751
|
+
* errors the scope raised. §8.3: "A failing release does not stop the
|
|
752
|
+
* rest. Every entry runs, in reverse order, whatever any of them does;
|
|
753
|
+
* the errors are collected and raised as one `plugin_release_failed`."
|
|
754
|
+
*
|
|
755
|
+
* A selection belongs to ONE activation (§11.4). Leaving `live` by any
|
|
756
|
+
* door drops it, so the next activation ranks afresh - keeping it
|
|
757
|
+
* would make a consumer prefer a provider it never actually ran
|
|
758
|
+
* against.
|
|
759
|
+
*
|
|
760
|
+
* @return array<int,\Throwable>
|
|
761
|
+
*/
|
|
762
|
+
private function unwind(Entry $entry): array
|
|
763
|
+
{
|
|
764
|
+
$entry->selected = [];
|
|
765
|
+
$errors = [];
|
|
766
|
+
foreach (array_reverse($entry->scope) as $fn) {
|
|
767
|
+
try {
|
|
768
|
+
$fn();
|
|
769
|
+
} catch (\Throwable $e) {
|
|
770
|
+
$errors[] = $e;
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
$entry->scope = [];
|
|
774
|
+
return $errors;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/**
|
|
778
|
+
* §8.3: "A failed release ends the instance in `failed`, exactly as a
|
|
779
|
+
* failed callback does (5.2) - a release that raised may have leaked,
|
|
780
|
+
* and an instance that may be holding resources it cannot account for
|
|
781
|
+
* must not be reactivated."
|
|
782
|
+
*
|
|
783
|
+
* @param array<int,\Throwable> $errors
|
|
784
|
+
*/
|
|
785
|
+
private function releasecheck(Entry $entry, array $errors): void
|
|
786
|
+
{
|
|
787
|
+
if (empty($errors)) {
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
$entry->status = 'failed';
|
|
792
|
+
$causes = [];
|
|
793
|
+
foreach ($errors as $e) {
|
|
794
|
+
$causes[] = $e->getMessage();
|
|
795
|
+
}
|
|
796
|
+
fail_with('plugin_release_failed',
|
|
797
|
+
'release failed for ' . $entry->ref . ': '
|
|
798
|
+
. implode('; ', $causes),
|
|
799
|
+
['ref' => $entry->ref, 'cause' => $causes]);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/**
|
|
803
|
+
* A REQUIREMENT IS ON A CAPABILITY, not on a ref (§11.1). A bare
|
|
804
|
+
* string is shorthand for `{name}`. A ref satisfies too, because a
|
|
805
|
+
* host that genuinely needs a specific instance should not have to
|
|
806
|
+
* invent a capability for it.
|
|
807
|
+
*
|
|
808
|
+
* @return string[]
|
|
809
|
+
*/
|
|
810
|
+
private function unmetof(Entry $entry): array
|
|
811
|
+
{
|
|
812
|
+
$out = [];
|
|
813
|
+
foreach (requirements($entry->options) as $req) {
|
|
814
|
+
if (!gatesactivation($req)) {
|
|
815
|
+
continue;
|
|
816
|
+
}
|
|
817
|
+
if (!empty($this->providersof($req))) {
|
|
818
|
+
continue;
|
|
819
|
+
}
|
|
820
|
+
$out[] = $req['name'];
|
|
821
|
+
}
|
|
822
|
+
return $out;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/**
|
|
826
|
+
* §11.4's always-reluctant selection, and the ONE place a provider is
|
|
827
|
+
* picked for a live instance. If this instance already selected a
|
|
828
|
+
* provider for `req` and that provider is STILL a candidate, it keeps
|
|
829
|
+
* it - a better-ranked newcomer does not take it.
|
|
830
|
+
*
|
|
831
|
+
* `remember` is false for the questions asked ABOUT an instance rather
|
|
832
|
+
* than BY it: introspection must not create a binding.
|
|
833
|
+
*
|
|
834
|
+
* @param array<string,mixed> $req
|
|
835
|
+
*/
|
|
836
|
+
private function chosen(Entry $entry, array $req, bool $remember): ?string
|
|
837
|
+
{
|
|
838
|
+
$cands = $this->providersof($req);
|
|
839
|
+
if (empty($cands)) {
|
|
840
|
+
return null;
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
$held = $entry->selected[$req['name']] ?? null;
|
|
844
|
+
if (null !== $held) {
|
|
845
|
+
foreach ($cands as $c) {
|
|
846
|
+
if ($c['ref'] === $held) {
|
|
847
|
+
return $held;
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
if ($remember) {
|
|
853
|
+
$entry->selected[$req['name']] = $cands[0]['ref'];
|
|
854
|
+
}
|
|
855
|
+
return $cands[0]['ref'];
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
/** @return string[] */
|
|
859
|
+
private function boundproviders(Entry $entry): array
|
|
860
|
+
{
|
|
861
|
+
$out = [];
|
|
862
|
+
foreach (requirements($entry->options) as $req) {
|
|
863
|
+
if (!restartsonloss($req)) {
|
|
864
|
+
continue;
|
|
865
|
+
}
|
|
866
|
+
$ref = $this->chosen($entry, $req, false);
|
|
867
|
+
if (null !== $ref && !in_array($ref, $out, true)) {
|
|
868
|
+
$out[] = $ref;
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
return $out;
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
/**
|
|
875
|
+
* Live instances whose selected provider is `ref` and which would be
|
|
876
|
+
* restarted by losing it.
|
|
877
|
+
*
|
|
878
|
+
* @return string[]
|
|
879
|
+
*/
|
|
880
|
+
private function consumersof(string $ref): array
|
|
881
|
+
{
|
|
882
|
+
$out = [];
|
|
883
|
+
foreach (Util::sortedkeys($this->inst) as $r) {
|
|
884
|
+
$c = $this->inst[$r];
|
|
885
|
+
if ($r !== $ref && 'live' === $c->status
|
|
886
|
+
&& in_array($ref, $this->boundproviders($c), true)) {
|
|
887
|
+
$out[] = $r;
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
return $out;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
/**
|
|
894
|
+
* §11.3's `hold` asks a DIFFERENT question from the cascade, and
|
|
895
|
+
* reading it off `consumersof` answered the cascade's.
|
|
896
|
+
*
|
|
897
|
+
* The cascade wants the edges that RESTART - mandatory-static and
|
|
898
|
+
* optional-static - because a restart is what it performs. `hold` says
|
|
899
|
+
* "deactivating a REQUIRED instance is `plugin_dependency_held`", and
|
|
900
|
+
* required is cardinality: `gatesactivation`, not `restartsonloss`.
|
|
901
|
+
* The two sets differ in both directions and each difference was a
|
|
902
|
+
* real bug.
|
|
903
|
+
*
|
|
904
|
+
* A MANDATORY-DYNAMIC consumer was excluded, so the strictest policy
|
|
905
|
+
* let a provider go that a live consumer could not do without -
|
|
906
|
+
* `dynamic` promises survival of a SWAP, and under `hold` there is no
|
|
907
|
+
* swap, so the consumer falls back to `pending`.
|
|
908
|
+
*
|
|
909
|
+
* An OPTIONAL-STATIC consumer was included, so `hold` refused a
|
|
910
|
+
* deactivation on behalf of an instance that had said in writing it
|
|
911
|
+
* does not need the thing.
|
|
912
|
+
*
|
|
913
|
+
* @return string[]
|
|
914
|
+
*/
|
|
915
|
+
private function holdersof(string $ref): array
|
|
916
|
+
{
|
|
917
|
+
$out = [];
|
|
918
|
+
foreach (Util::sortedkeys($this->inst) as $r) {
|
|
919
|
+
$c = $this->inst[$r];
|
|
920
|
+
if ($r === $ref || 'live' !== $c->status) {
|
|
921
|
+
continue;
|
|
922
|
+
}
|
|
923
|
+
foreach (requirements($c->options) as $req) {
|
|
924
|
+
if (!gatesactivation($req)) {
|
|
925
|
+
continue;
|
|
926
|
+
}
|
|
927
|
+
if ($this->chosen($c, $req, false) === $ref) {
|
|
928
|
+
$out[] = $r;
|
|
929
|
+
break;
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
return $out;
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
/**
|
|
937
|
+
* @param array<string,mixed> $req
|
|
938
|
+
* @return array<int,array<string,mixed>>
|
|
939
|
+
*/
|
|
940
|
+
private function providersof(array $req): array
|
|
941
|
+
{
|
|
942
|
+
$cands = [];
|
|
943
|
+
$want = canon($req['name']);
|
|
944
|
+
foreach (Util::sortedkeys($this->inst) as $ref) {
|
|
945
|
+
$target = $this->inst[$ref];
|
|
946
|
+
if ('live' !== $target->status) {
|
|
947
|
+
continue;
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
// A ref satisfies directly.
|
|
951
|
+
if ($ref === $want) {
|
|
952
|
+
$cands[] = ['ref' => $ref, 'pos' => $target->pos,
|
|
953
|
+
'provides' => ['name' => $req['name']]];
|
|
954
|
+
continue;
|
|
955
|
+
}
|
|
956
|
+
foreach ($target->provides as $prov) {
|
|
957
|
+
if (($prov['name'] ?? null) === $req['name']) {
|
|
958
|
+
$cands[] = ['ref' => $ref, 'pos' => $target->pos,
|
|
959
|
+
'provides' => $prov];
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
return resolve_capability($req, $cands);
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
/**
|
|
967
|
+
* CONSUMERS GO DOWN FIRST, NOT AFTERWARDS (§11.3).
|
|
968
|
+
*
|
|
969
|
+
* The cascade is part of the provider's own deactivation and runs
|
|
970
|
+
* BEFORE the provider's `deactivate` callback and scope unwind, so a
|
|
971
|
+
* consumer's teardown can still call the thing it depends on -
|
|
972
|
+
* flushing a buffer to the store it is about to lose is exactly what a
|
|
973
|
+
* `deactivate` callback is for, and a cascade that fired after the
|
|
974
|
+
* provider was already gone would make that impossible.
|
|
975
|
+
*
|
|
976
|
+
* `$seen` is a `Bag` and not an array because the recursion has to
|
|
977
|
+
* share ONE set of visited refs, and a PHP array passed down would be
|
|
978
|
+
* a copy per frame.
|
|
979
|
+
*/
|
|
980
|
+
private function cascade(Entry $provider, Bag $seen): void
|
|
981
|
+
{
|
|
982
|
+
if ($seen[$provider->ref] ?? false) {
|
|
983
|
+
return;
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
$seen[$provider->ref] = true;
|
|
987
|
+
|
|
988
|
+
foreach ($this->consumersof($provider->ref) as $r) {
|
|
989
|
+
$consumer = $this->inst[$r];
|
|
990
|
+
if ('live' !== $consumer->status) {
|
|
991
|
+
continue;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
$this->cascade($consumer, $seen); // deepest-first
|
|
995
|
+
$bad = false;
|
|
996
|
+
try {
|
|
997
|
+
$this->run($consumer, 'deactivate', 'deactivate');
|
|
998
|
+
} catch (\Throwable $e) {
|
|
999
|
+
$bad = true;
|
|
1000
|
+
}
|
|
1001
|
+
$errors = $this->unwind($consumer);
|
|
1002
|
+
if ($bad || !empty($errors)) {
|
|
1003
|
+
// §5.2: ANY failure during a transition lands the instance
|
|
1004
|
+
// in `failed`. Marking it `pending` handed it straight
|
|
1005
|
+
// back to `reconcile`, which would activate it again the
|
|
1006
|
+
// moment the provider returned.
|
|
1007
|
+
$consumer->status = 'failed';
|
|
1008
|
+
continue;
|
|
1009
|
+
}
|
|
1010
|
+
$consumer->status = 'pending';
|
|
1011
|
+
$consumer->unmet = $this->unmetof($consumer);
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
/**
|
|
1016
|
+
* The hold check is A GUARD ON AD-HOC DEACTIVATION, NOT ON COORDINATED
|
|
1017
|
+
* TEARDOWN. In a bulk operation that is removing the holders too -
|
|
1018
|
+
* `close`, or an `apply` plan whose own steps deactivate them - it is
|
|
1019
|
+
* suspended for exactly those holders, and the teardown still runs
|
|
1020
|
+
* consumers before providers.
|
|
1021
|
+
*/
|
|
1022
|
+
private function held(Entry $entry): void
|
|
1023
|
+
{
|
|
1024
|
+
if ('hold' !== $this->dependency) {
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
1027
|
+
if ($this->coordinated) {
|
|
1028
|
+
return;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
$holders = $this->holdersof($entry->ref);
|
|
1032
|
+
if (empty($holders)) {
|
|
1033
|
+
return;
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
fail_with('plugin_dependency_held',
|
|
1037
|
+
'instance is required by live consumers: ' . $entry->ref,
|
|
1038
|
+
['ref' => $entry->ref, 'holders' => $holders]);
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
/**
|
|
1042
|
+
* EAGER reconciliation: run to a fixed point rather than scheduling.
|
|
1043
|
+
*
|
|
1044
|
+
* Two directions, and both are the reason `pending` exists. Activation
|
|
1045
|
+
* is a STANDING REQUEST, not a one-shot event.
|
|
1046
|
+
*/
|
|
1047
|
+
private function reconcile(): void
|
|
1048
|
+
{
|
|
1049
|
+
$moved = true;
|
|
1050
|
+
$rounds = 0;
|
|
1051
|
+
while ($moved) {
|
|
1052
|
+
$moved = false;
|
|
1053
|
+
$rounds++;
|
|
1054
|
+
if ($rounds > 1000) {
|
|
1055
|
+
break;
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
// Losses first, so a cascade settles in one pass rather than
|
|
1059
|
+
// alternating with re-activations.
|
|
1060
|
+
foreach (Util::sortedkeys($this->inst) as $r) {
|
|
1061
|
+
$entry = $this->inst[$r];
|
|
1062
|
+
if ('live' !== $entry->status) {
|
|
1063
|
+
continue;
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
$lost = [];
|
|
1067
|
+
foreach (requirements($entry->options) as $q) {
|
|
1068
|
+
if (!gatesactivation($q)) {
|
|
1069
|
+
continue;
|
|
1070
|
+
}
|
|
1071
|
+
if (empty($this->providersof($q))) {
|
|
1072
|
+
$lost[] = $q;
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
if (empty($lost)) {
|
|
1076
|
+
continue;
|
|
1077
|
+
}
|
|
1078
|
+
// POLICY IS PER REQUIREMENT, not per instance (§11.3). A
|
|
1079
|
+
// `dynamic` requirement whose provider is gone leaves the
|
|
1080
|
+
// consumer LIVE and notified.
|
|
1081
|
+
$restarts = false;
|
|
1082
|
+
foreach ($lost as $q) {
|
|
1083
|
+
if (restartsonloss($q)) {
|
|
1084
|
+
$restarts = true;
|
|
1085
|
+
break;
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
if (!$restarts) {
|
|
1089
|
+
continue;
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1092
|
+
$bad = false;
|
|
1093
|
+
try {
|
|
1094
|
+
$this->run($entry, 'deactivate', 'deactivate');
|
|
1095
|
+
} catch (\Throwable $e) {
|
|
1096
|
+
$bad = true;
|
|
1097
|
+
}
|
|
1098
|
+
$errors = $this->unwind($entry);
|
|
1099
|
+
if ($bad || !empty($errors)) {
|
|
1100
|
+
$entry->status = 'failed';
|
|
1101
|
+
$moved = true;
|
|
1102
|
+
continue;
|
|
1103
|
+
}
|
|
1104
|
+
$entry->status = 'pending';
|
|
1105
|
+
$entry->unmet = $this->unmetof($entry);
|
|
1106
|
+
$moved = true;
|
|
1107
|
+
}
|
|
1108
|
+
|
|
1109
|
+
foreach (Util::sortedkeys($this->inst) as $r) {
|
|
1110
|
+
$entry = $this->inst[$r];
|
|
1111
|
+
if ('pending' !== $entry->status) {
|
|
1112
|
+
continue;
|
|
1113
|
+
}
|
|
1114
|
+
if (!empty($this->unmetof($entry))) {
|
|
1115
|
+
continue;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
try {
|
|
1119
|
+
$this->run($entry, 'activate', 'activate');
|
|
1120
|
+
$entry->status = 'live';
|
|
1121
|
+
$entry->unmet = [];
|
|
1122
|
+
$moved = true;
|
|
1123
|
+
} catch (\Throwable $e) {
|
|
1124
|
+
$this->unwind($entry);
|
|
1125
|
+
$entry->status = 'failed';
|
|
1126
|
+
$moved = true;
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
// --- ordering ---------------------------------------------------
|
|
1133
|
+
|
|
1134
|
+
/** @return string[] */
|
|
1135
|
+
public function order(?string $point = null): array
|
|
1136
|
+
{
|
|
1137
|
+
// Sorted by declaration SEQUENCE, which is what makes the §7
|
|
1138
|
+
// sort's fall-through deterministic in a language whose maps have
|
|
1139
|
+
// no insertion order. §7 breaks ties by `pos`; two instances CAN
|
|
1140
|
+
// share one - `declare` defaults `pos` to the registry size, so an
|
|
1141
|
+
// unload followed by a fresh declare reuses a surviving instance's
|
|
1142
|
+
// - and past that this was falling through to hash order. `seq` is
|
|
1143
|
+
// that order, made explicit.
|
|
1144
|
+
$live = [];
|
|
1145
|
+
foreach ($this->inst as $r => $entry) {
|
|
1146
|
+
if ('live' === $entry->status) {
|
|
1147
|
+
$live[] = $entry;
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
$live = Util::stable_sort_by($live, static function (Entry $e) {
|
|
1151
|
+
return [$e->seq];
|
|
1152
|
+
});
|
|
1153
|
+
$bindings = [];
|
|
1154
|
+
foreach ($live as $entry) {
|
|
1155
|
+
$bindings[] = ['ref' => $entry->ref, 'pos' => $entry->pos,
|
|
1156
|
+
'order' => $entry->order];
|
|
1157
|
+
}
|
|
1158
|
+
$spec = null === $point ? null : ($this->points[$point] ?? null);
|
|
1159
|
+
$pin = is_array($spec) ? ($spec['pin'] ?? null) : null;
|
|
1160
|
+
return resolve_order($bindings, $pin);
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
// --- points -----------------------------------------------------
|
|
1164
|
+
|
|
1165
|
+
/**
|
|
1166
|
+
* Live bindings on a point, in resolved order. Recomputed on any
|
|
1167
|
+
* change to the live set (§7) rather than cached at startup - the bug
|
|
1168
|
+
* a host discovers only when something deactivates in production.
|
|
1169
|
+
*
|
|
1170
|
+
* @return array<int,array<string,mixed>>
|
|
1171
|
+
*/
|
|
1172
|
+
private function bound(string $point): array
|
|
1173
|
+
{
|
|
1174
|
+
$out = [];
|
|
1175
|
+
foreach ($this->order($point) as $ref) {
|
|
1176
|
+
$entry = $this->inst[$ref];
|
|
1177
|
+
// The band is the INSTANCE's ordering block (§7), stamped by
|
|
1178
|
+
// the host. A plugin passing its own would be ranking itself
|
|
1179
|
+
// above the order its document declared.
|
|
1180
|
+
$block = is_array($entry->order) ? $entry->order : [];
|
|
1181
|
+
$band = is_int($block['band'] ?? null) ? $block['band'] : 0;
|
|
1182
|
+
foreach ($entry->bindings as $b) {
|
|
1183
|
+
if ($b['point'] === $point) {
|
|
1184
|
+
$b['band'] = $band;
|
|
1185
|
+
$out[] = $b;
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
return $out;
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
/**
|
|
1193
|
+
* @return array<string,mixed>
|
|
1194
|
+
*/
|
|
1195
|
+
private function pointspec(string $point, string $want): array
|
|
1196
|
+
{
|
|
1197
|
+
$spec = $this->points[$point] ?? null;
|
|
1198
|
+
if (null === $spec) {
|
|
1199
|
+
fail_with('plugin_point_unknown', 'no such point: ' . $point,
|
|
1200
|
+
['point' => $point]);
|
|
1201
|
+
}
|
|
1202
|
+
$kind = $spec['kind'] ?? null;
|
|
1203
|
+
if ('hook' === $want) {
|
|
1204
|
+
// A point with no declared kind is a hook, which is what makes
|
|
1205
|
+
// `{}` the minimal point declaration.
|
|
1206
|
+
if (null !== $kind && 'hook' !== $kind) {
|
|
1207
|
+
fail_with('plugin_point_kind', 'point is not a hook: ' . $point,
|
|
1208
|
+
['point' => $point, 'kind' => $kind]);
|
|
1209
|
+
}
|
|
1210
|
+
return $spec;
|
|
1211
|
+
}
|
|
1212
|
+
if ($kind !== $want) {
|
|
1213
|
+
fail_with('plugin_point_kind', 'point is not a ' . $want . ': ' . $point,
|
|
1214
|
+
['point' => $point, 'kind' => $kind]);
|
|
1215
|
+
}
|
|
1216
|
+
return $spec;
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
/**
|
|
1220
|
+
* @param mixed $arg
|
|
1221
|
+
* @return mixed
|
|
1222
|
+
*/
|
|
1223
|
+
public function emit(string $point, $arg = null)
|
|
1224
|
+
{
|
|
1225
|
+
$spec = $this->pointspec($point, 'hook');
|
|
1226
|
+
return point_emit($this->bound($point), $spec['mode'] ?? 'emit', $arg);
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
/** @return mixed */
|
|
1230
|
+
public function call(string $point, ...$args)
|
|
1231
|
+
{
|
|
1232
|
+
$spec = $this->pointspec($point, 'chain');
|
|
1233
|
+
$base = $spec['base'] ?? static function (...$a) {
|
|
1234
|
+
return $a[0] ?? null;
|
|
1235
|
+
};
|
|
1236
|
+
$fn = compose($this->bound($point), $base);
|
|
1237
|
+
return $fn(...$args);
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
/** @return mixed */
|
|
1241
|
+
public function provider(string $point, ...$args)
|
|
1242
|
+
{
|
|
1243
|
+
$spec = $this->pointspec($point, 'provider');
|
|
1244
|
+
$pick = point_provider($this->bound($point), $spec);
|
|
1245
|
+
if (null === $pick['winner']) {
|
|
1246
|
+
return $spec['default'] ?? null;
|
|
1247
|
+
}
|
|
1248
|
+
return ($pick['winner']['fn'])(...$args);
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
/**
|
|
1252
|
+
* The losers are VISIBLE rather than silently ignored (§6.3).
|
|
1253
|
+
*
|
|
1254
|
+
* @return string[]
|
|
1255
|
+
*/
|
|
1256
|
+
public function shadowed(string $point): array
|
|
1257
|
+
{
|
|
1258
|
+
$spec = $this->points[$point] ?? null;
|
|
1259
|
+
if (null === $spec) {
|
|
1260
|
+
return [];
|
|
1261
|
+
}
|
|
1262
|
+
return point_provider($this->bound($point), $spec)['shadowed'];
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
/** @return mixed */
|
|
1266
|
+
public function exports(string $spec)
|
|
1267
|
+
{
|
|
1268
|
+
$all = [];
|
|
1269
|
+
foreach (Util::sortedkeys($this->inst) as $ref) {
|
|
1270
|
+
$entry = $this->inst[$ref];
|
|
1271
|
+
// Exports of a `loaded` (not live) instance are VISIBLE (§11).
|
|
1272
|
+
if (in_array($entry->status, ['declared', 'failed'], true)) {
|
|
1273
|
+
continue;
|
|
1274
|
+
}
|
|
1275
|
+
foreach (Util::sortedkeys($entry->exports) as $k) {
|
|
1276
|
+
$all[] = ['ref' => $ref, 'key' => $k,
|
|
1277
|
+
'value' => $entry->exports[$k]];
|
|
1278
|
+
}
|
|
1279
|
+
}
|
|
1280
|
+
return resolve_export($spec, $all);
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
/**
|
|
1284
|
+
* The live providers of a capability, best-first (§11.1).
|
|
1285
|
+
*
|
|
1286
|
+
* @return string[]
|
|
1287
|
+
*/
|
|
1288
|
+
public function capability(string $name): array
|
|
1289
|
+
{
|
|
1290
|
+
$cands = [];
|
|
1291
|
+
foreach (Util::sortedkeys($this->inst) as $ref) {
|
|
1292
|
+
$entry = $this->inst[$ref];
|
|
1293
|
+
if ('live' !== $entry->status) {
|
|
1294
|
+
continue;
|
|
1295
|
+
}
|
|
1296
|
+
foreach ($entry->provides as $prov) {
|
|
1297
|
+
if (($prov['name'] ?? null) === $name) {
|
|
1298
|
+
$cands[] = ['ref' => $ref, 'pos' => $entry->pos,
|
|
1299
|
+
'provides' => $prov];
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
$out = [];
|
|
1304
|
+
foreach (resolve_capability(['name' => $name], $cands) as $c) {
|
|
1305
|
+
$out[] = $c['ref'];
|
|
1306
|
+
}
|
|
1307
|
+
return $out;
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
// --- documents --------------------------------------------------
|
|
1311
|
+
|
|
1312
|
+
/**
|
|
1313
|
+
* §9.6: "load what is missing, UNLOAD WHAT IS GONE, patch what
|
|
1314
|
+
* changed, and move activation state to match", with the stated
|
|
1315
|
+
* ordering - "deactivations and unloads first (reverse load order),
|
|
1316
|
+
* then loads, then activations in load order".
|
|
1317
|
+
*
|
|
1318
|
+
* FOUR PHASES, NOT ONE INTERLEAVED LOOP. An earlier draft walked the
|
|
1319
|
+
* document once, which never looked at instances the new document had
|
|
1320
|
+
* DROPPED - so an integration removed from a config reload stayed live
|
|
1321
|
+
* with its bindings and resources.
|
|
1322
|
+
*
|
|
1323
|
+
* @param array<string,mixed>|null $doc
|
|
1324
|
+
*/
|
|
1325
|
+
public function apply(?array $doc, ?string $profile = null): void
|
|
1326
|
+
{
|
|
1327
|
+
$this->guard();
|
|
1328
|
+
$profile = $profile ?? ($this->opts['profile'] ?? null);
|
|
1329
|
+
$norm = normalize_config(['doc' => $doc, 'profile' => $profile,
|
|
1330
|
+
'keys' => $this->opts['keys'] ?? null,
|
|
1331
|
+
'reserved' => $this->reserved]);
|
|
1332
|
+
|
|
1333
|
+
$want = $norm['order'];
|
|
1334
|
+
$defaults = $this->opts['defaults'] ?? [];
|
|
1335
|
+
$optionsof = [];
|
|
1336
|
+
foreach ($want as $ref) {
|
|
1337
|
+
$optionsof[$ref] = resolve_options(
|
|
1338
|
+
['ref' => $ref, 'doc' => $doc, 'profile' => $profile,
|
|
1339
|
+
'shape' => $this->shapeof($ref),
|
|
1340
|
+
'hostdefaults' => $defaults[refname($ref)] ?? null]
|
|
1341
|
+
);
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
// Should this ref be LIVE after the apply? False for a ref the
|
|
1345
|
+
// document declares lazy or inactive AND for one it does not name
|
|
1346
|
+
// at all - which is what makes "unload what is gone" and "unload
|
|
1347
|
+
// what was toggled off" one rule rather than two.
|
|
1348
|
+
$wantlive = static function (string $ref) use ($norm): bool {
|
|
1349
|
+
$ent = $norm['instance'][$ref] ?? null;
|
|
1350
|
+
return null !== $ent && Util::truthy($ent['active'])
|
|
1351
|
+
&& 'eager' === $ent['start'];
|
|
1352
|
+
};
|
|
1353
|
+
|
|
1354
|
+
// --- phase 1: deactivations and unloads, REVERSE load order ----
|
|
1355
|
+
$drop = [];
|
|
1356
|
+
foreach (array_keys($this->inst) as $r) {
|
|
1357
|
+
if ('declared' === $this->inst[$r]->status || $wantlive($r)) {
|
|
1358
|
+
continue;
|
|
1359
|
+
}
|
|
1360
|
+
$drop[] = $r;
|
|
1361
|
+
}
|
|
1362
|
+
// Highest `pos` first, ref-descending for a tie, so a consumer
|
|
1363
|
+
// declared after its provider goes down first. (Ruby spells the
|
|
1364
|
+
// tie as a sort-then-reverse-each-run; this is the comparator that
|
|
1365
|
+
// spelling adds up to.)
|
|
1366
|
+
$inst = $this->inst;
|
|
1367
|
+
usort($drop, static function ($a, $b) use ($inst) {
|
|
1368
|
+
if ($inst[$a]->pos !== $inst[$b]->pos) {
|
|
1369
|
+
return $inst[$b]->pos <=> $inst[$a]->pos;
|
|
1370
|
+
}
|
|
1371
|
+
return strcmp($b, $a);
|
|
1372
|
+
});
|
|
1373
|
+
foreach ($drop as $ref) {
|
|
1374
|
+
$this->unload($ref);
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
// --- phase 2: declare and patch EVERYTHING, in load order ------
|
|
1378
|
+
foreach ($want as $ref) {
|
|
1379
|
+
$ent = $norm['instance'][$ref];
|
|
1380
|
+
$this->declare($ref, ['options' => $optionsof[$ref],
|
|
1381
|
+
'order' => $ent['order'] ?? null,
|
|
1382
|
+
'pos' => $ent['pos']]);
|
|
1383
|
+
// The bar is REASSERTED ON EVERY APPLY, in both directions - a
|
|
1384
|
+
// document that turns the instance back on clears it, which is
|
|
1385
|
+
// the whole point of a config switch.
|
|
1386
|
+
$this->inst[$ref]->barred = !Util::truthy($ent['active']);
|
|
1387
|
+
// REPLACE rather than refill. Ruby empties the options hash in
|
|
1388
|
+
// place because a definition's callbacks close over the map
|
|
1389
|
+
// they were handed at `define`; PHP's arrays are values, so no
|
|
1390
|
+
// callback can be holding this one - `Inst::options()` reads it
|
|
1391
|
+
// back through the entry every time, which is the same
|
|
1392
|
+
// observable behaviour by a shorter road.
|
|
1393
|
+
$this->refill($this->inst[$ref], $optionsof[$ref]);
|
|
1394
|
+
$this->inst[$ref]->order = $ent['order'] ?? null;
|
|
1395
|
+
$this->inst[$ref]->pos = $ent['pos'];
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
// --- phase 3: loads, in load order -----------------------------
|
|
1399
|
+
// ONLY THE EAGER, ACTIVE ONES: "a document of twenty lazy
|
|
1400
|
+
// instances is twenty map entries and no executed code" (§9.6).
|
|
1401
|
+
foreach ($want as $ref) {
|
|
1402
|
+
if ($wantlive($ref)) {
|
|
1403
|
+
$this->load($ref);
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
// --- phase 4: activations, in load order -----------------------
|
|
1408
|
+
foreach ($want as $ref) {
|
|
1409
|
+
if ($wantlive($ref)) {
|
|
1410
|
+
$this->activate($ref);
|
|
1411
|
+
}
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
/** @return array<string,mixed>|null */
|
|
1416
|
+
private function shapeof(string $ref): ?array
|
|
1417
|
+
{
|
|
1418
|
+
$definition = $this->catalog->get(refname($ref));
|
|
1419
|
+
return null === $definition ? null : ($definition['shape'] ?? null);
|
|
1420
|
+
}
|
|
1421
|
+
|
|
1422
|
+
/**
|
|
1423
|
+
* @param array<string,mixed>|null $patch
|
|
1424
|
+
*/
|
|
1425
|
+
public function options($ref, ?array $patch): void
|
|
1426
|
+
{
|
|
1427
|
+
$this->guard();
|
|
1428
|
+
$entry = $this->need($ref);
|
|
1429
|
+
$previous = $entry->options;
|
|
1430
|
+
$merged = $previous;
|
|
1431
|
+
foreach ($patch ?? [] as $k => $v) {
|
|
1432
|
+
$merged[$k] = $v;
|
|
1433
|
+
}
|
|
1434
|
+
$this->refill($entry, resolve_options(
|
|
1435
|
+
['ref' => $entry->ref, 'shape' => $this->shapeof($entry->ref),
|
|
1436
|
+
'doc' => [], 'patch' => $merged]
|
|
1437
|
+
));
|
|
1438
|
+
if ('live' !== $entry->status) {
|
|
1439
|
+
return;
|
|
1440
|
+
}
|
|
1441
|
+
|
|
1442
|
+
$reconfigure = $entry->def['reconfigure'] ?? null;
|
|
1443
|
+
if (is_callable($reconfigure)) {
|
|
1444
|
+
$this->transitioning = true;
|
|
1445
|
+
try {
|
|
1446
|
+
$reconfigure(new Inst($this, $entry), $entry->options, $previous);
|
|
1447
|
+
} finally {
|
|
1448
|
+
$this->transitioning = false;
|
|
1449
|
+
}
|
|
1450
|
+
} else {
|
|
1451
|
+
// Always correct and sometimes expensive; `reconfigure` exists
|
|
1452
|
+
// to make the common case cheap (§9.4).
|
|
1453
|
+
$this->deactivate($entry->ref);
|
|
1454
|
+
$this->activate($entry->ref);
|
|
1455
|
+
}
|
|
1456
|
+
}
|
|
1457
|
+
|
|
1458
|
+
/**
|
|
1459
|
+
* @param array<string,mixed>|null $source
|
|
1460
|
+
*/
|
|
1461
|
+
private function refill(Entry $entry, ?array $source): void
|
|
1462
|
+
{
|
|
1463
|
+
$entry->options = $source ?? [];
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
public function close(): void
|
|
1467
|
+
{
|
|
1468
|
+
// A bulk teardown removing the holders too, so `hold` is suspended
|
|
1469
|
+
// for exactly those holders (§11.3) - while the consumers-first
|
|
1470
|
+
// cascade still runs, which is the half that matters.
|
|
1471
|
+
$this->coordinated = true;
|
|
1472
|
+
try {
|
|
1473
|
+
foreach (array_reverse(Util::sortedkeys($this->inst)) as $r) {
|
|
1474
|
+
$this->unload($r);
|
|
1475
|
+
}
|
|
1476
|
+
} finally {
|
|
1477
|
+
$this->coordinated = false;
|
|
1478
|
+
}
|
|
1479
|
+
}
|
|
1480
|
+
|
|
1481
|
+
/**
|
|
1482
|
+
* The same record §6.6 gives a plugin about itself, reachable from
|
|
1483
|
+
* outside for the corpus.
|
|
1484
|
+
*
|
|
1485
|
+
* @return array<string,mixed>
|
|
1486
|
+
*/
|
|
1487
|
+
public function positionof($ref, ?string $point): array
|
|
1488
|
+
{
|
|
1489
|
+
$entry = $this->inst[canon($ref)] ?? null;
|
|
1490
|
+
if (null === $entry) {
|
|
1491
|
+
fail_with('plugin_not_loaded', 'no such instance: ' . $ref,
|
|
1492
|
+
['ref' => $ref]);
|
|
1493
|
+
}
|
|
1494
|
+
$ranked = $this->order($point);
|
|
1495
|
+
$index = array_search($entry->ref, $ranked, true);
|
|
1496
|
+
$index = false === $index ? -1 : (int)$index;
|
|
1497
|
+
return ['index' => $index, 'count' => count($ranked),
|
|
1498
|
+
// §6.2 composes b1(b2(b3(base))) with the FIRST binding
|
|
1499
|
+
// OUTERMOST, so these are not index 0 and index count-1
|
|
1500
|
+
// the other way round.
|
|
1501
|
+
'outermost' => 0 === $index,
|
|
1502
|
+
'innermost' => $index === count($ranked) - 1];
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
public function define(array $definition): void
|
|
1506
|
+
{
|
|
1507
|
+
$this->catalog->add($definition);
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1511
|
+
function make_host(?array $options = null): Host
|
|
1512
|
+
{
|
|
1513
|
+
return new Host($options);
|
|
1514
|
+
}
|