@voxgig/sdkgen-langpack 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.sdk/model/target/dart.aon +63 -0
- package/.sdk/model/target/haskell.aon +72 -0
- package/.sdk/model/target/lean.aon +91 -0
- package/.sdk/src/cmp/dart/Config_dart.ts +248 -0
- package/.sdk/src/cmp/dart/EntityBase_dart.ts +34 -0
- package/.sdk/src/cmp/dart/EntityOperation_dart.ts +43 -0
- package/.sdk/src/cmp/dart/EntityTypes_dart.ts +207 -0
- package/.sdk/src/cmp/dart/Entity_dart.ts +87 -0
- package/.sdk/src/cmp/dart/Gitignore_dart.ts +34 -0
- package/.sdk/src/cmp/dart/MainEntity_dart.ts +33 -0
- package/.sdk/src/cmp/dart/Main_dart.ts +178 -0
- package/.sdk/src/cmp/dart/Package_dart.ts +82 -0
- package/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +177 -0
- package/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +238 -0
- package/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +53 -0
- package/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +152 -0
- package/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +59 -0
- package/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +65 -0
- package/.sdk/src/cmp/dart/ReadmeModel_dart.ts +151 -0
- package/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +63 -0
- package/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +225 -0
- package/.sdk/src/cmp/dart/ReadmeRef_dart.ts +397 -0
- package/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +24 -0
- package/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +106 -0
- package/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +78 -0
- package/.sdk/src/cmp/dart/SdkError_dart.ts +42 -0
- package/.sdk/src/cmp/dart/TestDirect_dart.ts +516 -0
- package/.sdk/src/cmp/dart/TestEntity_dart.ts +628 -0
- package/.sdk/src/cmp/dart/Test_dart.ts +138 -0
- package/.sdk/src/cmp/dart/fragment/Config.data.fragment.dart +98 -0
- package/.sdk/src/cmp/dart/fragment/Config.fragment.dart +70 -0
- package/.sdk/src/cmp/dart/fragment/Direct.test.fragment.dart +25 -0
- package/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +29 -0
- package/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +28 -0
- package/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +302 -0
- package/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +98 -0
- package/.sdk/src/cmp/dart/fragment/EntityListOp.fragment.dart +90 -0
- package/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +102 -0
- package/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +108 -0
- package/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +102 -0
- package/.sdk/src/cmp/dart/fragment/Main.fragment.dart +339 -0
- package/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +26 -0
- package/.sdk/src/cmp/dart/tsconfig.json +15 -0
- package/.sdk/src/cmp/dart/utility_dart.ts +155 -0
- package/.sdk/src/cmp/haskell/Config_haskell.ts +98 -0
- package/.sdk/src/cmp/haskell/Entity_haskell.ts +13 -0
- package/.sdk/src/cmp/haskell/Gitignore_haskell.ts +27 -0
- package/.sdk/src/cmp/haskell/Main_haskell.ts +123 -0
- package/.sdk/src/cmp/haskell/Package_haskell.ts +60 -0
- package/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +186 -0
- package/.sdk/src/cmp/haskell/ReadmeExamplesTest_haskell.ts +135 -0
- package/.sdk/src/cmp/haskell/ReadmeExplanation_haskell.ts +48 -0
- package/.sdk/src/cmp/haskell/ReadmeHowto_haskell.ts +168 -0
- package/.sdk/src/cmp/haskell/ReadmeInstall_haskell.ts +51 -0
- package/.sdk/src/cmp/haskell/ReadmeIntro_haskell.ts +67 -0
- package/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +162 -0
- package/.sdk/src/cmp/haskell/ReadmeOptions_haskell.ts +74 -0
- package/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +241 -0
- package/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +408 -0
- package/.sdk/src/cmp/haskell/ReadmeTopHowto_haskell.ts +31 -0
- package/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +104 -0
- package/.sdk/src/cmp/haskell/ReadmeTopTest_haskell.ts +80 -0
- package/.sdk/src/cmp/haskell/Test_haskell.ts +297 -0
- package/.sdk/src/cmp/haskell/tsconfig.json +15 -0
- package/.sdk/src/cmp/haskell/utility_haskell.ts +166 -0
- package/.sdk/src/cmp/lean/Config_lean.ts +93 -0
- package/.sdk/src/cmp/lean/Entity_lean.ts +9 -0
- package/.sdk/src/cmp/lean/Gitignore_lean.ts +18 -0
- package/.sdk/src/cmp/lean/Main_lean.ts +120 -0
- package/.sdk/src/cmp/lean/Package_lean.ts +93 -0
- package/.sdk/src/cmp/lean/ReadmeEntity_lean.ts +29 -0
- package/.sdk/src/cmp/lean/ReadmeExplanation_lean.ts +19 -0
- package/.sdk/src/cmp/lean/ReadmeHowto_lean.ts +25 -0
- package/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +39 -0
- package/.sdk/src/cmp/lean/ReadmeIntro_lean.ts +25 -0
- package/.sdk/src/cmp/lean/ReadmeModel_lean.ts +24 -0
- package/.sdk/src/cmp/lean/ReadmeOptions_lean.ts +22 -0
- package/.sdk/src/cmp/lean/ReadmeQuick_lean.ts +50 -0
- package/.sdk/src/cmp/lean/ReadmeRef_lean.ts +40 -0
- package/.sdk/src/cmp/lean/ReadmeTopHowto_lean.ts +16 -0
- package/.sdk/src/cmp/lean/ReadmeTopQuick_lean.ts +23 -0
- package/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +19 -0
- package/.sdk/src/cmp/lean/Test_lean.ts +261 -0
- package/.sdk/src/cmp/lean/utility_lean.ts +129 -0
- package/.sdk/tm/dart/LICENSE +22 -0
- package/.sdk/tm/dart/Makefile +50 -0
- package/.sdk/tm/dart/lib/Context.dart +150 -0
- package/.sdk/tm/dart/lib/Control.dart +15 -0
- package/.sdk/tm/dart/lib/Operation.dart +31 -0
- package/.sdk/tm/dart/lib/Point.dart +51 -0
- package/.sdk/tm/dart/lib/Response.dart +32 -0
- package/.sdk/tm/dart/lib/Result.dart +39 -0
- package/.sdk/tm/dart/lib/Spec.dart +49 -0
- package/.sdk/tm/dart/lib/feature/audit/AuditFeature.dart +103 -0
- package/.sdk/tm/dart/lib/feature/base/BaseFeature.dart +76 -0
- package/.sdk/tm/dart/lib/feature/cache/CacheFeature.dart +152 -0
- package/.sdk/tm/dart/lib/feature/clienttrack/ClienttrackFeature.dart +104 -0
- package/.sdk/tm/dart/lib/feature/cost/CostFeature.dart +446 -0
- package/.sdk/tm/dart/lib/feature/debug/DebugFeature.dart +153 -0
- package/.sdk/tm/dart/lib/feature/idempotency/IdempotencyFeature.dart +92 -0
- package/.sdk/tm/dart/lib/feature/log/LogFeature.dart +85 -0
- package/.sdk/tm/dart/lib/feature/metrics/MetricsFeature.dart +103 -0
- package/.sdk/tm/dart/lib/feature/netsim/NetsimFeature.dart +186 -0
- package/.sdk/tm/dart/lib/feature/paging/PagingFeature.dart +240 -0
- package/.sdk/tm/dart/lib/feature/proxy/ProxyFeature.dart +118 -0
- package/.sdk/tm/dart/lib/feature/ratelimit/RatelimitFeature.dart +103 -0
- package/.sdk/tm/dart/lib/feature/rbac/RbacFeature.dart +121 -0
- package/.sdk/tm/dart/lib/feature/retry/RetryFeature.dart +155 -0
- package/.sdk/tm/dart/lib/feature/secrets/SecretsFeature.dart +649 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/capability.dart +105 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/catalog.dart +46 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/config.dart +297 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/depend.dart +198 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/env.dart +144 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/export.dart +58 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/graph.dart +160 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/host.dart +1067 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/order.dart +172 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/plugin.dart +23 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/point.dart +117 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/ref.dart +105 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/resolve.dart +58 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/types.dart +201 -0
- package/.sdk/tm/dart/lib/feature/secrets/plugin/version.dart +116 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/aws.dart +285 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/azuresecrets.dart +178 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/boru.dart +145 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/crypto.dart +194 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/doppler.dart +101 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/gcpsecrets.dart +143 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/hashicorp.dart +190 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/httpjson.dart +363 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/infisical.dart +149 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/onepassword.dart +146 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/secretspec.dart +116 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/sigv4.dart +237 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/addr.dart +138 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/json.dart +276 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/provider.dart +31 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/providers.dart +243 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/sekreto.dart +730 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/spec.dart +200 -0
- package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/support.dart +217 -0
- package/.sdk/tm/dart/lib/feature/streaming/StreamingFeature.dart +97 -0
- package/.sdk/tm/dart/lib/feature/telemetry/TelemetryFeature.dart +136 -0
- package/.sdk/tm/dart/lib/feature/test/TestFeature.dart +328 -0
- package/.sdk/tm/dart/lib/feature/timeout/TimeoutFeature.dart +104 -0
- package/.sdk/tm/dart/lib/utility/CleanUtility.dart +12 -0
- package/.sdk/tm/dart/lib/utility/DoneUtility.dart +18 -0
- package/.sdk/tm/dart/lib/utility/ErrUtility.dart +46 -0
- package/.sdk/tm/dart/lib/utility/FeatureAddUtility.dart +35 -0
- package/.sdk/tm/dart/lib/utility/FeatureHookUtility.dart +20 -0
- package/.sdk/tm/dart/lib/utility/FeatureInitUtility.dart +9 -0
- package/.sdk/tm/dart/lib/utility/FetcherUtility.dart +104 -0
- package/.sdk/tm/dart/lib/utility/GraphqlUtility.dart +162 -0
- package/.sdk/tm/dart/lib/utility/MakeContextUtility.dart +6 -0
- package/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +71 -0
- package/.sdk/tm/dart/lib/utility/MakeFetchDefUtility.dart +42 -0
- package/.sdk/tm/dart/lib/utility/MakeOptionsUtility.dart +233 -0
- package/.sdk/tm/dart/lib/utility/MakePointUtility.dart +130 -0
- package/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +66 -0
- package/.sdk/tm/dart/lib/utility/MakeResponseUtility.dart +59 -0
- package/.sdk/tm/dart/lib/utility/MakeResultUtility.dart +49 -0
- package/.sdk/tm/dart/lib/utility/MakeSpecUtility.dart +77 -0
- package/.sdk/tm/dart/lib/utility/MakeUrlUtility.dart +51 -0
- package/.sdk/tm/dart/lib/utility/ParamUtility.dart +56 -0
- package/.sdk/tm/dart/lib/utility/PrepareAuthUtility.dart +46 -0
- package/.sdk/tm/dart/lib/utility/PrepareBodyUtility.dart +19 -0
- package/.sdk/tm/dart/lib/utility/PrepareHeadersUtility.dart +11 -0
- package/.sdk/tm/dart/lib/utility/PrepareMethodUtility.dart +30 -0
- package/.sdk/tm/dart/lib/utility/PrepareParamsUtility.dart +23 -0
- package/.sdk/tm/dart/lib/utility/PreparePathUtility.dart +9 -0
- package/.sdk/tm/dart/lib/utility/PrepareQueryUtility.dart +18 -0
- package/.sdk/tm/dart/lib/utility/ResultBasicUtility.dart +29 -0
- package/.sdk/tm/dart/lib/utility/ResultBodyUtility.dart +15 -0
- package/.sdk/tm/dart/lib/utility/ResultHeadersUtility.dart +18 -0
- package/.sdk/tm/dart/lib/utility/StructUtility.dart +127 -0
- package/.sdk/tm/dart/lib/utility/TransformRequestUtility.dart +28 -0
- package/.sdk/tm/dart/lib/utility/TransformResponseUtility.dart +44 -0
- package/.sdk/tm/dart/lib/utility/Utility.dart +239 -0
- package/.sdk/tm/dart/lib/utility/voxgig_struct.dart +2462 -0
- package/.sdk/tm/dart/src/feature/README.md +3 -0
- package/.sdk/tm/dart/src/feature/audit/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/base/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/cache/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/clienttrack/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/cost/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/debug/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/idempotency/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/log/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/metrics/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/netsim/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/paging/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/proxy/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/ratelimit/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/rbac/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/retry/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/secrets/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/streaming/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/telemetry/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/test/.gitkeep +0 -0
- package/.sdk/tm/dart/src/feature/timeout/.gitkeep +0 -0
- package/.sdk/tm/dart/test/custom_test.dart +65 -0
- package/.sdk/tm/dart/test/exists_test.dart +12 -0
- package/.sdk/tm/dart/test/feature/harness.dart +347 -0
- package/.sdk/tm/dart/test/feature/secrets/secrets_test.dart +1107 -0
- package/.sdk/tm/dart/test/feature_test.dart +1193 -0
- package/.sdk/tm/dart/test/harness.dart +153 -0
- package/.sdk/tm/dart/test/netsim_test.dart +48 -0
- package/.sdk/tm/dart/test/omni.dart +520 -0
- package/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
- package/.sdk/tm/dart/test/pipeline_test.dart +608 -0
- package/.sdk/tm/dart/test/primary_test.dart +476 -0
- package/.sdk/tm/dart/test/sdk-test-control.json +19 -0
- package/.sdk/tm/dart/test/struct_test.dart +468 -0
- package/.sdk/tm/dart/test/utility.dart +198 -0
- package/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
- package/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
- package/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
- package/.sdk/tm/haskell/LICENSE +21 -0
- package/.sdk/tm/haskell/Makefile +22 -0
- package/.sdk/tm/haskell/VERSION +1 -0
- package/.sdk/tm/haskell/src/SdkFeatures.hs +1440 -0
- package/.sdk/tm/haskell/src/SdkHelpers.hs +337 -0
- package/.sdk/tm/haskell/src/SdkJson.hs +111 -0
- package/.sdk/tm/haskell/src/SdkRuntime.hs +1279 -0
- package/.sdk/tm/haskell/src/SdkTypes.hs +195 -0
- package/.sdk/tm/haskell/src/VoxgigStruct.hs +2299 -0
- package/.sdk/tm/haskell/src/Vregex.hs +237 -0
- package/.sdk/tm/haskell/src/feature/README.md +5 -0
- package/.sdk/tm/haskell/src/feature/audit/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/base/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/cache/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/clienttrack/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/debug/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/idempotency/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/log/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/metrics/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/netsim/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/paging/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/proxy/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/ratelimit/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/rbac/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/retry/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/streaming/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/telemetry/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/test/.gitkeep +0 -0
- package/.sdk/tm/haskell/src/feature/timeout/.gitkeep +0 -0
- package/.sdk/tm/haskell/test/Harness.hs +281 -0
- package/.sdk/tm/haskell/test/OmniResolver.hs +252 -0
- package/.sdk/tm/haskell/test/Runner.hs +49 -0
- package/.sdk/tm/haskell/test/StructCorpus.hs +449 -0
- package/.sdk/tm/haskell/test/TCustomUtility.hs +38 -0
- package/.sdk/tm/haskell/test/TFeature.hs +794 -0
- package/.sdk/tm/haskell/test/TNetsim.hs +50 -0
- package/.sdk/tm/haskell/test/TPipeline.hs +334 -0
- package/.sdk/tm/haskell/test/TPrimaryCorpus.hs +263 -0
- package/.sdk/tm/haskell/test/TPrimaryUtility.hs +386 -0
- package/.sdk/tm/haskell/test/Testutil.hs +59 -0
- package/.sdk/tm/haskell/test/vendor/omni/Omni.hs +1147 -0
- package/.sdk/tm/lean/LICENSE +21 -0
- package/.sdk/tm/lean/Makefile +32 -0
- package/.sdk/tm/lean/VERSION +1 -0
- package/.sdk/tm/lean/src/SdkFeature.lean +171 -0
- package/.sdk/tm/lean/src/SdkFeatures.lean +787 -0
- package/.sdk/tm/lean/src/SdkJson.lean +134 -0
- package/.sdk/tm/lean/src/SdkRuntime.lean +374 -0
- package/.sdk/tm/lean/src/SdkUtility.lean +809 -0
- package/.sdk/tm/lean/src/VoxgigStruct.lean +2880 -0
- package/.sdk/tm/lean/src/Vregex.lean +412 -0
- package/.sdk/tm/lean/src/feature/README.md +5 -0
- package/.sdk/tm/lean/src/feature/audit/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/base/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/cache/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/clienttrack/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/cost/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/debug/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/idempotency/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/log/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/metrics/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/netsim/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/paging/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/proxy/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/ratelimit/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/rbac/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/retry/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/streaming/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/telemetry/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/test/.gitkeep +0 -0
- package/.sdk/tm/lean/src/feature/timeout/.gitkeep +0 -0
- package/.sdk/tm/lean/test/OmniResolver.lean +358 -0
- package/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
- package/.sdk/tm/lean/test/StructCorpus.lean +368 -0
- package/.sdk/tm/lean/test/TFeature.lean +281 -0
- package/.sdk/tm/lean/test/TPrimaryUtility.lean +227 -0
- package/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
- package/LICENSE +21 -0
- package/README.md +104 -0
- package/package.json +78 -0
- package/sdkgen-package.json +22 -0
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
|
|
2
|
+
import {
|
|
3
|
+
Model,
|
|
4
|
+
ModelEntity,
|
|
5
|
+
ModelPoint,
|
|
6
|
+
nom,
|
|
7
|
+
depluralize,
|
|
8
|
+
} from '@voxgig/apidef'
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
Content,
|
|
13
|
+
File,
|
|
14
|
+
Folder,
|
|
15
|
+
Fragment,
|
|
16
|
+
Slot,
|
|
17
|
+
cmp,
|
|
18
|
+
snakify,
|
|
19
|
+
isAuthActive, envName, envToken,
|
|
20
|
+
serverVarEnv,
|
|
21
|
+
serverVariables,
|
|
22
|
+
pointParts,
|
|
23
|
+
} from '@voxgig/sdkgen'
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
import {
|
|
27
|
+
projectPath,
|
|
28
|
+
dartValue, dartStringLiteral} from './utility_dart'
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
const TestDirect = cmp(function TestDirect(props: any) {
|
|
32
|
+
const ctx$ = props.ctx$
|
|
33
|
+
const model: Model = ctx$.model
|
|
34
|
+
const stdrep = ctx$.stdrep
|
|
35
|
+
|
|
36
|
+
const entity: ModelEntity = props.entity
|
|
37
|
+
|
|
38
|
+
const ff = projectPath('src/cmp/dart/fragment/')
|
|
39
|
+
|
|
40
|
+
const PROJECTNAME = envName(model)
|
|
41
|
+
const entidEnvVar = `${PROJECTNAME}_TEST_${envToken(entity.name)}_ENTID`
|
|
42
|
+
|
|
43
|
+
const authActive = isAuthActive(model)
|
|
44
|
+
const apikeyEnvEntry = authActive
|
|
45
|
+
? `\n '${PROJECTNAME}_APIKEY': '',`
|
|
46
|
+
: ''
|
|
47
|
+
const apikeyLiveField = authActive
|
|
48
|
+
? `
|
|
49
|
+
'apikey': env['${PROJECTNAME}_APIKEY'],`
|
|
50
|
+
: ''
|
|
51
|
+
|
|
52
|
+
// A templated server URL (OpenAPI server variables) makes a LIVE client
|
|
53
|
+
// impossible to construct without values: makeOptions raises rather than
|
|
54
|
+
// request a URL with a literal `{account_id}` in it. So the live suite
|
|
55
|
+
// takes them from the environment the same way it takes the apikey.
|
|
56
|
+
const svars = serverVariables(model)
|
|
57
|
+
const serverEnvEntry = svars
|
|
58
|
+
.map((v: any) => `\n '${serverVarEnv(PROJECTNAME, v.name)}': ${dartStringLiteral(v.dflt)},`).join('')
|
|
59
|
+
const serverLiveField = 0 === svars.length ? '' : `
|
|
60
|
+
'server': <String, dynamic>{${svars
|
|
61
|
+
.map((v: any) => `
|
|
62
|
+
'${v.name}': env['${serverVarEnv(PROJECTNAME, v.name)}'],`).join('')}
|
|
63
|
+
},`
|
|
64
|
+
|
|
65
|
+
const opnames = Object.keys(entity.op || {})
|
|
66
|
+
const hasLoad = opnames.includes('load')
|
|
67
|
+
const hasList = opnames.includes('list')
|
|
68
|
+
|
|
69
|
+
if (!hasLoad && !hasList) {
|
|
70
|
+
return
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
Folder({ name: entity.name }, () => {
|
|
74
|
+
|
|
75
|
+
File({ name: nom(entity, 'Name') + 'Direct_test.dart' }, () => {
|
|
76
|
+
|
|
77
|
+
Fragment({
|
|
78
|
+
from: ff + 'Direct.test.fragment.dart',
|
|
79
|
+
replace: {
|
|
80
|
+
SdkName: nom(model.const, 'Name'),
|
|
81
|
+
EntityName: nom(entity, 'Name'),
|
|
82
|
+
entityname: entity.name,
|
|
83
|
+
PROJECTNAME,
|
|
84
|
+
...stdrep,
|
|
85
|
+
}
|
|
86
|
+
}, () => {
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
Slot({ name: 'directSetup' }, () => {
|
|
90
|
+
Content(`
|
|
91
|
+
Map<String, dynamic> directSetup([dynamic mockres]) {
|
|
92
|
+
final calls = <Map<String, dynamic>>[];
|
|
93
|
+
|
|
94
|
+
final env = envOverride({
|
|
95
|
+
'${entidEnvVar}': <String, dynamic>{},
|
|
96
|
+
'${PROJECTNAME}_TEST_LIVE': 'FALSE',${apikeyEnvEntry}${serverEnvEntry}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
final live = 'TRUE' == env['${PROJECTNAME}_TEST_LIVE'];
|
|
100
|
+
|
|
101
|
+
if (live) {
|
|
102
|
+
// Spread FIRST, so the generated fields below win: sdk-test-control.json's
|
|
103
|
+
// test.client.options adds to the live client, it does not redirect it.
|
|
104
|
+
final client = ${nom(model.const, 'Name')}SDK(<String, dynamic>{
|
|
105
|
+
...liveClientOptions(),${apikeyLiveField}${serverLiveField}
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
dynamic idmap = env['${entidEnvVar}'];
|
|
109
|
+
if (idmap is String && idmap.startsWith('{')) {
|
|
110
|
+
idmap = jsonDecode(idmap);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return {'client': client, 'calls': calls, 'live': live, 'idmap': idmap};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
mockFetch(dynamic url, dynamic init) async {
|
|
117
|
+
calls.add({'url': url, 'init': init});
|
|
118
|
+
return {
|
|
119
|
+
'status': 200,
|
|
120
|
+
'statusText': 'OK',
|
|
121
|
+
'headers': <String, dynamic>{},
|
|
122
|
+
'json': () => mockres ?? {'id': 'direct01'},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
final client = ${nom(model.const, 'Name')}SDK({
|
|
127
|
+
'base': 'http://localhost:8080',
|
|
128
|
+
'system': {'fetch': mockFetch},
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
'client': client,
|
|
133
|
+
'calls': calls,
|
|
134
|
+
'live': live,
|
|
135
|
+
'idmap': <String, dynamic>{},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// direct() returns the raw response body. List endpoints often wrap the
|
|
140
|
+
// array in an envelope (e.g. { data: [...] }, { entities: [...] }). The
|
|
141
|
+
// test transforms the raw body to extract the first list — either the body
|
|
142
|
+
// itself or the first list property of an envelope map.
|
|
143
|
+
dynamic unwrapListData(dynamic data) {
|
|
144
|
+
if (data is List) {
|
|
145
|
+
return data;
|
|
146
|
+
}
|
|
147
|
+
if (data is Map) {
|
|
148
|
+
for (final v in data.values) {
|
|
149
|
+
if (v is List) {
|
|
150
|
+
return v;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
`)
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
Slot({ name: 'direct' }, () => {
|
|
161
|
+
|
|
162
|
+
if (hasLoad) {
|
|
163
|
+
generateDirectLoad(model, entity)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (hasList) {
|
|
167
|
+
generateDirectList(model, entity)
|
|
168
|
+
}
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
})
|
|
172
|
+
})
|
|
173
|
+
})
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
function generateDirectLoad(model: Model, entity: ModelEntity) {
|
|
178
|
+
const loadOp = entity.op?.load
|
|
179
|
+
const loadPoint: ModelPoint | undefined = loadOp?.points?.[0]
|
|
180
|
+
|
|
181
|
+
if (null == loadPoint) {
|
|
182
|
+
return
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const allLoadParams = loadPoint.args?.params || []
|
|
186
|
+
const loadPath = normalizePathParams(pointParts(loadPoint), allLoadParams, loadPoint.rename?.param)
|
|
187
|
+
|
|
188
|
+
// Only path params that actually appear in the URL template drive the
|
|
189
|
+
// direct-test path-param setup and URL-substitution asserts.
|
|
190
|
+
const pathPlaceholders = new Set<string>()
|
|
191
|
+
for (const part of pointParts(loadPoint)) {
|
|
192
|
+
if (typeof part === 'string' && part.startsWith('{') && part.endsWith('}')) {
|
|
193
|
+
pathPlaceholders.add(part.slice(1, -1))
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const renameMap = (loadPoint.rename?.param || {}) as Record<string, string>
|
|
197
|
+
const renamedPlaceholders = new Set<string>()
|
|
198
|
+
for (const ph of pathPlaceholders) {
|
|
199
|
+
renamedPlaceholders.add(ph)
|
|
200
|
+
for (const [orig, renamed] of Object.entries(renameMap)) {
|
|
201
|
+
if (renamed === ph) renamedPlaceholders.add(orig)
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const loadParams = allLoadParams.filter((p: any) =>
|
|
205
|
+
renamedPlaceholders.has(p.name) || renamedPlaceholders.has(p.orig))
|
|
206
|
+
|
|
207
|
+
// Required query params with spec-provided examples — needed to satisfy
|
|
208
|
+
// the API contract in live mode; mock mode ignores them.
|
|
209
|
+
const loadQuery = loadPoint.args?.query || []
|
|
210
|
+
const liveQueryEntries = loadQuery
|
|
211
|
+
.filter((q: any) => q.reqd && undefined !== q.example && null !== q.example)
|
|
212
|
+
const hasLiveQuery = liveQueryEntries.length > 0
|
|
213
|
+
const liveQueryLines = liveQueryEntries
|
|
214
|
+
.map((q: any) => ` query['${q.name}'] = ${dartValue(q.example)};`)
|
|
215
|
+
.join('\n')
|
|
216
|
+
|
|
217
|
+
// Get list info for live mode bootstrapping
|
|
218
|
+
const listOp = entity.op?.list
|
|
219
|
+
const listPoint = listOp?.points?.[0]
|
|
220
|
+
const listParams = listPoint?.args?.params || []
|
|
221
|
+
const listPath = listPoint ? normalizePathParams(pointParts(listPoint), listParams, listPoint.rename?.param) : ''
|
|
222
|
+
const hasList = null != listPoint
|
|
223
|
+
|
|
224
|
+
// Ancestor params (not 'id') for live mode
|
|
225
|
+
const ancestorParams = loadParams.filter((p: any) => p.name !== 'id')
|
|
226
|
+
|
|
227
|
+
const paramAsserts = loadParams.map((p: any, i: number) =>
|
|
228
|
+
` ok(calls[0]['url'].toString().contains('direct0${i + 1}'));\n`).join('')
|
|
229
|
+
|
|
230
|
+
// Build live list params
|
|
231
|
+
const liveListParams = listParams.map((p: any) => {
|
|
232
|
+
const key = p.name === 'id'
|
|
233
|
+
? entity.name + '01'
|
|
234
|
+
: p.name.replace(/_id$/, '') + '01'
|
|
235
|
+
return { name: p.name, key }
|
|
236
|
+
})
|
|
237
|
+
|
|
238
|
+
// Build live ancestor params for load
|
|
239
|
+
const liveAncestorParams = ancestorParams.map((p: any) => {
|
|
240
|
+
const key = p.name.replace(/_id$/, '') + '01'
|
|
241
|
+
return { name: p.name, key }
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
const liveQueryPrefix = liveQueryLines ? liveQueryLines + '\n' : ''
|
|
245
|
+
|
|
246
|
+
// Path params with spec-provided examples — when present, prefer them
|
|
247
|
+
// over list-bootstrap.
|
|
248
|
+
const liveExampleParams = loadParams.filter(
|
|
249
|
+
(p: any) => undefined !== p.example && null !== p.example
|
|
250
|
+
)
|
|
251
|
+
const allLoadParamsHaveExamples =
|
|
252
|
+
loadParams.length > 0 && liveExampleParams.length === loadParams.length
|
|
253
|
+
|
|
254
|
+
// Set of idmap keys this test reads in live mode: used to skip-on-missing.
|
|
255
|
+
let liveIdKeys: string[] = []
|
|
256
|
+
|
|
257
|
+
const mockParamLines = loadParams.map((p: any, i: number) =>
|
|
258
|
+
` params['${p.name}'] = 'direct0${i + 1}';`).join('\n')
|
|
259
|
+
|
|
260
|
+
let liveParamsBlock = ''
|
|
261
|
+
if (allLoadParamsHaveExamples) {
|
|
262
|
+
const exampleLines = loadParams.map(
|
|
263
|
+
(p: any) => ` params['${p.name}'] = ${dartValue(p.example)};`
|
|
264
|
+
).join('\n')
|
|
265
|
+
liveParamsBlock = ` if (true == setup['live']) {
|
|
266
|
+
${liveQueryPrefix}${exampleLines}
|
|
267
|
+
} else {
|
|
268
|
+
${mockParamLines}
|
|
269
|
+
}`
|
|
270
|
+
}
|
|
271
|
+
else if (hasList) {
|
|
272
|
+
// List-bootstrap pattern picks the load id from a list call's response.
|
|
273
|
+
liveIdKeys = liveAncestorParams.map((lp: any) => lp.key)
|
|
274
|
+
const listParamLines = liveListParams.map((lp: any) =>
|
|
275
|
+
` '${lp.name}': setup['idmap']['${lp.key}'],`).join('\n')
|
|
276
|
+
const ancestorParamLines = liveAncestorParams.map((lp: any) =>
|
|
277
|
+
` params['${lp.name}'] = setup['idmap']['${lp.key}'];`).join('\n')
|
|
278
|
+
const idParamName = loadParams.find((p: any) => p.name === 'id')
|
|
279
|
+
? 'id'
|
|
280
|
+
: (loadParams[0]?.name ?? 'id')
|
|
281
|
+
|
|
282
|
+
liveParamsBlock = ` if (true == setup['live']) {
|
|
283
|
+
${liveQueryPrefix} final listResult = await client.direct({
|
|
284
|
+
'path': '${listPath}',
|
|
285
|
+
'method': 'GET',
|
|
286
|
+
'params': {
|
|
287
|
+
${listParamLines}
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
if (true != listResult['ok']) {
|
|
291
|
+
return; // skip: list call failed (likely synthetic IDs against live API)
|
|
292
|
+
}
|
|
293
|
+
final listArr = unwrapListData(listResult['data']);
|
|
294
|
+
if (null == listArr || 0 == listArr.length) {
|
|
295
|
+
return; // skip: no entities to load in live mode
|
|
296
|
+
}
|
|
297
|
+
final candidateId =
|
|
298
|
+
(listArr[0] is Map ? listArr[0]['${idParamName}'] : null) ??
|
|
299
|
+
(listArr[0] is Map ? listArr[0]['id'] : null);
|
|
300
|
+
if (null == candidateId) {
|
|
301
|
+
return; // skip: list response shape does not expose load identifier
|
|
302
|
+
}
|
|
303
|
+
params['${idParamName}'] = candidateId;
|
|
304
|
+
${ancestorParamLines}
|
|
305
|
+
} else {
|
|
306
|
+
${mockParamLines}
|
|
307
|
+
}`
|
|
308
|
+
} else if (hasLiveQuery || loadParams.length > 0) {
|
|
309
|
+
// Synthetic-only fallback: skip live when ENTID overrides are missing.
|
|
310
|
+
if (loadParams.length > 0) {
|
|
311
|
+
liveIdKeys = loadParams.map((p: any) => p.name + '01')
|
|
312
|
+
}
|
|
313
|
+
liveParamsBlock = ` if (true == setup['live']) {
|
|
314
|
+
${liveQueryPrefix.replace(/\n$/, '')}
|
|
315
|
+
} else {
|
|
316
|
+
${mockParamLines}
|
|
317
|
+
}`
|
|
318
|
+
} else {
|
|
319
|
+
liveParamsBlock = ''
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const skipMissingLine = liveIdKeys.length > 0
|
|
323
|
+
? ` if (skipIfMissingIds(t, setup, ${JSON.stringify(liveIdKeys)})) {
|
|
324
|
+
return;
|
|
325
|
+
}\n`
|
|
326
|
+
: ''
|
|
327
|
+
|
|
328
|
+
Content(`
|
|
329
|
+
test('direct-load-${entity.name}', (t) async {
|
|
330
|
+
final setup = directSetup({'id': 'direct01'});
|
|
331
|
+
if (maybeSkipControl(
|
|
332
|
+
t, 'direct', 'direct-load-${entity.name}', true == setup['live'])) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
${skipMissingLine} final client = setup['client'];
|
|
336
|
+
final calls = setup['calls'];
|
|
337
|
+
|
|
338
|
+
final params = <String, dynamic>{};
|
|
339
|
+
final query = <String, dynamic>{};
|
|
340
|
+
${liveParamsBlock}
|
|
341
|
+
|
|
342
|
+
final result = await client.direct({
|
|
343
|
+
'path': '${loadPath}',
|
|
344
|
+
'method': 'GET',
|
|
345
|
+
'params': params,
|
|
346
|
+
'query': query,
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
if (true == setup['live']) {
|
|
350
|
+
// Live mode is lenient: synthetic IDs frequently 4xx. Skip rather
|
|
351
|
+
// than fail when the load endpoint isn't reachable.
|
|
352
|
+
if (true != result['ok'] ||
|
|
353
|
+
result['status'] < 200 ||
|
|
354
|
+
result['status'] >= 300) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
} else {
|
|
358
|
+
ok(true == result['ok']);
|
|
359
|
+
ok(200 == result['status']);
|
|
360
|
+
ok(null != result['data']);
|
|
361
|
+
ok('direct01' == result['data']['id']);
|
|
362
|
+
ok(1 == calls.length);
|
|
363
|
+
ok('GET' == calls[0]['init']['method']);
|
|
364
|
+
${paramAsserts} }
|
|
365
|
+
});
|
|
366
|
+
`)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
function generateDirectList(model: Model, entity: ModelEntity) {
|
|
371
|
+
const listOp = entity.op?.list
|
|
372
|
+
const listPoint: ModelPoint | undefined = listOp?.points?.[0]
|
|
373
|
+
|
|
374
|
+
if (null == listPoint) {
|
|
375
|
+
return
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const listParams = listPoint.args?.params || []
|
|
379
|
+
const listPath = normalizePathParams(pointParts(listPoint), listParams, listPoint.rename?.param)
|
|
380
|
+
|
|
381
|
+
const listQuery = listPoint.args?.query || []
|
|
382
|
+
const liveQueryLines = listQuery
|
|
383
|
+
.filter((q: any) => q.reqd && undefined !== q.example && null !== q.example)
|
|
384
|
+
.map((q: any) => ` query['${q.name}'] = ${dartValue(q.example)};`)
|
|
385
|
+
.join('\n')
|
|
386
|
+
|
|
387
|
+
const liveParams = listParams.map((p: any) => {
|
|
388
|
+
const key = p.name === 'id'
|
|
389
|
+
? entity.name + '01'
|
|
390
|
+
: p.name.replace(/_id$/, '') + '01'
|
|
391
|
+
return { name: p.name, key }
|
|
392
|
+
})
|
|
393
|
+
|
|
394
|
+
const paramAsserts = listParams.map((p: any, i: number) =>
|
|
395
|
+
` ok(calls[0]['url'].toString().contains('direct0${i + 1}'));\n`).join('')
|
|
396
|
+
|
|
397
|
+
let paramsBlock = ''
|
|
398
|
+
if (listParams.length > 0 || liveQueryLines) {
|
|
399
|
+
const liveLines = [
|
|
400
|
+
liveQueryLines,
|
|
401
|
+
liveParams.map((lp: any) =>
|
|
402
|
+
` params['${lp.name}'] = setup['idmap']['${lp.key}'];`).join('\n'),
|
|
403
|
+
].filter(Boolean).join('\n')
|
|
404
|
+
const mockLines = listParams.map((p: any, i: number) =>
|
|
405
|
+
` params['${p.name}'] = 'direct0${i + 1}';`).join('\n')
|
|
406
|
+
|
|
407
|
+
paramsBlock = ` if (true == setup['live']) {
|
|
408
|
+
${liveLines}
|
|
409
|
+
}${mockLines ? ` else {
|
|
410
|
+
${mockLines}
|
|
411
|
+
}` : ''}
|
|
412
|
+
`
|
|
413
|
+
} else {
|
|
414
|
+
paramsBlock = ''
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
const liveIdKeys: string[] = listParams.length > 0
|
|
418
|
+
? liveParams.map((lp: any) => lp.key)
|
|
419
|
+
: []
|
|
420
|
+
const skipMissingLine = liveIdKeys.length > 0
|
|
421
|
+
? ` if (skipIfMissingIds(t, setup, ${JSON.stringify(liveIdKeys)})) {
|
|
422
|
+
return;
|
|
423
|
+
}\n`
|
|
424
|
+
: ''
|
|
425
|
+
|
|
426
|
+
Content(`
|
|
427
|
+
test('direct-list-${entity.name}', (t) async {
|
|
428
|
+
final setup = directSetup([
|
|
429
|
+
{'id': 'direct01'},
|
|
430
|
+
{'id': 'direct02'}
|
|
431
|
+
]);
|
|
432
|
+
if (maybeSkipControl(
|
|
433
|
+
t, 'direct', 'direct-list-${entity.name}', true == setup['live'])) {
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
${skipMissingLine} final client = setup['client'];
|
|
437
|
+
final calls = setup['calls'];
|
|
438
|
+
|
|
439
|
+
final params = <String, dynamic>{};
|
|
440
|
+
final query = <String, dynamic>{};
|
|
441
|
+
${paramsBlock}
|
|
442
|
+
final result = await client.direct({
|
|
443
|
+
'path': '${listPath}',
|
|
444
|
+
'method': 'GET',
|
|
445
|
+
'params': params,
|
|
446
|
+
'query': query,
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
if (true == setup['live']) {
|
|
450
|
+
// Live mode is lenient: synthetic IDs frequently 4xx and the list-
|
|
451
|
+
// response shape varies wildly across public APIs. Skip rather than
|
|
452
|
+
// fail when the call doesn't return a usable list.
|
|
453
|
+
if (true != result['ok'] ||
|
|
454
|
+
result['status'] < 200 ||
|
|
455
|
+
result['status'] >= 300) {
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
final listArr = unwrapListData(result['data']);
|
|
459
|
+
if (listArr is! List) {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
} else {
|
|
463
|
+
ok(true == result['ok']);
|
|
464
|
+
ok(200 == result['status']);
|
|
465
|
+
ok(null != result['data']);
|
|
466
|
+
final listArr = unwrapListData(result['data']);
|
|
467
|
+
ok(listArr is List);
|
|
468
|
+
ok(2 == listArr.length);
|
|
469
|
+
ok(1 == calls.length);
|
|
470
|
+
ok('GET' == calls[0]['init']['method']);
|
|
471
|
+
${paramAsserts} }
|
|
472
|
+
});
|
|
473
|
+
`)
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
// Replace raw OpenAPI parameter names in path parts with model parameter
|
|
478
|
+
// names (see TestDirect_ts.ts for the full rationale).
|
|
479
|
+
function normalizePathParams(
|
|
480
|
+
parts: string[],
|
|
481
|
+
params: any[],
|
|
482
|
+
rename?: Record<string, string>
|
|
483
|
+
): string {
|
|
484
|
+
return parts.map((part: string) => {
|
|
485
|
+
return part.replace(/\{([^}]+)\}/g, (match: string, rawName: string) => {
|
|
486
|
+
const snaked = snakify(rawName)
|
|
487
|
+
const depluralized = depluralize(snaked)
|
|
488
|
+
const param = params.find((p: any) =>
|
|
489
|
+
p.name === snaked || p.name === depluralized) ||
|
|
490
|
+
params.find((p: any) =>
|
|
491
|
+
p.orig === snaked || p.orig === depluralized)
|
|
492
|
+
if (param) return '{' + param.name + '}'
|
|
493
|
+
|
|
494
|
+
if (rename) {
|
|
495
|
+
for (const [origCamel, renamedTo] of Object.entries(rename)) {
|
|
496
|
+
if (renamedTo === rawName) {
|
|
497
|
+
const origSnaked = snakify(origCamel)
|
|
498
|
+
const origDepluralized = depluralize(origSnaked)
|
|
499
|
+
const renamedParam = params.find(
|
|
500
|
+
(p: any) => p.orig === origSnaked || p.name === origSnaked ||
|
|
501
|
+
p.orig === origDepluralized || p.name === origDepluralized
|
|
502
|
+
)
|
|
503
|
+
if (renamedParam) return '{' + renamedParam.name + '}'
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
return match
|
|
509
|
+
})
|
|
510
|
+
}).join('/')
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
export {
|
|
515
|
+
TestDirect
|
|
516
|
+
}
|