@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,123 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cmp, each,
|
|
3
|
+
File, Content, Copy, Folder,
|
|
4
|
+
} from '@voxgig/sdkgen'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
ModelEntity
|
|
9
|
+
} from '@voxgig/apidef'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
KIT,
|
|
14
|
+
getModelPath
|
|
15
|
+
} from '@voxgig/apidef'
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
import { Package } from './Package_haskell'
|
|
19
|
+
import { Config } from './Config_haskell'
|
|
20
|
+
import { Gitignore } from './Gitignore_haskell'
|
|
21
|
+
import { hsVarName } from './utility_haskell'
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
const Main = cmp(async function Main(props: any) {
|
|
25
|
+
|
|
26
|
+
const { target } = props
|
|
27
|
+
const { model } = props.ctx$
|
|
28
|
+
|
|
29
|
+
const entity: ModelEntity = getModelPath(model, `main.${KIT}.entity`)
|
|
30
|
+
|
|
31
|
+
Package({ target })
|
|
32
|
+
|
|
33
|
+
Gitignore({})
|
|
34
|
+
|
|
35
|
+
// Copy tm/haskell verbatim: the runtime under src/ (VoxgigStruct, Vregex,
|
|
36
|
+
// SdkTypes, SdkHelpers, SdkRuntime, SdkFeatures), the test suite under
|
|
37
|
+
// test/, and Makefile/LICENSE/VERSION. The per-feature custom-source
|
|
38
|
+
// scaffold under src/feature is excluded (this target does not use it —
|
|
39
|
+
// entities are generic and config-driven, so there are no per-entity or
|
|
40
|
+
// per-feature generated modules). Placeholder substitution applies.
|
|
41
|
+
Copy({
|
|
42
|
+
from: 'tm/' + target.name,
|
|
43
|
+
exclude: [/src\/feature\//],
|
|
44
|
+
replace: {
|
|
45
|
+
...props.ctx$.stdrep,
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
// Generated modules under src/: the API config + feature factory, and the
|
|
50
|
+
// public client (SDK constructors + entity accessors).
|
|
51
|
+
Folder({ name: 'src' }, () => {
|
|
52
|
+
|
|
53
|
+
Config({ target })
|
|
54
|
+
|
|
55
|
+
File({ name: 'SdkClient.' + target.ext }, () => {
|
|
56
|
+
|
|
57
|
+
let accessors = ''
|
|
58
|
+
let exports = ''
|
|
59
|
+
each(entity, (e: any) => {
|
|
60
|
+
const fn = hsVarName(e.name)
|
|
61
|
+
exports += ` , ${fn}\n`
|
|
62
|
+
accessors += `-- | The ${e.Name} entity bound to this client.
|
|
63
|
+
${fn} :: Client -> Value -> IO Entity
|
|
64
|
+
${fn} client entopts = F.makeEntity client "${e.name}" entopts
|
|
65
|
+
|
|
66
|
+
`
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
Content(`-- ${model.const.Name} SDK public client (generated by @voxgig/sdkgen).
|
|
70
|
+
--
|
|
71
|
+
-- SDK constructors (newSdk / testSdk) and one accessor per entity. Entities
|
|
72
|
+
-- are generic — every accessor calls the config-driven F.makeEntity, so the
|
|
73
|
+
-- operation pipeline is identical for every entity and every API.
|
|
74
|
+
|
|
75
|
+
module SdkClient
|
|
76
|
+
( module SdkTypes
|
|
77
|
+
, newSdk
|
|
78
|
+
, newSdk0
|
|
79
|
+
, testSdk
|
|
80
|
+
, testSdk0
|
|
81
|
+
${exports} ) where
|
|
82
|
+
|
|
83
|
+
import Data.IORef (readIORef)
|
|
84
|
+
|
|
85
|
+
import VoxgigStruct (Value (..))
|
|
86
|
+
import SdkTypes
|
|
87
|
+
import SdkConfig (makeConfig, makeFeature)
|
|
88
|
+
import qualified SdkFeatures as F
|
|
89
|
+
|
|
90
|
+
-- | Construct a live SDK client from an options map (Noval for defaults).
|
|
91
|
+
newSdk :: Value -> IO Client
|
|
92
|
+
newSdk options = do
|
|
93
|
+
cfg <- makeConfig
|
|
94
|
+
F.makeClientBase cfg makeFeature options
|
|
95
|
+
|
|
96
|
+
-- | No-argument convenience constructor.
|
|
97
|
+
newSdk0 :: IO Client
|
|
98
|
+
newSdk0 = newSdk VNoval
|
|
99
|
+
|
|
100
|
+
-- | Construct a test-mode SDK: testSdk testopts sdkopts.
|
|
101
|
+
testSdk :: Value -> Value -> IO Client
|
|
102
|
+
testSdk testopts sdkopts = do
|
|
103
|
+
cfg <- makeConfig
|
|
104
|
+
F.sdkTest cfg makeFeature testopts sdkopts
|
|
105
|
+
|
|
106
|
+
-- | No-argument convenience test constructor.
|
|
107
|
+
testSdk0 :: IO Client
|
|
108
|
+
testSdk0 = testSdk VNoval VNoval
|
|
109
|
+
|
|
110
|
+
-- | The active client mode ("live" or "test").
|
|
111
|
+
clientMode :: Client -> IO String
|
|
112
|
+
clientMode = readIORef . clMode
|
|
113
|
+
|
|
114
|
+
${accessors}`)
|
|
115
|
+
})
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
export {
|
|
122
|
+
Main
|
|
123
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Content,
|
|
3
|
+
File,
|
|
4
|
+
cmp,
|
|
5
|
+
packageVersion,
|
|
6
|
+
} from '@voxgig/sdkgen'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
import type {
|
|
10
|
+
Model,
|
|
11
|
+
} from '@voxgig/apidef'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
function pkgName(model: any): string {
|
|
15
|
+
const org = (model.origin || 'voxgig-sdk').replace(/-sdk$/, '')
|
|
16
|
+
return `${org}-${model.name}-sdk`.toLowerCase().replace(/[^a-z0-9-]/g, '-')
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
// The cabal package file (for Hackage publication). The offline test build
|
|
21
|
+
// uses the Makefile (stock ghc, boot libraries only: base + containers +
|
|
22
|
+
// array + time), so no cabal solve is required to run the suite.
|
|
23
|
+
const Package = cmp(async function Package(props: any) {
|
|
24
|
+
const ctx$ = props.ctx$
|
|
25
|
+
const target = props.target
|
|
26
|
+
|
|
27
|
+
const model: Model = ctx$.model
|
|
28
|
+
|
|
29
|
+
File({ name: pkgName(model) + '.cabal' }, () => {
|
|
30
|
+
Content(`cabal-version: 2.4
|
|
31
|
+
name: ${pkgName(model)}
|
|
32
|
+
version: ${packageVersion(model, target.name)}
|
|
33
|
+
synopsis: ${model.const.Name} SDK for Haskell (generated by @voxgig/sdkgen)
|
|
34
|
+
license: MIT
|
|
35
|
+
build-type: Simple
|
|
36
|
+
|
|
37
|
+
library
|
|
38
|
+
default-language: Haskell2010
|
|
39
|
+
hs-source-dirs: src
|
|
40
|
+
exposed-modules: VoxgigStruct
|
|
41
|
+
Vregex
|
|
42
|
+
SdkJson
|
|
43
|
+
SdkTypes
|
|
44
|
+
SdkHelpers
|
|
45
|
+
SdkRuntime
|
|
46
|
+
SdkFeatures
|
|
47
|
+
SdkConfig
|
|
48
|
+
SdkClient
|
|
49
|
+
build-depends: base >=4.14 && <5
|
|
50
|
+
, containers >=0.6 && <0.8
|
|
51
|
+
, array >=0.5 && <0.6
|
|
52
|
+
, time >=1.9 && <1.15
|
|
53
|
+
`)
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
export {
|
|
59
|
+
Package
|
|
60
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, each, Content, canonKey, entityIdField, opRequestShape } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
KIT,
|
|
6
|
+
getModelPath,
|
|
7
|
+
} from '@voxgig/apidef'
|
|
8
|
+
|
|
9
|
+
import { hsVarName } from './utility_haskell'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// A type-correct Haskell `Value` literal for a field's canonical type.
|
|
13
|
+
function hsLit(type: any, placeholder: string = 'example'): string {
|
|
14
|
+
const k = canonKey(type)
|
|
15
|
+
if ('INTEGER' === k || 'NUMBER' === k) return 'VNum 1'
|
|
16
|
+
if ('BOOLEAN' === k) return 'VBool True'
|
|
17
|
+
if ('ARRAY' === k || 'OBJECT' === k) return 'VNoval'
|
|
18
|
+
return `VStr "${placeholder}"`
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
// A readable Haskell type name for a field's canonical type. The runtime
|
|
23
|
+
// carries every field as a dynamic `Value`; this documents the logical type.
|
|
24
|
+
function hsType(type: any): string {
|
|
25
|
+
const k = canonKey(type)
|
|
26
|
+
if ('STRING' === k) return 'String'
|
|
27
|
+
if ('INTEGER' === k) return 'Int'
|
|
28
|
+
if ('NUMBER' === k) return 'Double'
|
|
29
|
+
if ('BOOLEAN' === k) return 'Bool'
|
|
30
|
+
if ('ARRAY' === k) return '[Value]'
|
|
31
|
+
return 'Value'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
const OP_DESC: Record<string, { method: string, desc: string }> = {
|
|
36
|
+
load: { method: 'eLoad ent match ctrl', desc: 'Load a single entity by match criteria. Resolves to the entity.' },
|
|
37
|
+
list: { method: 'eList ent match ctrl', desc: 'List entities, optionally matching the given criteria. Resolves to one entity per record.' },
|
|
38
|
+
create: { method: 'eCreate ent data ctrl', desc: 'Create a new entity with the given data. Resolves to the entity.' },
|
|
39
|
+
update: { method: 'eUpdate ent data ctrl', desc: 'Update an existing entity. Resolves to the entity.' },
|
|
40
|
+
remove: { method: 'eRemove ent match ctrl', desc: 'Remove the matching entity. Resolves to the entity, marked deleted.' },
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
const ReadmeEntity = cmp(function ReadmeEntity(props: any) {
|
|
45
|
+
const { target } = props
|
|
46
|
+
const { model } = props.ctx$
|
|
47
|
+
|
|
48
|
+
const entity = getModelPath(model, `main.${KIT}.entity`)
|
|
49
|
+
|
|
50
|
+
const publishedEntities = each(entity)
|
|
51
|
+
.filter((entity: any) => entity.active !== false)
|
|
52
|
+
|
|
53
|
+
if (0 === publishedEntities.length) {
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
Content(`
|
|
58
|
+
|
|
59
|
+
## Entities
|
|
60
|
+
|
|
61
|
+
`)
|
|
62
|
+
|
|
63
|
+
publishedEntities.map((entity: any) => {
|
|
64
|
+
const opnames = Object.keys(entity.op || {})
|
|
65
|
+
const fields = entity.fields || []
|
|
66
|
+
const idF = entityIdField(entity)
|
|
67
|
+
const eFn = hsVarName(entity.name)
|
|
68
|
+
|
|
69
|
+
Content(`
|
|
70
|
+
### ${entity.Name}
|
|
71
|
+
|
|
72
|
+
`)
|
|
73
|
+
|
|
74
|
+
if (entity.short) {
|
|
75
|
+
Content(`${entity.short}
|
|
76
|
+
|
|
77
|
+
`)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
Content(`Create an instance: \`${eFn} <- Sdk.${eFn} sdk VNoval\`
|
|
81
|
+
|
|
82
|
+
`)
|
|
83
|
+
|
|
84
|
+
if (opnames.length > 0) {
|
|
85
|
+
Content(`#### Operations
|
|
86
|
+
|
|
87
|
+
| Method | Description |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
`)
|
|
90
|
+
opnames.map((opname: string) => {
|
|
91
|
+
const info = OP_DESC[opname]
|
|
92
|
+
if (info) {
|
|
93
|
+
Content(`| \`${info.method}\` | ${info.desc} |
|
|
94
|
+
`)
|
|
95
|
+
}
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
Content(`
|
|
99
|
+
`)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (fields.length > 0) {
|
|
103
|
+
Content(`#### Fields
|
|
104
|
+
|
|
105
|
+
| Field | Type | Description |
|
|
106
|
+
| --- | --- | --- |
|
|
107
|
+
`)
|
|
108
|
+
|
|
109
|
+
each(fields, (field: any) => {
|
|
110
|
+
const desc = field.short || ''
|
|
111
|
+
Content(`| \`${field.name}\` | \`${hsType(field.type)}\` | ${desc} |
|
|
112
|
+
`)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
Content(`
|
|
116
|
+
`)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (opnames.includes('load')) {
|
|
120
|
+
const loadItems = opRequestShape(entity, 'load').items
|
|
121
|
+
.filter((it: any) => !it.optional || it.name === idF)
|
|
122
|
+
.sort((a: any, b: any) =>
|
|
123
|
+
(a.name === idF ? 0 : 1) - (b.name === idF ? 0 : 1))
|
|
124
|
+
const loadArg = 0 < loadItems.length
|
|
125
|
+
? `[${loadItems.map((it: any) =>
|
|
126
|
+
`("${it.name}", ${hsLit(it.type,
|
|
127
|
+
it.name === idF ? entity.name + '_id' : it.name)})`).join(', ')}]`
|
|
128
|
+
: '[]'
|
|
129
|
+
Content(`#### Example: Load
|
|
130
|
+
|
|
131
|
+
\`\`\`haskell
|
|
132
|
+
ent <- Sdk.${eFn} sdk VNoval
|
|
133
|
+
match <- jo ${loadArg}
|
|
134
|
+
ctrl <- emptyMap
|
|
135
|
+
${eFn} <- Sdk.eLoad ent match ctrl
|
|
136
|
+
-- The op resolves to the ENTITY; the record is inside it.
|
|
137
|
+
${eFn}Data <- Sdk.eDataGet ${eFn}
|
|
138
|
+
\`\`\`
|
|
139
|
+
|
|
140
|
+
`)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (opnames.includes('list')) {
|
|
144
|
+
Content(`#### Example: List
|
|
145
|
+
|
|
146
|
+
\`\`\`haskell
|
|
147
|
+
ent <- Sdk.${eFn} sdk VNoval
|
|
148
|
+
match <- emptyMap
|
|
149
|
+
ctrl <- emptyMap
|
|
150
|
+
-- One ENTITY per record.
|
|
151
|
+
${eFn}s <- Sdk.eList ent match ctrl
|
|
152
|
+
${eFn}Datas <- mapM Sdk.eDataGet ${eFn}s
|
|
153
|
+
\`\`\`
|
|
154
|
+
|
|
155
|
+
`)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
if (opnames.includes('create')) {
|
|
159
|
+
const createItems = opRequestShape(entity, 'create').items
|
|
160
|
+
.filter((it: any) => !it.optional)
|
|
161
|
+
Content(`#### Example: Create
|
|
162
|
+
|
|
163
|
+
\`\`\`haskell
|
|
164
|
+
ent <- Sdk.${eFn} sdk VNoval
|
|
165
|
+
d <- jo
|
|
166
|
+
[`)
|
|
167
|
+
createItems.map((it: any, i: number) => {
|
|
168
|
+
const bracket = 0 === i ? ' ' : ', '
|
|
169
|
+
Content(`${bracket}("${it.name}", ${hsLit(it.type, 'example_' + it.name)}) -- ${hsType(it.type)}
|
|
170
|
+
`)
|
|
171
|
+
})
|
|
172
|
+
Content(`]
|
|
173
|
+
ctrl <- emptyMap
|
|
174
|
+
${eFn} <- Sdk.eCreate ent d ctrl
|
|
175
|
+
${eFn}Data <- Sdk.eDataGet ${eFn}
|
|
176
|
+
\`\`\`
|
|
177
|
+
|
|
178
|
+
`)
|
|
179
|
+
}
|
|
180
|
+
})
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
export {
|
|
185
|
+
ReadmeEntity
|
|
186
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, File, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// Emits test/TReadmeExamples.hs — a STRUCTURAL gate over every fenced
|
|
6
|
+
// Haskell code block in the three docs that ship Haskell examples:
|
|
7
|
+
// - the root README.md (top-level, multi-language quick start)
|
|
8
|
+
// - the per-language haskell/README.md
|
|
9
|
+
// - the per-language haskell/REFERENCE.md
|
|
10
|
+
//
|
|
11
|
+
// DESIGN NOTE vs the Python gate (ReadmeExamplesTest_py.ts): the Python
|
|
12
|
+
// version parses AND executes every block in a seeded test-mode subprocess.
|
|
13
|
+
// A faithful Haskell port would compile every snippet against the generated
|
|
14
|
+
// SDK — a throwaway module per block plus a GHC invocation — a large,
|
|
15
|
+
// environment-sensitive harness that cannot be authored safely without a build
|
|
16
|
+
// to validate it. This gate instead validates that every documented Haskell
|
|
17
|
+
// block is PRESENT, non-empty, and STRUCTURALLY well-formed (balanced
|
|
18
|
+
// delimiters). Missing docs are tolerated (a run may generate a subset of
|
|
19
|
+
// phases), and no blocks found records no failures — so this never breaks the
|
|
20
|
+
// shared runner. Upgrading it to a true compile gate is left as a follow-up.
|
|
21
|
+
//
|
|
22
|
+
// The emitted module exposes `tests :: Counters -> IO ()`; the generated
|
|
23
|
+
// SdkGenTests calls it, so it runs inside the standard Runner. The triple
|
|
24
|
+
// backtick fence marker is built from its char code (toEnum 96) so this
|
|
25
|
+
// component's Haskell source needs no backtick/backslash gymnastics.
|
|
26
|
+
const ReadmeExamplesTest = cmp(function ReadmeExamplesTest(props: any) {
|
|
27
|
+
const { target, ctx$: { model } } = props
|
|
28
|
+
|
|
29
|
+
const Name = model.const.Name
|
|
30
|
+
|
|
31
|
+
File({ name: 'TReadmeExamples.' + target.ext }, () => {
|
|
32
|
+
Content(`-- ${Name} SDK — documentation Haskell-examples structural gate.
|
|
33
|
+
--
|
|
34
|
+
-- Validates that every fenced Haskell code block in the SDK docs (the root
|
|
35
|
+
-- README.md, the per-language README.md, and REFERENCE.md) is present,
|
|
36
|
+
-- non-empty, and has balanced delimiters. Missing docs are tolerated (a run
|
|
37
|
+
-- may generate a subset of phases), so this gate never breaks the shared
|
|
38
|
+
-- runner. See ReadmeExamplesTest_haskell for why this is a structural gate
|
|
39
|
+
-- rather than a full compile harness. Generated by @voxgig/sdkgen.
|
|
40
|
+
|
|
41
|
+
{-# LANGUAGE ScopedTypeVariables #-}
|
|
42
|
+
|
|
43
|
+
module TReadmeExamples (tests) where
|
|
44
|
+
|
|
45
|
+
import Control.Exception (SomeException, evaluate, try)
|
|
46
|
+
import Control.Monad (forM_)
|
|
47
|
+
|
|
48
|
+
import Testutil (Counters, runTest)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
-- True for the whitespace characters we trim: space, tab, carriage return.
|
|
52
|
+
isWs :: Char -> Bool
|
|
53
|
+
isWs ch = let n = fromEnum ch in n == 32 || n == 9 || n == 13
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
-- Trim leading/trailing whitespace from a line.
|
|
57
|
+
trimWs :: String -> String
|
|
58
|
+
trimWs = f . f
|
|
59
|
+
where f = reverse . dropWhile isWs
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
-- Read a doc file, tolerating absence (returns "" when missing/unreadable).
|
|
63
|
+
readDoc :: FilePath -> IO String
|
|
64
|
+
readDoc path = do
|
|
65
|
+
r <- try (do s <- readFile path; _ <- evaluate (length s); pure s)
|
|
66
|
+
:: IO (Either SomeException String)
|
|
67
|
+
pure (either (const "") id r)
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
-- Extract the body of every fenced Haskell block from markdown. Returns
|
|
71
|
+
-- (blocks, allClosed) where allClosed is False when a fence was opened but
|
|
72
|
+
-- never closed before EOF — a malformed doc that must fail rather than pass
|
|
73
|
+
-- silently on the unterminated block. The fence marker (three backticks) is
|
|
74
|
+
-- built from its char code so this source stays backtick-free.
|
|
75
|
+
haskellBlocks :: String -> ([String], Bool)
|
|
76
|
+
haskellBlocks src = go (lines src)
|
|
77
|
+
where
|
|
78
|
+
fence3 = replicate 3 (toEnum 96 :: Char)
|
|
79
|
+
fenceHs = fence3 ++ "haskell"
|
|
80
|
+
go [] = ([], True)
|
|
81
|
+
go (l : ls)
|
|
82
|
+
| trimWs l == fenceHs =
|
|
83
|
+
case break (\\x -> trimWs x == fence3) ls of
|
|
84
|
+
(blk, []) -> ([unlines blk], False)
|
|
85
|
+
(blk, _ : rest) -> let (bs, ok) = go rest in (unlines blk : bs, ok)
|
|
86
|
+
| otherwise = go ls
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
-- Balanced (), [], {} outside of double-quoted string literals, with each
|
|
90
|
+
-- closer matching the most-recent opener via a stack (so "([)]" is rejected,
|
|
91
|
+
-- not merely counted). The generated snippets never embed an escaped quote
|
|
92
|
+
-- inside a string.
|
|
93
|
+
balanced :: String -> Bool
|
|
94
|
+
balanced = go False []
|
|
95
|
+
where
|
|
96
|
+
go inStr stack [] = not inStr && null stack
|
|
97
|
+
go inStr stack (c : cs)
|
|
98
|
+
| c == '"' = go (not inStr) stack cs
|
|
99
|
+
| inStr = go inStr stack cs
|
|
100
|
+
| c == '(' = go inStr (')' : stack) cs
|
|
101
|
+
| c == '[' = go inStr (']' : stack) cs
|
|
102
|
+
| c == '{' = go inStr ('}' : stack) cs
|
|
103
|
+
| c == ')' || c == ']' || c == '}' =
|
|
104
|
+
case stack of
|
|
105
|
+
(top : rest) | top == c -> go inStr rest cs
|
|
106
|
+
_ -> False
|
|
107
|
+
| otherwise = go inStr stack cs
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
-- The three documents held to the gate, tagged by human label.
|
|
111
|
+
docs :: [(String, FilePath)]
|
|
112
|
+
docs =
|
|
113
|
+
[ ("root README", "../README.md")
|
|
114
|
+
, ("${target.name} README", "README.md")
|
|
115
|
+
, ("${target.name} REFERENCE", "REFERENCE.md")
|
|
116
|
+
]
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
tests :: Counters -> IO ()
|
|
120
|
+
tests c =
|
|
121
|
+
forM_ docs (\\(label, path) -> do
|
|
122
|
+
src <- readDoc path
|
|
123
|
+
let (blocks, closed) = haskellBlocks src
|
|
124
|
+
runTest c (label ++ " haskell fences closed") (pure closed)
|
|
125
|
+
forM_ (zip [1 :: Int ..] blocks) (\\(i, blk) ->
|
|
126
|
+
runTest c (label ++ " haskell block " ++ show i ++ " well-formed")
|
|
127
|
+
(pure (not (null (trimWs blk)) && balanced blk))))
|
|
128
|
+
`)
|
|
129
|
+
})
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
export {
|
|
134
|
+
ReadmeExamplesTest
|
|
135
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
|
|
2
|
+
import { cmp, Content } from '@voxgig/sdkgen'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
const ReadmeExplanation = cmp(function ReadmeExplanation(props: any) {
|
|
6
|
+
const { target, ctx$: { model } } = props
|
|
7
|
+
|
|
8
|
+
Content(`### Data as struct Values
|
|
9
|
+
|
|
10
|
+
The Haskell SDK models every API record as the dynamic \`Value\` type (from
|
|
11
|
+
the vendored \`VoxgigStruct\` module) rather than bespoke Haskell records.
|
|
12
|
+
This mirrors the dynamic nature of the API and keeps the SDK flexible — no
|
|
13
|
+
new datatypes or code generation are needed when the API schema changes.
|
|
14
|
+
|
|
15
|
+
Build request maps with \`jo [(key, value)]\` and read fields back with
|
|
16
|
+
\`getp value "field"\`; scalars are the \`VStr\` / \`VNum\` / \`VBool\`
|
|
17
|
+
constructors, and \`VNoval\` stands for an absent property.
|
|
18
|
+
|
|
19
|
+
### Module structure
|
|
20
|
+
|
|
21
|
+
\`\`\`
|
|
22
|
+
${target.name}/
|
|
23
|
+
├── src/
|
|
24
|
+
│ ├── VoxgigStruct.hs -- vendored dependency-free struct library (Value)
|
|
25
|
+
│ ├── Vregex.hs -- vendored regex support
|
|
26
|
+
│ ├── SdkTypes.hs -- core types (Client, Entity, Feature)
|
|
27
|
+
│ ├── SdkHelpers.hs -- helper functions (jo, getp, ...)
|
|
28
|
+
│ ├── SdkRuntime.hs -- the generic operation pipeline
|
|
29
|
+
│ ├── SdkFeatures.hs -- built-in features + makeEntity
|
|
30
|
+
│ ├── SdkConfig.hs -- generated API configuration + feature factory
|
|
31
|
+
│ └── SdkClient.hs -- generated public client (newSdk, entity accessors)
|
|
32
|
+
├── test/ -- test suites
|
|
33
|
+
├── Makefile -- stock-GHC build/test (no third-party deps)
|
|
34
|
+
└── ${model.const.Name.toLowerCase()}-sdk.cabal -- package manifest (for Hackage)
|
|
35
|
+
\`\`\`
|
|
36
|
+
|
|
37
|
+
The public module (\`SdkClient\`) exports the SDK constructors (\`newSdk\`,
|
|
38
|
+
\`testSdk\`) and one accessor per entity. Import \`VoxgigStruct\` for the
|
|
39
|
+
\`Value\` constructors and \`SdkHelpers\` for \`jo\` / \`getp\`.
|
|
40
|
+
|
|
41
|
+
`)
|
|
42
|
+
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
export {
|
|
47
|
+
ReadmeExplanation
|
|
48
|
+
}
|