@voxgig/sdkgen 0.25.0 → 0.28.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.
Files changed (213) hide show
  1. package/bin/voxgig-sdkgen +6 -6
  2. package/dist/action/action.js +1 -2
  3. package/dist/action/action.js.map +1 -1
  4. package/dist/action/feature.js +4 -2
  5. package/dist/action/feature.js.map +1 -1
  6. package/dist/action/target.js +4 -2
  7. package/dist/action/target.js.map +1 -1
  8. package/dist/cmp/Entity.js +2 -1
  9. package/dist/cmp/Entity.js.map +1 -1
  10. package/dist/cmp/Feature.js +11 -9
  11. package/dist/cmp/Feature.js.map +1 -1
  12. package/dist/cmp/FeatureHook.js +2 -1
  13. package/dist/cmp/FeatureHook.js.map +1 -1
  14. package/dist/cmp/Main.js +6 -2
  15. package/dist/cmp/Main.js.map +1 -1
  16. package/dist/cmp/ReadmeEntity.js +2 -1
  17. package/dist/cmp/ReadmeEntity.js.map +1 -1
  18. package/dist/cmp/Test.d.ts +2 -0
  19. package/dist/cmp/Test.js +17 -0
  20. package/dist/cmp/Test.js.map +1 -0
  21. package/dist/sdkgen.d.ts +2 -1
  22. package/dist/sdkgen.js +17 -28
  23. package/dist/sdkgen.js.map +1 -1
  24. package/dist/tsconfig.tsbuildinfo +1 -1
  25. package/dist/types.d.ts +3 -1
  26. package/dist/types.js +4 -0
  27. package/dist/types.js.map +1 -1
  28. package/model/sdkgen.jsonic +9 -9
  29. package/package.json +8 -6
  30. package/project/.sdk/model/feature/log.jsonic +3 -3
  31. package/project/.sdk/model/feature/test.jsonic +8 -3
  32. package/project/.sdk/model/target/go.jsonic +19 -4
  33. package/project/.sdk/model/target/js.jsonic +2 -2
  34. package/project/.sdk/model/target/ts.jsonic +5 -5
  35. package/project/.sdk/src/cmp/go/Config_go.ts +119 -0
  36. package/project/.sdk/src/cmp/go/EntityOperation_go.ts +48 -0
  37. package/project/.sdk/src/cmp/go/Entity_go.ts +67 -0
  38. package/project/.sdk/src/cmp/go/MainEntity_go.ts +22 -0
  39. package/project/.sdk/src/cmp/go/Main_go.ts +209 -0
  40. package/project/.sdk/src/cmp/go/Package_go.ts +89 -0
  41. package/project/.sdk/src/cmp/go/TestDirect_go.ts +373 -0
  42. package/project/.sdk/src/cmp/go/TestEntity_go.ts +341 -0
  43. package/project/.sdk/src/cmp/go/Test_go.ts +37 -0
  44. package/project/.sdk/src/cmp/go/fragment/Entity.fragment.go +146 -0
  45. package/project/.sdk/src/cmp/go/fragment/EntityCreateOp.fragment.go +35 -0
  46. package/project/.sdk/src/cmp/go/fragment/EntityListOp.fragment.go +26 -0
  47. package/project/.sdk/src/cmp/go/fragment/EntityLoadOp.fragment.go +38 -0
  48. package/project/.sdk/src/cmp/go/fragment/EntityRemoveOp.fragment.go +38 -0
  49. package/project/.sdk/src/cmp/go/fragment/EntityUpdateOp.fragment.go +38 -0
  50. package/project/.sdk/src/cmp/go/fragment/Main.fragment.go +250 -0
  51. package/project/.sdk/src/cmp/go/fragment/SdkError.fragment.go +22 -0
  52. package/project/.sdk/src/cmp/go/tsconfig.json +15 -0
  53. package/project/.sdk/src/cmp/go/utility_go.ts +88 -0
  54. package/project/.sdk/src/cmp/js/Main_js.ts +3 -3
  55. package/project/.sdk/src/cmp/js/Quick_js.ts +1 -1
  56. package/project/.sdk/src/cmp/js/fragment/EntityCreateOp.fragment.js +6 -6
  57. package/project/.sdk/src/cmp/js/fragment/EntityListOp.fragment.js +6 -6
  58. package/project/.sdk/src/cmp/js/fragment/EntityLoadOp.fragment.js +6 -6
  59. package/project/.sdk/src/cmp/js/fragment/EntityRemoveOp.fragment.js +6 -6
  60. package/project/.sdk/src/cmp/js/fragment/EntityUpdateOp.fragment.js +6 -6
  61. package/project/.sdk/src/cmp/js/fragment/Main.fragment.js +85 -1
  62. package/project/.sdk/src/cmp/ts/Config_ts.ts +53 -6
  63. package/project/.sdk/src/cmp/ts/EntityOperation_ts.ts +3 -21
  64. package/project/.sdk/src/cmp/ts/Entity_ts.ts +3 -5
  65. package/project/.sdk/src/cmp/ts/Main_ts.ts +23 -13
  66. package/project/.sdk/src/cmp/ts/Package_ts.ts +30 -11
  67. package/project/.sdk/src/cmp/ts/SdkError_ts.ts +42 -0
  68. package/project/.sdk/src/cmp/ts/TestDirect_ts.ts +288 -0
  69. package/project/.sdk/src/cmp/ts/TestEntity_ts.ts +349 -2
  70. package/project/.sdk/src/cmp/ts/TestMain_ts.ts +0 -3
  71. package/project/.sdk/src/cmp/ts/Test_ts.ts +23 -3
  72. package/project/.sdk/src/cmp/ts/fragment/Config.fragment.ts +38 -5
  73. package/project/.sdk/src/cmp/ts/fragment/Direct.test.fragment.ts +30 -0
  74. package/project/.sdk/src/cmp/ts/fragment/Entity.fragment.ts +50 -38
  75. package/project/.sdk/src/cmp/ts/fragment/Entity.test.fragment.ts +9 -7
  76. package/project/.sdk/src/cmp/ts/fragment/EntityCreateOp.fragment.ts +47 -31
  77. package/project/.sdk/src/cmp/ts/fragment/EntityListOp.fragment.ts +49 -31
  78. package/project/.sdk/src/cmp/ts/fragment/EntityLoadOp.fragment.ts +50 -33
  79. package/project/.sdk/src/cmp/ts/fragment/EntityRemoveOp.fragment.ts +51 -32
  80. package/project/.sdk/src/cmp/ts/fragment/EntityUpdateOp.fragment.ts +51 -31
  81. package/project/.sdk/src/cmp/ts/fragment/Main.fragment.ts +166 -34
  82. package/project/.sdk/src/cmp/ts/fragment/SdkError.fragment.ts +25 -0
  83. package/project/.sdk/src/cmp/ts/tsconfig.json +15 -0
  84. package/project/.sdk/src/cmp/ts/utility_ts.ts +55 -1
  85. package/project/.sdk/tm/go/Makefile +10 -0
  86. package/project/.sdk/tm/go/core/context.go +267 -0
  87. package/project/.sdk/tm/go/core/control.go +7 -0
  88. package/project/.sdk/tm/go/core/error.go +25 -0
  89. package/project/.sdk/tm/go/core/helpers.go +33 -0
  90. package/project/.sdk/tm/go/core/operation.go +61 -0
  91. package/project/.sdk/tm/go/core/response.go +55 -0
  92. package/project/.sdk/tm/go/core/result.go +73 -0
  93. package/project/.sdk/tm/go/core/spec.go +97 -0
  94. package/project/.sdk/tm/go/core/target.go +102 -0
  95. package/project/.sdk/tm/go/core/types.go +44 -0
  96. package/project/.sdk/tm/go/core/utility_type.go +54 -0
  97. package/project/.sdk/tm/go/feature/base_feature.go +40 -0
  98. package/project/.sdk/tm/go/feature/test_feature.go +196 -0
  99. package/project/.sdk/tm/go/src/feature/README.md +1 -0
  100. package/project/.sdk/tm/go/src/feature/base/.gitkeep +0 -0
  101. package/project/.sdk/tm/go/src/feature/test/.gitkeep +0 -0
  102. package/project/.sdk/tm/go/test/custom_utility_test.go +80 -0
  103. package/project/.sdk/tm/go/test/exists_test.go +16 -0
  104. package/project/.sdk/tm/go/test/primary_utility_test.go +899 -0
  105. package/project/.sdk/tm/go/test/runner_test.go +428 -0
  106. package/project/.sdk/tm/go/test/struct_runner_test.go +1094 -0
  107. package/project/.sdk/tm/go/test/struct_utility_test.go +1423 -0
  108. package/project/.sdk/tm/go/utility/clean.go +7 -0
  109. package/project/.sdk/tm/go/utility/done.go +20 -0
  110. package/project/.sdk/tm/go/utility/feature_add.go +10 -0
  111. package/project/.sdk/tm/go/utility/feature_hook.go +30 -0
  112. package/project/.sdk/tm/go/utility/feature_init.go +30 -0
  113. package/project/.sdk/tm/go/utility/fetcher.go +102 -0
  114. package/project/.sdk/tm/go/utility/make_context.go +7 -0
  115. package/project/.sdk/tm/go/utility/make_error.go +69 -0
  116. package/project/.sdk/tm/go/utility/make_fetch_def.go +44 -0
  117. package/project/.sdk/tm/go/utility/make_options.go +130 -0
  118. package/project/.sdk/tm/go/utility/make_request.go +59 -0
  119. package/project/.sdk/tm/go/utility/make_response.go +46 -0
  120. package/project/.sdk/tm/go/utility/make_result.go +55 -0
  121. package/project/.sdk/tm/go/utility/make_spec.go +68 -0
  122. package/project/.sdk/tm/go/utility/make_target.go +95 -0
  123. package/project/.sdk/tm/go/utility/make_url.go +41 -0
  124. package/project/.sdk/tm/go/utility/param.go +66 -0
  125. package/project/.sdk/tm/go/utility/prepare_auth.go +40 -0
  126. package/project/.sdk/tm/go/utility/prepare_body.go +14 -0
  127. package/project/.sdk/tm/go/utility/prepare_headers.go +22 -0
  128. package/project/.sdk/tm/go/utility/prepare_method.go +21 -0
  129. package/project/.sdk/tm/go/utility/prepare_params.go +41 -0
  130. package/project/.sdk/tm/go/utility/prepare_path.go +21 -0
  131. package/project/.sdk/tm/go/utility/prepare_query.go +47 -0
  132. package/project/.sdk/tm/go/utility/register.go +39 -0
  133. package/project/.sdk/tm/go/utility/result_basic.go +31 -0
  134. package/project/.sdk/tm/go/utility/result_body.go +17 -0
  135. package/project/.sdk/tm/go/utility/result_headers.go +22 -0
  136. package/project/.sdk/tm/go/utility/struct/go.mod +3 -0
  137. package/project/.sdk/tm/go/utility/struct/voxgigstruct.go +4891 -0
  138. package/project/.sdk/tm/go/utility/transform_request.go +32 -0
  139. package/project/.sdk/tm/go/utility/transform_response.go +45 -0
  140. package/project/.sdk/tm/js/src/feature/log/LogFeature.js +2 -2
  141. package/project/.sdk/tm/ts/src/Context.ts +144 -0
  142. package/project/.sdk/tm/ts/src/Control.ts +20 -0
  143. package/project/.sdk/tm/ts/src/Operation.ts +24 -0
  144. package/project/.sdk/tm/ts/src/Response.ts +26 -0
  145. package/project/.sdk/tm/ts/src/Result.ts +30 -0
  146. package/project/.sdk/tm/ts/src/Spec.ts +40 -0
  147. package/project/.sdk/tm/ts/src/Target.ts +36 -0
  148. package/project/.sdk/tm/ts/src/feature/base/BaseFeature.ts +1 -1
  149. package/project/.sdk/tm/ts/src/feature/log/LogFeature.ts +2 -2
  150. package/project/.sdk/tm/ts/src/feature/test/TestFeature.ts +158 -104
  151. package/project/.sdk/tm/ts/src/types.ts +18 -78
  152. package/project/.sdk/tm/ts/src/utility/CleanUtility.ts +17 -31
  153. package/project/.sdk/tm/ts/src/utility/DoneUtility.ts +3 -4
  154. package/project/.sdk/tm/ts/src/utility/{AddfeatureUtility.ts → FeatureAddUtility.ts} +2 -2
  155. package/project/.sdk/tm/ts/src/utility/{FeaturehookUtility.ts → FeatureHookUtility.ts} +8 -5
  156. package/project/.sdk/tm/ts/src/utility/FeatureInitUtility.ts +15 -0
  157. package/project/.sdk/tm/ts/src/utility/FetcherUtility.ts +20 -2
  158. package/project/.sdk/tm/ts/src/utility/MakeContextUtility.ts +27 -0
  159. package/project/.sdk/tm/ts/src/utility/{ErrorUtility.ts → MakeErrorUtility.ts} +10 -6
  160. package/project/.sdk/tm/ts/src/utility/MakeFetchDefUtility.ts +46 -0
  161. package/project/.sdk/tm/ts/src/utility/{OptionsUtility.ts → MakeOptionsUtility.ts} +32 -7
  162. package/project/.sdk/tm/ts/src/utility/MakeRequestUtility.ts +66 -0
  163. package/project/.sdk/tm/ts/src/utility/MakeResponseUtility.ts +61 -0
  164. package/project/.sdk/tm/ts/src/utility/MakeResultUtility.ts +56 -0
  165. package/project/.sdk/tm/ts/src/utility/MakeSpecUtility.ts +61 -0
  166. package/project/.sdk/tm/ts/src/utility/MakeTargetUtility.ts +76 -0
  167. package/project/.sdk/tm/ts/src/utility/MakeUrlUtility.ts +61 -0
  168. package/project/.sdk/tm/ts/src/utility/{FindparamUtility.ts → ParamUtility.ts} +28 -8
  169. package/project/.sdk/tm/ts/src/utility/{AuthUtility.ts → PrepareAuthUtility.ts} +10 -4
  170. package/project/.sdk/tm/ts/src/utility/PrepareBodyUtility.ts +32 -0
  171. package/project/.sdk/tm/ts/src/utility/{HeadersUtility.ts → PrepareHeadersUtility.ts} +5 -7
  172. package/project/.sdk/tm/ts/src/utility/{MethodUtility.ts → PrepareMethodUtility.ts} +6 -6
  173. package/project/.sdk/tm/ts/src/utility/PrepareParamsUtility.ts +37 -0
  174. package/project/.sdk/tm/ts/src/utility/PreparePathUtility.ts +17 -0
  175. package/project/.sdk/tm/ts/src/utility/PrepareQueryUtility.ts +30 -0
  176. package/project/.sdk/tm/ts/src/utility/{ResbasicUtility.ts → ResultBasicUtility.ts} +12 -7
  177. package/project/.sdk/tm/ts/src/utility/ResultBodyUtility.ts +22 -0
  178. package/project/.sdk/tm/ts/src/utility/ResultHeadersUtility.ts +26 -0
  179. package/project/.sdk/tm/ts/src/utility/StructUtility.ts +1113 -525
  180. package/project/.sdk/tm/ts/src/utility/{ReqformUtility.ts → TransformRequestUtility.ts} +9 -7
  181. package/project/.sdk/tm/ts/src/utility/{ResformUtility.ts → TransformResponseUtility.ts} +11 -8
  182. package/project/.sdk/tm/ts/src/utility/Utility.ts +52 -65
  183. package/project/.sdk/tm/ts/test/exists.test.ts +0 -1
  184. package/project/.sdk/tm/ts/test/runner.ts +36 -13
  185. package/project/.sdk/tm/ts/test/utility/Custom.test.ts +30 -29
  186. package/project/.sdk/tm/ts/test/utility/PrimaryUtility.test.ts +385 -168
  187. package/project/.sdk/tm/ts/test/utility/StructUtility.test.ts +433 -189
  188. package/src/action/action.ts +1 -2
  189. package/src/action/feature.ts +7 -2
  190. package/src/action/target.ts +7 -7
  191. package/src/cmp/Entity.ts +7 -1
  192. package/src/cmp/Feature.ts +11 -9
  193. package/src/cmp/FeatureHook.ts +6 -1
  194. package/src/cmp/Main.ts +12 -2
  195. package/src/cmp/ReadmeEntity.ts +6 -1
  196. package/src/cmp/Test.ts +31 -0
  197. package/src/sdkgen.ts +19 -34
  198. package/src/types.ts +10 -1
  199. package/project/.sdk/src/cmp/ts/EntityTest_ts.ts +0 -180
  200. package/project/.sdk/tm/ts/src/utility/BodyUtility.ts +0 -29
  201. package/project/.sdk/tm/ts/src/utility/ContextUtility.ts +0 -67
  202. package/project/.sdk/tm/ts/src/utility/FullurlUtility.ts +0 -46
  203. package/project/.sdk/tm/ts/src/utility/InitfeatureUtility.ts +0 -13
  204. package/project/.sdk/tm/ts/src/utility/JoinurlUtility.ts +0 -15
  205. package/project/.sdk/tm/ts/src/utility/OperatorUtility.ts +0 -90
  206. package/project/.sdk/tm/ts/src/utility/ParamsUtility.ts +0 -37
  207. package/project/.sdk/tm/ts/src/utility/QueryUtility.ts +0 -27
  208. package/project/.sdk/tm/ts/src/utility/RequestUtility.ts +0 -66
  209. package/project/.sdk/tm/ts/src/utility/ResbodyUtility.ts +0 -19
  210. package/project/.sdk/tm/ts/src/utility/ResheadersUtility.ts +0 -23
  211. package/project/.sdk/tm/ts/src/utility/ResponseUtility.ts +0 -30
  212. package/project/.sdk/tm/ts/src/utility/ResultUtility.ts +0 -36
  213. package/project/.sdk/tm/ts/src/utility/SpecUtility.ts +0 -61
@@ -1,14 +1,28 @@
1
1
 
2
2
  import {
3
- cmp, omap, each, cmap,
4
- File, Content,
3
+ Content,
4
+ File,
5
+ cmp,
6
+ each,
7
+ omap,
5
8
  } from '@voxgig/sdkgen'
6
9
 
7
10
 
11
+ import {
12
+ KIT,
13
+ Model,
14
+ getModelPath,
15
+ nom,
16
+ } from '@voxgig/apidef'
17
+
8
18
 
9
19
  const Package = cmp(async function Package(props: any) {
10
- const { target, ctx$: { model } } = props
11
- const { main: { sdk: { feature } } } = model
20
+ const ctx$ = props.ctx$
21
+ const target = props.target
22
+
23
+ const model: Model = ctx$.model
24
+
25
+ const feature = getModelPath(model, `main.${KIT}.feature`)
12
26
 
13
27
  const only = (kind: string, deps: any) =>
14
28
  omap(deps, ([k, v]: any) => [v.active && kind === v.kind ? k : undefined, v.version])
@@ -18,7 +32,9 @@ const Package = cmp(async function Package(props: any) {
18
32
  each(feature, (feature: any) =>
19
33
  omap(feature.deps?.[target.name], ([k, v]: any) =>
20
34
  [v.active ? k : undefined, v]))
35
+
21
36
  // TODO: sort by version; rules for version choice?
37
+ // TODO: non-node dep kinds
22
38
  .reduce((a: any, deps: any) => (each(deps, (dep: any) =>
23
39
  a[dep.kind][dep.key$] = dep.version), a),
24
40
  {
@@ -28,6 +44,7 @@ const Package = cmp(async function Package(props: any) {
28
44
  })
29
45
 
30
46
  const sdkname = model.name
47
+ const SdkName = nom(model, 'Name')
31
48
  const origin = null == model.origin ? '' : `@${model.origin}/`
32
49
  const sdknamesuffix = model.origin?.endsWith('-sdk') ? '' : '-sdk'
33
50
 
@@ -36,13 +53,13 @@ const Package = cmp(async function Package(props: any) {
36
53
  name: `${origin}${sdkname}${sdknamesuffix}`,
37
54
  version: `0.0.1`,
38
55
  description: 'DESCRIPTION',
39
- main: `dist/${model.const.Name}SDK.js`,
56
+ main: `dist/${SdkName}SDK.js`,
40
57
  type: 'commonjs',
41
- types: `dist/${model.const.Name}SDK.d.ts`,
58
+ types: `dist/${SdkName}SDK.d.ts`,
42
59
  scripts: {
43
- 'test': 'node --enable-source-maps --test dist-test/**/*.test.js',
44
- 'test-some': 'node --enable-source-maps ' +
45
- '--test-name-pattern=\"$npm_config_pattern\" --test dist-test/**/*.test.js',
60
+ 'test': 'node --enable-source-maps --test \'dist-test/**/*.test.js\'',
61
+ 'test-some': 'node --enable-source-maps --experimental-test-isolation=none ' +
62
+ '--test-name-pattern=\"$TEST_PATTERN\" --test \'dist-test/**/*.test.js\'',
46
63
  'test-utility': 'node --enable-source-maps --test test/utility/*.test.ts',
47
64
 
48
65
  "watch": "tsc --build src test -w",
@@ -50,14 +67,16 @@ const Package = cmp(async function Package(props: any) {
50
67
  "clean": "rm -rf node_modules yarn.lock package-lock.json",
51
68
  "reset": "npm run clean && npm i && npm run build && npm test",
52
69
  },
53
- author: `${model.const.Name}`,
70
+ author: `${SdkName}`,
71
+
72
+ // TODO: needs to be config
54
73
  license: 'MIT',
74
+
55
75
  dependencies: deps.prod,
56
76
  peerDependencies: deps.peer,
57
77
  devDependencies: deps.dev,
58
78
  }
59
79
 
60
-
61
80
  File({ name: 'package.json' }, () => {
62
81
  Content(JSON.stringify(pkg, null, 2))
63
82
  })
@@ -0,0 +1,42 @@
1
+
2
+ import * as Path from 'node:path'
3
+
4
+
5
+ import {
6
+ File,
7
+ Fragment,
8
+ cmp,
9
+ } from '@voxgig/sdkgen'
10
+
11
+
12
+ import {
13
+ Model,
14
+ } from '@voxgig/apidef'
15
+
16
+
17
+
18
+
19
+ const SdkError = cmp(async function SdkError(props: any) {
20
+ const ctx$ = props.ctx$
21
+ const target = props.target
22
+
23
+ const model: Model = ctx$.model
24
+
25
+ const ff = Path.normalize(__dirname + '/../../../src/cmp/ts/fragment/')
26
+
27
+ File({ name: model.const.Name + 'Error.' + target.ext }, () => {
28
+
29
+ Fragment({
30
+ from: ff + 'SdkError.fragment.ts',
31
+
32
+ replace: {
33
+ ...ctx$.stdrep,
34
+ }
35
+ })
36
+ })
37
+ })
38
+
39
+
40
+ export {
41
+ SdkError
42
+ }
@@ -0,0 +1,288 @@
1
+
2
+ import {
3
+ nom,
4
+ } from '@voxgig/apidef'
5
+
6
+
7
+ import {
8
+ Content,
9
+ File,
10
+ Folder,
11
+ Fragment,
12
+ Slot,
13
+ cmp,
14
+ } from '@voxgig/sdkgen'
15
+
16
+
17
+ import {
18
+ projectPath
19
+ } from './utility_ts'
20
+
21
+
22
+ const TestDirect = cmp(function TestDirect(props: any) {
23
+ const ctx$ = props.ctx$
24
+ const model = ctx$.model
25
+ const stdrep = ctx$.stdrep
26
+
27
+ const target = props.target
28
+ const entity = props.entity
29
+
30
+ const ff = projectPath('src/cmp/ts/fragment/')
31
+
32
+ const PROJECTNAME = model.Name.toUpperCase()
33
+ const entidEnvVar = `${PROJECTNAME}_TEST_${entity.Name.toUpperCase()}_ENTID`
34
+
35
+ const opnames = Object.keys(entity.op)
36
+ const hasLoad = opnames.includes('load')
37
+ const hasList = opnames.includes('list')
38
+
39
+ if (!hasLoad && !hasList) {
40
+ return
41
+ }
42
+
43
+ Folder({ name: entity.name }, () => {
44
+
45
+ File({ name: nom(entity, 'Name') + 'Direct.test.' + target.name }, () => {
46
+
47
+ Fragment({
48
+ from: ff + 'Direct.test.fragment.ts',
49
+ replace: {
50
+ SdkName: nom(model.const, 'Name'),
51
+ EntityName: nom(entity, 'Name'),
52
+ entityname: entity.name,
53
+ ...stdrep,
54
+ }
55
+ }, () => {
56
+
57
+
58
+ Slot({ name: 'directSetup' }, () => {
59
+ Content(`
60
+ function directSetup(mockres?: any) {
61
+ const calls: any[] = []
62
+
63
+ const env = envOverride({
64
+ '${entidEnvVar}': {},
65
+ '${PROJECTNAME}_TEST_LIVE': 'FALSE',
66
+ '${PROJECTNAME}_APIKEY': 'NONE',
67
+ })
68
+
69
+ const live = 'TRUE' === env.${PROJECTNAME}_TEST_LIVE
70
+
71
+ if (live) {
72
+ const client = new ${nom(model.const, 'Name')}SDK({
73
+ apikey: env.${PROJECTNAME}_APIKEY,
74
+ })
75
+
76
+ let idmap: any = env['${entidEnvVar}']
77
+ if ('string' === typeof idmap && idmap.startsWith('{')) {
78
+ idmap = JSON.parse(idmap)
79
+ }
80
+
81
+ return { client, calls, live, idmap }
82
+ }
83
+
84
+ const mockFetch = async (url: string, init: any) => {
85
+ calls.push({ url, init })
86
+ return {
87
+ status: 200,
88
+ statusText: 'OK',
89
+ headers: {},
90
+ json: async () => (null != mockres ? mockres : { id: 'direct01' }),
91
+ }
92
+ }
93
+
94
+ const client = new ${nom(model.const, 'Name')}SDK({
95
+ base: 'http://localhost:8080',
96
+ system: { fetch: mockFetch },
97
+ })
98
+
99
+ return { client, calls, live, idmap: {} as any }
100
+ }
101
+ `)
102
+ })
103
+
104
+
105
+ Slot({ name: 'direct' }, () => {
106
+
107
+ if (hasLoad) {
108
+ generateDirectLoad(model, entity)
109
+ }
110
+
111
+ if (hasList) {
112
+ generateDirectList(model, entity)
113
+ }
114
+ })
115
+
116
+ })
117
+ })
118
+ })
119
+ })
120
+
121
+
122
+ function generateDirectLoad(model: any, entity: any) {
123
+ const loadOp = entity.op.load
124
+ const loadTarget = loadOp.targets[0]
125
+
126
+ if (null == loadTarget) {
127
+ return
128
+ }
129
+
130
+ const loadPath = (loadTarget.parts || []).join('/')
131
+ const loadParams = loadTarget.args?.params || []
132
+
133
+ // Get list info for live mode bootstrapping
134
+ const listOp = entity.op.list
135
+ const listTarget = listOp?.targets?.[0]
136
+ const listPath = listTarget ? (listTarget.parts || []).join('/') : ''
137
+ const listParams = listTarget?.args?.params || []
138
+ const hasList = null != listTarget
139
+
140
+ // Ancestor params (not 'id') for live mode
141
+ const ancestorParams = loadParams.filter((p: any) => p.name !== 'id')
142
+
143
+ const paramAsserts = loadParams.map((p: any, i: number) =>
144
+ ' assert(calls[0].url.includes(\'direct0' + (i + 1) + '\'))\n').join('')
145
+
146
+ // Build live list params
147
+ const liveListParams = listParams.map((p: any) => {
148
+ const key = p.name === 'id'
149
+ ? entity.name + '01'
150
+ : p.name.replace(/_id$/, '') + '01'
151
+ return { name: p.name, key }
152
+ })
153
+
154
+ // Build live ancestor params for load
155
+ const liveAncestorParams = ancestorParams.map((p: any) => {
156
+ const key = p.name.replace(/_id$/, '') + '01'
157
+ return { name: p.name, key }
158
+ })
159
+
160
+ let liveParamsBlock = ''
161
+ if (hasList) {
162
+ const listParamLines = liveListParams.map((lp: any) =>
163
+ ` ${lp.name}: setup.idmap['${lp.key}'],`).join('\n')
164
+ const ancestorParamLines = liveAncestorParams.map((lp: any) =>
165
+ ` params.${lp.name} = setup.idmap['${lp.key}']`).join('\n')
166
+
167
+ liveParamsBlock = ` if (setup.live) {
168
+ const listResult: any = await client.direct({
169
+ path: '${listPath}',
170
+ method: 'GET',
171
+ params: {
172
+ ${listParamLines}
173
+ },
174
+ })
175
+ assert(listResult.ok === true)
176
+ const listData = listResult.data
177
+ if (!Array.isArray(listData) || listData.length === 0) {
178
+ return // skip: no entities to load in live mode
179
+ }
180
+ params.id = listData[0].id
181
+ ${ancestorParamLines}
182
+ } else {
183
+ ${loadParams.map((p: any, i: number) => ` params.${p.name} = 'direct0${i + 1}'`).join('\n')}
184
+ }`
185
+ } else {
186
+ liveParamsBlock = ` if (!setup.live) {
187
+ ${loadParams.map((p: any, i: number) => ` params.${p.name} = 'direct0${i + 1}'`).join('\n')}
188
+ }`
189
+ }
190
+
191
+ Content(`
192
+ test('direct-load-${entity.name}', async () => {
193
+ const setup = directSetup({ id: 'direct01' })
194
+ const { client, calls } = setup
195
+
196
+ const params: any = {}
197
+ ${liveParamsBlock}
198
+
199
+ const result: any = await client.direct({
200
+ path: '${loadPath}',
201
+ method: 'GET',
202
+ params,
203
+ })
204
+
205
+ assert(result.ok === true)
206
+ assert(result.status === 200)
207
+ assert(null != result.data)
208
+
209
+ if (!setup.live) {
210
+ assert(result.data.id === 'direct01')
211
+ assert(calls.length === 1)
212
+ assert(calls[0].init.method === 'GET')
213
+ ${paramAsserts} }
214
+ })
215
+ `)
216
+ }
217
+
218
+
219
+ function generateDirectList(model: any, entity: any) {
220
+ const listOp = entity.op.list
221
+ const listTarget = listOp.targets[0]
222
+
223
+ if (null == listTarget) {
224
+ return
225
+ }
226
+
227
+ const listPath = (listTarget.parts || []).join('/')
228
+ const listParams = listTarget.args?.params || []
229
+
230
+ // Build live params
231
+ const liveParams = 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
+ const paramAsserts = listParams.map((p: any, i: number) =>
239
+ ' assert(calls[0].url.includes(\'direct0' + (i + 1) + '\'))\n').join('')
240
+
241
+ let paramsBlock = ''
242
+ if (listParams.length > 0) {
243
+ const liveLines = liveParams.map((lp: any) =>
244
+ ` params.${lp.name} = setup.idmap['${lp.key}']`).join('\n')
245
+ const mockLines = listParams.map((p: any, i: number) =>
246
+ ` params.${p.name} = 'direct0${i + 1}'`).join('\n')
247
+
248
+ paramsBlock = ` const params: any = {}
249
+ if (setup.live) {
250
+ ${liveLines}
251
+ } else {
252
+ ${mockLines}
253
+ }
254
+ `
255
+ } else {
256
+ paramsBlock = ` const params: any = {}
257
+ `
258
+ }
259
+
260
+ Content(`
261
+ test('direct-list-${entity.name}', async () => {
262
+ const setup = directSetup([{ id: 'direct01' }, { id: 'direct02' }])
263
+ const { client, calls } = setup
264
+
265
+ ${paramsBlock}
266
+ const result: any = await client.direct({
267
+ path: '${listPath}',
268
+ method: 'GET',
269
+ params,
270
+ })
271
+
272
+ assert(result.ok === true)
273
+ assert(result.status === 200)
274
+ assert(Array.isArray(result.data))
275
+
276
+ if (!setup.live) {
277
+ assert(result.data.length === 2)
278
+ assert(calls.length === 1)
279
+ assert(calls[0].init.method === 'GET')
280
+ ${paramAsserts} }
281
+ })
282
+ `)
283
+ }
284
+
285
+
286
+ export {
287
+ TestDirect
288
+ }