@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.
Files changed (300) hide show
  1. package/.sdk/model/target/dart.aon +63 -0
  2. package/.sdk/model/target/haskell.aon +72 -0
  3. package/.sdk/model/target/lean.aon +91 -0
  4. package/.sdk/src/cmp/dart/Config_dart.ts +248 -0
  5. package/.sdk/src/cmp/dart/EntityBase_dart.ts +34 -0
  6. package/.sdk/src/cmp/dart/EntityOperation_dart.ts +43 -0
  7. package/.sdk/src/cmp/dart/EntityTypes_dart.ts +207 -0
  8. package/.sdk/src/cmp/dart/Entity_dart.ts +87 -0
  9. package/.sdk/src/cmp/dart/Gitignore_dart.ts +34 -0
  10. package/.sdk/src/cmp/dart/MainEntity_dart.ts +33 -0
  11. package/.sdk/src/cmp/dart/Main_dart.ts +178 -0
  12. package/.sdk/src/cmp/dart/Package_dart.ts +82 -0
  13. package/.sdk/src/cmp/dart/ReadmeEntity_dart.ts +177 -0
  14. package/.sdk/src/cmp/dart/ReadmeExamplesTest_dart.ts +238 -0
  15. package/.sdk/src/cmp/dart/ReadmeExplanation_dart.ts +53 -0
  16. package/.sdk/src/cmp/dart/ReadmeHowto_dart.ts +152 -0
  17. package/.sdk/src/cmp/dart/ReadmeInstall_dart.ts +59 -0
  18. package/.sdk/src/cmp/dart/ReadmeIntro_dart.ts +65 -0
  19. package/.sdk/src/cmp/dart/ReadmeModel_dart.ts +151 -0
  20. package/.sdk/src/cmp/dart/ReadmeOptions_dart.ts +63 -0
  21. package/.sdk/src/cmp/dart/ReadmeQuick_dart.ts +225 -0
  22. package/.sdk/src/cmp/dart/ReadmeRef_dart.ts +397 -0
  23. package/.sdk/src/cmp/dart/ReadmeTopHowto_dart.ts +24 -0
  24. package/.sdk/src/cmp/dart/ReadmeTopQuick_dart.ts +106 -0
  25. package/.sdk/src/cmp/dart/ReadmeTopTest_dart.ts +78 -0
  26. package/.sdk/src/cmp/dart/SdkError_dart.ts +42 -0
  27. package/.sdk/src/cmp/dart/TestDirect_dart.ts +516 -0
  28. package/.sdk/src/cmp/dart/TestEntity_dart.ts +628 -0
  29. package/.sdk/src/cmp/dart/Test_dart.ts +138 -0
  30. package/.sdk/src/cmp/dart/fragment/Config.data.fragment.dart +98 -0
  31. package/.sdk/src/cmp/dart/fragment/Config.fragment.dart +70 -0
  32. package/.sdk/src/cmp/dart/fragment/Direct.test.fragment.dart +25 -0
  33. package/.sdk/src/cmp/dart/fragment/Entity.fragment.dart +29 -0
  34. package/.sdk/src/cmp/dart/fragment/Entity.test.fragment.dart +28 -0
  35. package/.sdk/src/cmp/dart/fragment/EntityBase.fragment.dart +302 -0
  36. package/.sdk/src/cmp/dart/fragment/EntityCreateOp.fragment.dart +98 -0
  37. package/.sdk/src/cmp/dart/fragment/EntityListOp.fragment.dart +90 -0
  38. package/.sdk/src/cmp/dart/fragment/EntityLoadOp.fragment.dart +102 -0
  39. package/.sdk/src/cmp/dart/fragment/EntityRemoveOp.fragment.dart +108 -0
  40. package/.sdk/src/cmp/dart/fragment/EntityUpdateOp.fragment.dart +102 -0
  41. package/.sdk/src/cmp/dart/fragment/Main.fragment.dart +339 -0
  42. package/.sdk/src/cmp/dart/fragment/SdkError.fragment.dart +26 -0
  43. package/.sdk/src/cmp/dart/tsconfig.json +15 -0
  44. package/.sdk/src/cmp/dart/utility_dart.ts +155 -0
  45. package/.sdk/src/cmp/haskell/Config_haskell.ts +98 -0
  46. package/.sdk/src/cmp/haskell/Entity_haskell.ts +13 -0
  47. package/.sdk/src/cmp/haskell/Gitignore_haskell.ts +27 -0
  48. package/.sdk/src/cmp/haskell/Main_haskell.ts +123 -0
  49. package/.sdk/src/cmp/haskell/Package_haskell.ts +60 -0
  50. package/.sdk/src/cmp/haskell/ReadmeEntity_haskell.ts +186 -0
  51. package/.sdk/src/cmp/haskell/ReadmeExamplesTest_haskell.ts +135 -0
  52. package/.sdk/src/cmp/haskell/ReadmeExplanation_haskell.ts +48 -0
  53. package/.sdk/src/cmp/haskell/ReadmeHowto_haskell.ts +168 -0
  54. package/.sdk/src/cmp/haskell/ReadmeInstall_haskell.ts +51 -0
  55. package/.sdk/src/cmp/haskell/ReadmeIntro_haskell.ts +67 -0
  56. package/.sdk/src/cmp/haskell/ReadmeModel_haskell.ts +162 -0
  57. package/.sdk/src/cmp/haskell/ReadmeOptions_haskell.ts +74 -0
  58. package/.sdk/src/cmp/haskell/ReadmeQuick_haskell.ts +241 -0
  59. package/.sdk/src/cmp/haskell/ReadmeRef_haskell.ts +408 -0
  60. package/.sdk/src/cmp/haskell/ReadmeTopHowto_haskell.ts +31 -0
  61. package/.sdk/src/cmp/haskell/ReadmeTopQuick_haskell.ts +104 -0
  62. package/.sdk/src/cmp/haskell/ReadmeTopTest_haskell.ts +80 -0
  63. package/.sdk/src/cmp/haskell/Test_haskell.ts +297 -0
  64. package/.sdk/src/cmp/haskell/tsconfig.json +15 -0
  65. package/.sdk/src/cmp/haskell/utility_haskell.ts +166 -0
  66. package/.sdk/src/cmp/lean/Config_lean.ts +93 -0
  67. package/.sdk/src/cmp/lean/Entity_lean.ts +9 -0
  68. package/.sdk/src/cmp/lean/Gitignore_lean.ts +18 -0
  69. package/.sdk/src/cmp/lean/Main_lean.ts +120 -0
  70. package/.sdk/src/cmp/lean/Package_lean.ts +93 -0
  71. package/.sdk/src/cmp/lean/ReadmeEntity_lean.ts +29 -0
  72. package/.sdk/src/cmp/lean/ReadmeExplanation_lean.ts +19 -0
  73. package/.sdk/src/cmp/lean/ReadmeHowto_lean.ts +25 -0
  74. package/.sdk/src/cmp/lean/ReadmeInstall_lean.ts +39 -0
  75. package/.sdk/src/cmp/lean/ReadmeIntro_lean.ts +25 -0
  76. package/.sdk/src/cmp/lean/ReadmeModel_lean.ts +24 -0
  77. package/.sdk/src/cmp/lean/ReadmeOptions_lean.ts +22 -0
  78. package/.sdk/src/cmp/lean/ReadmeQuick_lean.ts +50 -0
  79. package/.sdk/src/cmp/lean/ReadmeRef_lean.ts +40 -0
  80. package/.sdk/src/cmp/lean/ReadmeTopHowto_lean.ts +16 -0
  81. package/.sdk/src/cmp/lean/ReadmeTopQuick_lean.ts +23 -0
  82. package/.sdk/src/cmp/lean/ReadmeTopTest_lean.ts +19 -0
  83. package/.sdk/src/cmp/lean/Test_lean.ts +261 -0
  84. package/.sdk/src/cmp/lean/utility_lean.ts +129 -0
  85. package/.sdk/tm/dart/LICENSE +22 -0
  86. package/.sdk/tm/dart/Makefile +50 -0
  87. package/.sdk/tm/dart/lib/Context.dart +150 -0
  88. package/.sdk/tm/dart/lib/Control.dart +15 -0
  89. package/.sdk/tm/dart/lib/Operation.dart +31 -0
  90. package/.sdk/tm/dart/lib/Point.dart +51 -0
  91. package/.sdk/tm/dart/lib/Response.dart +32 -0
  92. package/.sdk/tm/dart/lib/Result.dart +39 -0
  93. package/.sdk/tm/dart/lib/Spec.dart +49 -0
  94. package/.sdk/tm/dart/lib/feature/audit/AuditFeature.dart +103 -0
  95. package/.sdk/tm/dart/lib/feature/base/BaseFeature.dart +76 -0
  96. package/.sdk/tm/dart/lib/feature/cache/CacheFeature.dart +152 -0
  97. package/.sdk/tm/dart/lib/feature/clienttrack/ClienttrackFeature.dart +104 -0
  98. package/.sdk/tm/dart/lib/feature/cost/CostFeature.dart +446 -0
  99. package/.sdk/tm/dart/lib/feature/debug/DebugFeature.dart +153 -0
  100. package/.sdk/tm/dart/lib/feature/idempotency/IdempotencyFeature.dart +92 -0
  101. package/.sdk/tm/dart/lib/feature/log/LogFeature.dart +85 -0
  102. package/.sdk/tm/dart/lib/feature/metrics/MetricsFeature.dart +103 -0
  103. package/.sdk/tm/dart/lib/feature/netsim/NetsimFeature.dart +186 -0
  104. package/.sdk/tm/dart/lib/feature/paging/PagingFeature.dart +240 -0
  105. package/.sdk/tm/dart/lib/feature/proxy/ProxyFeature.dart +118 -0
  106. package/.sdk/tm/dart/lib/feature/ratelimit/RatelimitFeature.dart +103 -0
  107. package/.sdk/tm/dart/lib/feature/rbac/RbacFeature.dart +121 -0
  108. package/.sdk/tm/dart/lib/feature/retry/RetryFeature.dart +155 -0
  109. package/.sdk/tm/dart/lib/feature/secrets/SecretsFeature.dart +649 -0
  110. package/.sdk/tm/dart/lib/feature/secrets/plugin/capability.dart +105 -0
  111. package/.sdk/tm/dart/lib/feature/secrets/plugin/catalog.dart +46 -0
  112. package/.sdk/tm/dart/lib/feature/secrets/plugin/config.dart +297 -0
  113. package/.sdk/tm/dart/lib/feature/secrets/plugin/depend.dart +198 -0
  114. package/.sdk/tm/dart/lib/feature/secrets/plugin/env.dart +144 -0
  115. package/.sdk/tm/dart/lib/feature/secrets/plugin/export.dart +58 -0
  116. package/.sdk/tm/dart/lib/feature/secrets/plugin/graph.dart +160 -0
  117. package/.sdk/tm/dart/lib/feature/secrets/plugin/host.dart +1067 -0
  118. package/.sdk/tm/dart/lib/feature/secrets/plugin/order.dart +172 -0
  119. package/.sdk/tm/dart/lib/feature/secrets/plugin/plugin.dart +23 -0
  120. package/.sdk/tm/dart/lib/feature/secrets/plugin/point.dart +117 -0
  121. package/.sdk/tm/dart/lib/feature/secrets/plugin/ref.dart +105 -0
  122. package/.sdk/tm/dart/lib/feature/secrets/plugin/resolve.dart +58 -0
  123. package/.sdk/tm/dart/lib/feature/secrets/plugin/types.dart +201 -0
  124. package/.sdk/tm/dart/lib/feature/secrets/plugin/version.dart +116 -0
  125. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/aws.dart +285 -0
  126. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/azuresecrets.dart +178 -0
  127. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/boru.dart +145 -0
  128. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/crypto.dart +194 -0
  129. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/doppler.dart +101 -0
  130. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/gcpsecrets.dart +143 -0
  131. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/hashicorp.dart +190 -0
  132. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/httpjson.dart +363 -0
  133. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/infisical.dart +149 -0
  134. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/onepassword.dart +146 -0
  135. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/secretspec.dart +116 -0
  136. package/.sdk/tm/dart/lib/feature/secrets/sekreto/plugins/sigv4.dart +237 -0
  137. package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/addr.dart +138 -0
  138. package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/json.dart +276 -0
  139. package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/provider.dart +31 -0
  140. package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/providers.dart +243 -0
  141. package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/sekreto.dart +730 -0
  142. package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/spec.dart +200 -0
  143. package/.sdk/tm/dart/lib/feature/secrets/sekreto/src/support.dart +217 -0
  144. package/.sdk/tm/dart/lib/feature/streaming/StreamingFeature.dart +97 -0
  145. package/.sdk/tm/dart/lib/feature/telemetry/TelemetryFeature.dart +136 -0
  146. package/.sdk/tm/dart/lib/feature/test/TestFeature.dart +328 -0
  147. package/.sdk/tm/dart/lib/feature/timeout/TimeoutFeature.dart +104 -0
  148. package/.sdk/tm/dart/lib/utility/CleanUtility.dart +12 -0
  149. package/.sdk/tm/dart/lib/utility/DoneUtility.dart +18 -0
  150. package/.sdk/tm/dart/lib/utility/ErrUtility.dart +46 -0
  151. package/.sdk/tm/dart/lib/utility/FeatureAddUtility.dart +35 -0
  152. package/.sdk/tm/dart/lib/utility/FeatureHookUtility.dart +20 -0
  153. package/.sdk/tm/dart/lib/utility/FeatureInitUtility.dart +9 -0
  154. package/.sdk/tm/dart/lib/utility/FetcherUtility.dart +104 -0
  155. package/.sdk/tm/dart/lib/utility/GraphqlUtility.dart +162 -0
  156. package/.sdk/tm/dart/lib/utility/MakeContextUtility.dart +6 -0
  157. package/.sdk/tm/dart/lib/utility/MakeErrorUtility.dart +71 -0
  158. package/.sdk/tm/dart/lib/utility/MakeFetchDefUtility.dart +42 -0
  159. package/.sdk/tm/dart/lib/utility/MakeOptionsUtility.dart +233 -0
  160. package/.sdk/tm/dart/lib/utility/MakePointUtility.dart +130 -0
  161. package/.sdk/tm/dart/lib/utility/MakeRequestUtility.dart +66 -0
  162. package/.sdk/tm/dart/lib/utility/MakeResponseUtility.dart +59 -0
  163. package/.sdk/tm/dart/lib/utility/MakeResultUtility.dart +49 -0
  164. package/.sdk/tm/dart/lib/utility/MakeSpecUtility.dart +77 -0
  165. package/.sdk/tm/dart/lib/utility/MakeUrlUtility.dart +51 -0
  166. package/.sdk/tm/dart/lib/utility/ParamUtility.dart +56 -0
  167. package/.sdk/tm/dart/lib/utility/PrepareAuthUtility.dart +46 -0
  168. package/.sdk/tm/dart/lib/utility/PrepareBodyUtility.dart +19 -0
  169. package/.sdk/tm/dart/lib/utility/PrepareHeadersUtility.dart +11 -0
  170. package/.sdk/tm/dart/lib/utility/PrepareMethodUtility.dart +30 -0
  171. package/.sdk/tm/dart/lib/utility/PrepareParamsUtility.dart +23 -0
  172. package/.sdk/tm/dart/lib/utility/PreparePathUtility.dart +9 -0
  173. package/.sdk/tm/dart/lib/utility/PrepareQueryUtility.dart +18 -0
  174. package/.sdk/tm/dart/lib/utility/ResultBasicUtility.dart +29 -0
  175. package/.sdk/tm/dart/lib/utility/ResultBodyUtility.dart +15 -0
  176. package/.sdk/tm/dart/lib/utility/ResultHeadersUtility.dart +18 -0
  177. package/.sdk/tm/dart/lib/utility/StructUtility.dart +127 -0
  178. package/.sdk/tm/dart/lib/utility/TransformRequestUtility.dart +28 -0
  179. package/.sdk/tm/dart/lib/utility/TransformResponseUtility.dart +44 -0
  180. package/.sdk/tm/dart/lib/utility/Utility.dart +239 -0
  181. package/.sdk/tm/dart/lib/utility/voxgig_struct.dart +2462 -0
  182. package/.sdk/tm/dart/src/feature/README.md +3 -0
  183. package/.sdk/tm/dart/src/feature/audit/.gitkeep +0 -0
  184. package/.sdk/tm/dart/src/feature/base/.gitkeep +0 -0
  185. package/.sdk/tm/dart/src/feature/cache/.gitkeep +0 -0
  186. package/.sdk/tm/dart/src/feature/clienttrack/.gitkeep +0 -0
  187. package/.sdk/tm/dart/src/feature/cost/.gitkeep +0 -0
  188. package/.sdk/tm/dart/src/feature/debug/.gitkeep +0 -0
  189. package/.sdk/tm/dart/src/feature/idempotency/.gitkeep +0 -0
  190. package/.sdk/tm/dart/src/feature/log/.gitkeep +0 -0
  191. package/.sdk/tm/dart/src/feature/metrics/.gitkeep +0 -0
  192. package/.sdk/tm/dart/src/feature/netsim/.gitkeep +0 -0
  193. package/.sdk/tm/dart/src/feature/paging/.gitkeep +0 -0
  194. package/.sdk/tm/dart/src/feature/proxy/.gitkeep +0 -0
  195. package/.sdk/tm/dart/src/feature/ratelimit/.gitkeep +0 -0
  196. package/.sdk/tm/dart/src/feature/rbac/.gitkeep +0 -0
  197. package/.sdk/tm/dart/src/feature/retry/.gitkeep +0 -0
  198. package/.sdk/tm/dart/src/feature/secrets/.gitkeep +0 -0
  199. package/.sdk/tm/dart/src/feature/streaming/.gitkeep +0 -0
  200. package/.sdk/tm/dart/src/feature/telemetry/.gitkeep +0 -0
  201. package/.sdk/tm/dart/src/feature/test/.gitkeep +0 -0
  202. package/.sdk/tm/dart/src/feature/timeout/.gitkeep +0 -0
  203. package/.sdk/tm/dart/test/custom_test.dart +65 -0
  204. package/.sdk/tm/dart/test/exists_test.dart +12 -0
  205. package/.sdk/tm/dart/test/feature/harness.dart +347 -0
  206. package/.sdk/tm/dart/test/feature/secrets/secrets_test.dart +1107 -0
  207. package/.sdk/tm/dart/test/feature_test.dart +1193 -0
  208. package/.sdk/tm/dart/test/harness.dart +153 -0
  209. package/.sdk/tm/dart/test/netsim_test.dart +48 -0
  210. package/.sdk/tm/dart/test/omni.dart +520 -0
  211. package/.sdk/tm/dart/test/omni_smoke_test.dart +143 -0
  212. package/.sdk/tm/dart/test/pipeline_test.dart +608 -0
  213. package/.sdk/tm/dart/test/primary_test.dart +476 -0
  214. package/.sdk/tm/dart/test/sdk-test-control.json +19 -0
  215. package/.sdk/tm/dart/test/struct_test.dart +468 -0
  216. package/.sdk/tm/dart/test/utility.dart +198 -0
  217. package/.sdk/tm/dart/test/vendor/omni/omni.dart +7 -0
  218. package/.sdk/tm/dart/test/vendor/omni/runner.dart +653 -0
  219. package/.sdk/tm/dart/test/vendor/omni/util.dart +232 -0
  220. package/.sdk/tm/haskell/LICENSE +21 -0
  221. package/.sdk/tm/haskell/Makefile +22 -0
  222. package/.sdk/tm/haskell/VERSION +1 -0
  223. package/.sdk/tm/haskell/src/SdkFeatures.hs +1440 -0
  224. package/.sdk/tm/haskell/src/SdkHelpers.hs +337 -0
  225. package/.sdk/tm/haskell/src/SdkJson.hs +111 -0
  226. package/.sdk/tm/haskell/src/SdkRuntime.hs +1279 -0
  227. package/.sdk/tm/haskell/src/SdkTypes.hs +195 -0
  228. package/.sdk/tm/haskell/src/VoxgigStruct.hs +2299 -0
  229. package/.sdk/tm/haskell/src/Vregex.hs +237 -0
  230. package/.sdk/tm/haskell/src/feature/README.md +5 -0
  231. package/.sdk/tm/haskell/src/feature/audit/.gitkeep +0 -0
  232. package/.sdk/tm/haskell/src/feature/base/.gitkeep +0 -0
  233. package/.sdk/tm/haskell/src/feature/cache/.gitkeep +0 -0
  234. package/.sdk/tm/haskell/src/feature/clienttrack/.gitkeep +0 -0
  235. package/.sdk/tm/haskell/src/feature/debug/.gitkeep +0 -0
  236. package/.sdk/tm/haskell/src/feature/idempotency/.gitkeep +0 -0
  237. package/.sdk/tm/haskell/src/feature/log/.gitkeep +0 -0
  238. package/.sdk/tm/haskell/src/feature/metrics/.gitkeep +0 -0
  239. package/.sdk/tm/haskell/src/feature/netsim/.gitkeep +0 -0
  240. package/.sdk/tm/haskell/src/feature/paging/.gitkeep +0 -0
  241. package/.sdk/tm/haskell/src/feature/proxy/.gitkeep +0 -0
  242. package/.sdk/tm/haskell/src/feature/ratelimit/.gitkeep +0 -0
  243. package/.sdk/tm/haskell/src/feature/rbac/.gitkeep +0 -0
  244. package/.sdk/tm/haskell/src/feature/retry/.gitkeep +0 -0
  245. package/.sdk/tm/haskell/src/feature/streaming/.gitkeep +0 -0
  246. package/.sdk/tm/haskell/src/feature/telemetry/.gitkeep +0 -0
  247. package/.sdk/tm/haskell/src/feature/test/.gitkeep +0 -0
  248. package/.sdk/tm/haskell/src/feature/timeout/.gitkeep +0 -0
  249. package/.sdk/tm/haskell/test/Harness.hs +281 -0
  250. package/.sdk/tm/haskell/test/OmniResolver.hs +252 -0
  251. package/.sdk/tm/haskell/test/Runner.hs +49 -0
  252. package/.sdk/tm/haskell/test/StructCorpus.hs +449 -0
  253. package/.sdk/tm/haskell/test/TCustomUtility.hs +38 -0
  254. package/.sdk/tm/haskell/test/TFeature.hs +794 -0
  255. package/.sdk/tm/haskell/test/TNetsim.hs +50 -0
  256. package/.sdk/tm/haskell/test/TPipeline.hs +334 -0
  257. package/.sdk/tm/haskell/test/TPrimaryCorpus.hs +263 -0
  258. package/.sdk/tm/haskell/test/TPrimaryUtility.hs +386 -0
  259. package/.sdk/tm/haskell/test/Testutil.hs +59 -0
  260. package/.sdk/tm/haskell/test/vendor/omni/Omni.hs +1147 -0
  261. package/.sdk/tm/lean/LICENSE +21 -0
  262. package/.sdk/tm/lean/Makefile +32 -0
  263. package/.sdk/tm/lean/VERSION +1 -0
  264. package/.sdk/tm/lean/src/SdkFeature.lean +171 -0
  265. package/.sdk/tm/lean/src/SdkFeatures.lean +787 -0
  266. package/.sdk/tm/lean/src/SdkJson.lean +134 -0
  267. package/.sdk/tm/lean/src/SdkRuntime.lean +374 -0
  268. package/.sdk/tm/lean/src/SdkUtility.lean +809 -0
  269. package/.sdk/tm/lean/src/VoxgigStruct.lean +2880 -0
  270. package/.sdk/tm/lean/src/Vregex.lean +412 -0
  271. package/.sdk/tm/lean/src/feature/README.md +5 -0
  272. package/.sdk/tm/lean/src/feature/audit/.gitkeep +0 -0
  273. package/.sdk/tm/lean/src/feature/base/.gitkeep +0 -0
  274. package/.sdk/tm/lean/src/feature/cache/.gitkeep +0 -0
  275. package/.sdk/tm/lean/src/feature/clienttrack/.gitkeep +0 -0
  276. package/.sdk/tm/lean/src/feature/cost/.gitkeep +0 -0
  277. package/.sdk/tm/lean/src/feature/debug/.gitkeep +0 -0
  278. package/.sdk/tm/lean/src/feature/idempotency/.gitkeep +0 -0
  279. package/.sdk/tm/lean/src/feature/log/.gitkeep +0 -0
  280. package/.sdk/tm/lean/src/feature/metrics/.gitkeep +0 -0
  281. package/.sdk/tm/lean/src/feature/netsim/.gitkeep +0 -0
  282. package/.sdk/tm/lean/src/feature/paging/.gitkeep +0 -0
  283. package/.sdk/tm/lean/src/feature/proxy/.gitkeep +0 -0
  284. package/.sdk/tm/lean/src/feature/ratelimit/.gitkeep +0 -0
  285. package/.sdk/tm/lean/src/feature/rbac/.gitkeep +0 -0
  286. package/.sdk/tm/lean/src/feature/retry/.gitkeep +0 -0
  287. package/.sdk/tm/lean/src/feature/streaming/.gitkeep +0 -0
  288. package/.sdk/tm/lean/src/feature/telemetry/.gitkeep +0 -0
  289. package/.sdk/tm/lean/src/feature/test/.gitkeep +0 -0
  290. package/.sdk/tm/lean/src/feature/timeout/.gitkeep +0 -0
  291. package/.sdk/tm/lean/test/OmniResolver.lean +358 -0
  292. package/.sdk/tm/lean/test/OmniSmoke.lean +174 -0
  293. package/.sdk/tm/lean/test/StructCorpus.lean +368 -0
  294. package/.sdk/tm/lean/test/TFeature.lean +281 -0
  295. package/.sdk/tm/lean/test/TPrimaryUtility.lean +227 -0
  296. package/.sdk/tm/lean/test/vendor/omni/Omni.lean +997 -0
  297. package/LICENSE +21 -0
  298. package/README.md +104 -0
  299. package/package.json +78 -0
  300. package/sdkgen-package.json +22 -0
@@ -0,0 +1,2462 @@
1
+ // Copyright (c) 2025-2026 Voxgig Ltd. MIT LICENSE.
2
+ //
3
+ // Voxgig Struct — Dart port.
4
+ //
5
+ // A faithful port of the canonical TypeScript implementation
6
+ // (typescript/src/StructUtility.ts), following the same "by-example" design.
7
+ // Like the Python, Clojure and Lua ports, Dart has a single `null`, so the
8
+ // canonical `undefined` and JSON `null` are both represented by `null`; the
9
+ // Group A/B rules (design/UNDEF_SPEC.md) recover the distinction where it
10
+ // matters, and a private NOARG sentinel distinguishes "no argument supplied".
11
+ //
12
+ // Nodes are native Dart collections — `Map<String, dynamic>` (a LinkedHashMap,
13
+ // insertion-ordered) and growable `List<dynamic>` — which are mutable and
14
+ // reference-stable, exactly as the algorithm requires. The only regex used is
15
+ // the Dart core `RegExp`. There are no third-party runtime dependencies.
16
+
17
+ // ---------------------------------------------------------------------------
18
+ // Sentinels / constants
19
+ // ---------------------------------------------------------------------------
20
+
21
+ class _NoArg {
22
+ const _NoArg();
23
+ }
24
+
25
+ const _noarg = _NoArg();
26
+
27
+ /// Public alias for the "no argument supplied" sentinel, used by callers (e.g.
28
+ /// the test runner) to drive `pathify` with an *absent* value (not `null`).
29
+ const pathifyNoArg = _noarg;
30
+
31
+ class _Sentinel {
32
+ final String tag;
33
+ _Sentinel(this.tag);
34
+ }
35
+
36
+ final SKIP = _Sentinel('skip');
37
+ final DELETE = _Sentinel('delete');
38
+
39
+ const S_MKEYPRE = 'key:pre';
40
+ const S_MKEYPOST = 'key:post';
41
+ const S_MVAL = 'val';
42
+
43
+ const M_KEYPRE = 1;
44
+ const M_KEYPOST = 2;
45
+ const M_VAL = 4;
46
+
47
+ final Map<String, int> _MODE_TO_NUM = {
48
+ S_MKEYPRE: M_KEYPRE,
49
+ S_MKEYPOST: M_KEYPOST,
50
+ S_MVAL: M_VAL,
51
+ };
52
+
53
+ const MODENAME = {M_VAL: 'val', M_KEYPRE: 'key:pre', M_KEYPOST: 'key:post'};
54
+
55
+ const S_DKEY = '\$KEY';
56
+ const S_BANNO = '`\$ANNO`';
57
+ const S_DTOP = '\$TOP';
58
+ const S_DERRS = '\$ERRS';
59
+ const S_DSPEC = '\$SPEC';
60
+ const S_BEXACT = '`\$EXACT`';
61
+ const S_BVAL = '`\$VAL`';
62
+ const S_BKEY = '`\$KEY`';
63
+ const S_BOPEN = '`\$OPEN`';
64
+
65
+ const S_MT = '';
66
+ const S_BT = '`';
67
+ const S_DS = '\$';
68
+ const S_DT = '.';
69
+ const S_CN = ':';
70
+ const S_KEY = 'KEY';
71
+ const S_VIZ = ': ';
72
+
73
+ const S_string = 'string';
74
+ const S_object = 'object';
75
+ const S_list = 'list';
76
+ const S_map = 'map';
77
+ const S_nil = 'nil';
78
+ const S_null = 'null';
79
+
80
+ const T_any = (1 << 31) - 1;
81
+ const T_noval = 1 << 30;
82
+ const T_boolean = 1 << 29;
83
+ const T_decimal = 1 << 28;
84
+ const T_integer = 1 << 27;
85
+ const T_number = 1 << 26;
86
+ const T_string = 1 << 25;
87
+ const T_function = 1 << 24;
88
+ const T_null = 1 << 22;
89
+ const T_list = 1 << 14;
90
+ const T_map = 1 << 13;
91
+ const T_instance = 1 << 12;
92
+ const T_scalar = 1 << 7;
93
+ const T_node = 1 << 6;
94
+
95
+ const _TYPENAME = [
96
+ 'any',
97
+ 'nil',
98
+ 'boolean',
99
+ 'decimal',
100
+ 'integer',
101
+ 'number',
102
+ 'string',
103
+ 'function',
104
+ 'symbol',
105
+ 'null',
106
+ '',
107
+ '',
108
+ '',
109
+ '',
110
+ '',
111
+ '',
112
+ '',
113
+ 'list',
114
+ 'map',
115
+ 'instance',
116
+ '',
117
+ '',
118
+ '',
119
+ '',
120
+ 'scalar',
121
+ 'node'
122
+ ];
123
+
124
+ const MAXDEPTH = 32;
125
+
126
+ final _R_INJECT_FULL = RegExp(r'^`(\$[A-Z]+|[^`]*)[0-9]*`$');
127
+ final _R_INJECT_PART = RegExp(r'`([^`]*)`');
128
+ final _R_META_PATH = RegExp(r'^([^$]+)\$([=~])(.+)$');
129
+ final _R_TRANSFORM_NAME = RegExp(r'`\$([A-Z]+)`');
130
+
131
+ // ---------------------------------------------------------------------------
132
+ // Low-level helpers
133
+ // ---------------------------------------------------------------------------
134
+
135
+ bool isSkip(dynamic v) => identical(v, SKIP);
136
+ bool isDelete(dynamic v) => identical(v, DELETE);
137
+
138
+ bool _isInteger(num n) =>
139
+ n is int || (n is double && n.isFinite && n == n.truncateToDouble());
140
+
141
+ String numToString(num n) {
142
+ if (n is double) {
143
+ if (n.isNaN) return 'NaN';
144
+ if (n.isInfinite) return n > 0 ? 'Infinity' : '-Infinity';
145
+ if (n == n.truncateToDouble() && n.abs() < 1e16)
146
+ return n.toInt().toString();
147
+ return n.toString();
148
+ }
149
+ return n.toString();
150
+ }
151
+
152
+ String jsString(dynamic v) {
153
+ if (v == null) return 'null';
154
+ if (v is bool) return v ? 'true' : 'false';
155
+ if (v is num) return numToString(v);
156
+ if (v is String) return v;
157
+ if (v is List) return v.map((x) => (x == null) ? '' : jsString(x)).join(',');
158
+ if (v is Map) return '[object Object]';
159
+ if (v is Function) return 'function';
160
+ return v.toString();
161
+ }
162
+
163
+ String _mapKey(dynamic k) =>
164
+ k is String ? k : (k is num ? numToString(k) : jsString(k));
165
+
166
+ int? _toInt(dynamic k) {
167
+ if (k is bool) return null;
168
+ if (k is int) return k;
169
+ if (k is double) return k.floor();
170
+ if (k is String) return int.tryParse(k.trim());
171
+ return null;
172
+ }
173
+
174
+ int _clz32(int n0) {
175
+ var n = n0 & 0xFFFFFFFF;
176
+ if (n == 0) return 32;
177
+ var r = 0;
178
+ while ((n & 0x80000000) == 0) {
179
+ r++;
180
+ n = (n << 1) & 0xFFFFFFFF;
181
+ }
182
+ return r;
183
+ }
184
+
185
+ // ---------------------------------------------------------------------------
186
+ // Minor utilities
187
+ // ---------------------------------------------------------------------------
188
+
189
+ bool isnode(dynamic v) => v is Map || v is List;
190
+ bool ismap(dynamic v) => v is Map;
191
+ bool islist(dynamic v) => v is List;
192
+ bool isfunc(dynamic v) => v is Function;
193
+
194
+ bool iskey(dynamic k) {
195
+ if (k is String) return k.isNotEmpty;
196
+ if (k is bool) return false;
197
+ if (k is num) return true;
198
+ return false;
199
+ }
200
+
201
+ bool isempty([dynamic v]) {
202
+ if (v == null) return true;
203
+ if (v == '') return true;
204
+ if (v is List) return v.isEmpty;
205
+ if (v is Map) return v.isEmpty;
206
+ return false;
207
+ }
208
+
209
+ dynamic getdef(dynamic v, dynamic alt) => v == null ? alt : v;
210
+
211
+ int typify([dynamic value = _noarg]) {
212
+ if (identical(value, _noarg)) return T_noval;
213
+ if (value == null) return T_scalar | T_null;
214
+ if (value is bool) return T_scalar | T_boolean;
215
+ if (value is int) return T_scalar | T_number | T_integer;
216
+ if (value is double) {
217
+ if (value.isNaN) return T_noval;
218
+ if (value == value.truncateToDouble())
219
+ return T_scalar | T_number | T_integer;
220
+ return T_scalar | T_number | T_decimal;
221
+ }
222
+ if (value is num) return T_scalar | T_number | T_integer;
223
+ if (value is String) return T_scalar | T_string;
224
+ if (value is Function) return T_scalar | T_function;
225
+ if (value is List) return T_node | T_list;
226
+ if (value is Map) return T_node | T_map;
227
+ return T_node | T_instance;
228
+ }
229
+
230
+ String typename([int t = 0]) {
231
+ var i = _clz32(t);
232
+ return (i >= 0 && i < _TYPENAME.length) ? _TYPENAME[i] : _TYPENAME[0];
233
+ }
234
+
235
+ int size([dynamic v]) {
236
+ if (v is List) return v.length;
237
+ if (v is Map) return v.length;
238
+ if (v is String) return v.length;
239
+ if (v is bool) return v ? 1 : 0;
240
+ if (v is num) return v.floor();
241
+ return 0;
242
+ }
243
+
244
+ String strkey([dynamic key]) {
245
+ if (key == null) return S_MT;
246
+ if (key is String) return key;
247
+ if (key is bool) return S_MT;
248
+ if (key is num)
249
+ return _isInteger(key)
250
+ ? numToString(key)
251
+ : numToString(key.floorToDouble());
252
+ return S_MT;
253
+ }
254
+
255
+ List<String> keysof([dynamic v]) {
256
+ if (v is Map) {
257
+ var ks = v.keys.map((k) => k.toString()).toList();
258
+ ks.sort();
259
+ return ks;
260
+ }
261
+ if (v is List) return List.generate(v.length, (i) => i.toString());
262
+ return [];
263
+ }
264
+
265
+ dynamic getprop(dynamic val, dynamic key, [dynamic alt]) {
266
+ if (val == null || key == null) return alt;
267
+ dynamic out = alt;
268
+ if (val is Map) {
269
+ var sk = _mapKey(key);
270
+ if (val.containsKey(sk)) out = val[sk];
271
+ } else if (val is List) {
272
+ var ki = _toInt(key);
273
+ if (ki != null && ki >= 0 && ki < val.length) out = val[ki];
274
+ }
275
+ if (out == null) return alt;
276
+ return out;
277
+ }
278
+
279
+ dynamic _lookup(dynamic val, dynamic key) {
280
+ if (val == null || key == null) return null;
281
+ if (val is Map) {
282
+ var sk = _mapKey(key);
283
+ return val.containsKey(sk) ? val[sk] : null;
284
+ }
285
+ if (val is List) {
286
+ var ki = _toInt(key);
287
+ return (ki != null && ki >= 0 && ki < val.length) ? val[ki] : null;
288
+ }
289
+ return null;
290
+ }
291
+
292
+ bool haskey([dynamic val, dynamic key]) => getprop(val, key) != null;
293
+
294
+ final _R_INTKEY = RegExp(r'^-?[0-9]+$');
295
+
296
+ dynamic getelem(dynamic val, dynamic key, [dynamic alt]) {
297
+ if (val == null || key == null) return alt;
298
+ dynamic out;
299
+ if (val is List) {
300
+ var ks = key is String ? key : (key is num ? numToString(key) : '');
301
+ if (_R_INTKEY.hasMatch(ks)) {
302
+ var len = val.length;
303
+ var nk0 = int.parse(ks);
304
+ var nk = nk0 < 0 ? len + nk0 : nk0;
305
+ if (nk >= 0 && nk < len) out = val[nk];
306
+ }
307
+ }
308
+ if (out == null) {
309
+ return isfunc(alt) ? alt() : alt;
310
+ }
311
+ return out;
312
+ }
313
+
314
+ dynamic _getpropRaw(dynamic v, String k) {
315
+ if (v is Map) return v.containsKey(k) ? v[k] : null;
316
+ if (v is List) {
317
+ var i = int.tryParse(k);
318
+ return (i != null && i >= 0 && i < v.length) ? v[i] : null;
319
+ }
320
+ return null;
321
+ }
322
+
323
+ List<List<dynamic>> itemsPairs(dynamic v) {
324
+ if (!isnode(v)) return [];
325
+ return keysof(v).map((k) => [k, _getpropRaw(v, k)]).toList();
326
+ }
327
+
328
+ dynamic items([dynamic v]) =>
329
+ itemsPairs(v).map((p) => <dynamic>[p[0], p[1]]).toList();
330
+
331
+ dynamic itemsV(dynamic v, dynamic Function(List<dynamic>) f) =>
332
+ itemsPairs(v).map(f).toList();
333
+
334
+ dynamic flatten(dynamic l, [int depth = 1]) {
335
+ if (l is! List) return l;
336
+ var out = <dynamic>[];
337
+ for (var item in l) {
338
+ if (item is List && depth > 0) {
339
+ for (var x in (flatten(item, depth - 1) as List)) {
340
+ out.add(x);
341
+ }
342
+ } else {
343
+ out.add(item);
344
+ }
345
+ }
346
+ return out;
347
+ }
348
+
349
+ dynamic filter(dynamic val, bool Function(List<dynamic>) check) {
350
+ var out = <dynamic>[];
351
+ for (var p in itemsPairs(val)) {
352
+ if (check(p)) out.add(p[1]);
353
+ }
354
+ return out;
355
+ }
356
+
357
+ dynamic setprop(dynamic parent, dynamic key, dynamic val) {
358
+ if (!iskey(key)) return parent;
359
+ if (parent is Map) {
360
+ parent[_mapKey(key)] = val;
361
+ } else if (parent is List) {
362
+ var ki = _toInt(key is num ? key.floor() : key);
363
+ if (ki == null) return parent;
364
+ var len = parent.length;
365
+ if (ki >= 0) {
366
+ if (ki > len) ki = len;
367
+ if (ki >= len) {
368
+ parent.add(val);
369
+ } else {
370
+ parent[ki] = val;
371
+ }
372
+ } else {
373
+ parent.insert(0, val);
374
+ }
375
+ }
376
+ return parent;
377
+ }
378
+
379
+ dynamic delprop(dynamic parent, dynamic key) {
380
+ if (!iskey(key)) return parent;
381
+ if (parent is Map) {
382
+ parent.remove(_mapKey(key));
383
+ } else if (parent is List) {
384
+ var ki = _toInt(key);
385
+ if (ki != null && ki >= 0 && ki < parent.length) parent.removeAt(ki);
386
+ }
387
+ return parent;
388
+ }
389
+
390
+ dynamic clone([dynamic v]) {
391
+ if (v is Map) {
392
+ var o = <String, dynamic>{};
393
+ v.forEach((k, x) => o[k.toString()] = clone(x));
394
+ return o;
395
+ }
396
+ if (v is List) {
397
+ return v.map((x) => clone(x)).toList();
398
+ }
399
+ return v;
400
+ }
401
+
402
+ dynamic slice(dynamic val, [dynamic start, dynamic end, bool mutate = false]) {
403
+ if (val is num) {
404
+ num? lo = start is num ? start : null;
405
+ num? hi = end is num ? (end - 1) : null;
406
+ if (hi != null && val > hi) return hi;
407
+ if (lo != null && val < lo) return lo;
408
+ return val;
409
+ }
410
+ if (val is List || val is String) {
411
+ var vlen = size(val);
412
+ if (start == null && end != null) start = 0;
413
+ if (start == null) return val;
414
+ var s = (start as num).toInt();
415
+ var e = 0;
416
+ if (s < 0) {
417
+ e = vlen + s;
418
+ if (e < 0) e = 0;
419
+ s = 0;
420
+ } else if (end != null) {
421
+ e = (end as num).toInt();
422
+ if (e < 0) {
423
+ e = vlen + e;
424
+ if (e < 0) e = 0;
425
+ } else if (vlen < e) {
426
+ e = vlen;
427
+ }
428
+ } else {
429
+ e = vlen;
430
+ }
431
+ if (vlen < s) s = vlen;
432
+ if (s > -1 && s <= e && e <= vlen) {
433
+ if (val is List) {
434
+ if (mutate) {
435
+ var sub = val.sublist(s, e);
436
+ val
437
+ ..clear()
438
+ ..addAll(sub);
439
+ return val;
440
+ }
441
+ return val.sublist(s, e);
442
+ }
443
+ return (val as String).substring(s, e);
444
+ } else {
445
+ if (val is List) {
446
+ if (mutate) {
447
+ val.clear();
448
+ return val;
449
+ }
450
+ return <dynamic>[];
451
+ }
452
+ return S_MT;
453
+ }
454
+ }
455
+ return val;
456
+ }
457
+
458
+ // ---------------------------------------------------------------------------
459
+ // Regex helpers (uniform re_* API over RegExp)
460
+ // ---------------------------------------------------------------------------
461
+
462
+ RegExp _rx(dynamic p) =>
463
+ p is RegExp ? p : RegExp(p is String ? p : jsString(p));
464
+
465
+ dynamic re_compile(dynamic p, [dynamic flags]) => _rx(p);
466
+ dynamic re_test(dynamic p, dynamic input) =>
467
+ _rx(p).hasMatch(input is String ? input : jsString(input));
468
+ dynamic re_find(dynamic p, dynamic input) {
469
+ var m = _rx(p).firstMatch(input is String ? input : jsString(input));
470
+ if (m == null) return null;
471
+ return [for (var i = 0; i <= m.groupCount; i++) m.group(i) ?? ''];
472
+ }
473
+
474
+ dynamic re_find_all(dynamic p, dynamic input) {
475
+ var out = <dynamic>[];
476
+ for (var m in _rx(p).allMatches(input is String ? input : jsString(input))) {
477
+ out.add([for (var i = 0; i <= m.groupCount; i++) m.group(i) ?? '']);
478
+ }
479
+ return out;
480
+ }
481
+
482
+ dynamic re_replace(dynamic p, dynamic input, dynamic repl) {
483
+ var s = input is String ? input : jsString(input);
484
+ if (repl is Function) {
485
+ return s.replaceAllMapped(_rx(p), (m) {
486
+ var groups = [for (var i = 0; i <= m.groupCount; i++) m.group(i) ?? ''];
487
+ return (repl(groups)).toString();
488
+ });
489
+ }
490
+ return s;
491
+ }
492
+
493
+ dynamic re_escape(dynamic s) => escre(s);
494
+
495
+ dynamic escre([dynamic s]) {
496
+ var str = s is String ? s : (s == null ? S_MT : jsString(s));
497
+ var b = StringBuffer();
498
+ for (var i = 0; i < str.length; i++) {
499
+ var c = str[i];
500
+ if ('.*+?^\$\{\}()|[]\\'.contains(c)) b.write('\\');
501
+ b.write(c);
502
+ }
503
+ return b.toString();
504
+ }
505
+
506
+ const _urlUnreserved =
507
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.!~*\'()';
508
+
509
+ dynamic escurl([dynamic s]) {
510
+ var str = s is String ? s : (s == null ? S_MT : jsString(s));
511
+ var b = StringBuffer();
512
+ for (var byte in _utf8(str)) {
513
+ var c = String.fromCharCode(byte);
514
+ if (_urlUnreserved.contains(c)) {
515
+ b.write(c);
516
+ } else {
517
+ b.write('%${byte.toRadixString(16).toUpperCase().padLeft(2, '0')}');
518
+ }
519
+ }
520
+ return b.toString();
521
+ }
522
+
523
+ List<int> _utf8(String s) {
524
+ // Minimal UTF-8 encoder (avoids importing dart:convert in the library).
525
+ var out = <int>[];
526
+ for (var rune in s.runes) {
527
+ if (rune < 0x80) {
528
+ out.add(rune);
529
+ } else if (rune < 0x800) {
530
+ out.add(0xC0 | (rune >> 6));
531
+ out.add(0x80 | (rune & 0x3F));
532
+ } else if (rune < 0x10000) {
533
+ out.add(0xE0 | (rune >> 12));
534
+ out.add(0x80 | ((rune >> 6) & 0x3F));
535
+ out.add(0x80 | (rune & 0x3F));
536
+ } else {
537
+ out.add(0xF0 | (rune >> 18));
538
+ out.add(0x80 | ((rune >> 12) & 0x3F));
539
+ out.add(0x80 | ((rune >> 6) & 0x3F));
540
+ out.add(0x80 | (rune & 0x3F));
541
+ }
542
+ }
543
+ return out;
544
+ }
545
+
546
+ // ---------------------------------------------------------------------------
547
+ // JSON-ish serialization / stringify / jsonify
548
+ // ---------------------------------------------------------------------------
549
+
550
+ void _escJson(String s, StringBuffer b) {
551
+ b.write('"');
552
+ for (var i = 0; i < s.length; i++) {
553
+ var c = s[i];
554
+ var code = s.codeUnitAt(i);
555
+ if (c == '"') {
556
+ b.write('\\"');
557
+ } else if (c == '\\') {
558
+ b.write('\\\\');
559
+ } else if (c == '\n') {
560
+ b.write('\\n');
561
+ } else if (c == '\r') {
562
+ b.write('\\r');
563
+ } else if (c == '\t') {
564
+ b.write('\\t');
565
+ } else if (code < 32) {
566
+ b.write('\\u${code.toRadixString(16).padLeft(4, '0')}');
567
+ } else {
568
+ b.write(c);
569
+ }
570
+ }
571
+ b.write('"');
572
+ }
573
+
574
+ String jsonEncode(dynamic v, {bool sort = false, int? indent}) {
575
+ var b = StringBuffer();
576
+ void enc(dynamic v, int level) {
577
+ if (v == null) {
578
+ b.write('null');
579
+ } else if (v is bool) {
580
+ b.write(v ? 'true' : 'false');
581
+ } else if (v is num) {
582
+ b.write(numToString(v));
583
+ } else if (v is String) {
584
+ _escJson(v, b);
585
+ } else if (v is Function || v is _Sentinel) {
586
+ b.write('null');
587
+ } else if (v is List) {
588
+ if (v.isEmpty) {
589
+ b.write('[]');
590
+ } else if (indent != null) {
591
+ var pad = ' ' * (indent * (level + 1));
592
+ var cpad = ' ' * (indent * level);
593
+ b.write('[\n');
594
+ for (var i = 0; i < v.length; i++) {
595
+ if (i > 0) b.write(',\n');
596
+ b.write(pad);
597
+ enc(v[i], level + 1);
598
+ }
599
+ b.write('\n');
600
+ b.write(cpad);
601
+ b.write(']');
602
+ } else {
603
+ b.write('[');
604
+ for (var i = 0; i < v.length; i++) {
605
+ if (i > 0) b.write(',');
606
+ enc(v[i], level + 1);
607
+ }
608
+ b.write(']');
609
+ }
610
+ } else if (v is Map) {
611
+ var ks = v.keys.map((k) => k.toString()).toList();
612
+ if (sort) ks.sort();
613
+ if (ks.isEmpty) {
614
+ b.write('{}');
615
+ } else if (indent != null) {
616
+ var pad = ' ' * (indent * (level + 1));
617
+ var cpad = ' ' * (indent * level);
618
+ b.write('{\n');
619
+ for (var i = 0; i < ks.length; i++) {
620
+ if (i > 0) b.write(',\n');
621
+ b.write(pad);
622
+ _escJson(ks[i], b);
623
+ b.write(': ');
624
+ enc(v[ks[i]], level + 1);
625
+ }
626
+ b.write('\n');
627
+ b.write(cpad);
628
+ b.write('}');
629
+ } else {
630
+ b.write('{');
631
+ for (var i = 0; i < ks.length; i++) {
632
+ if (i > 0) b.write(',');
633
+ _escJson(ks[i], b);
634
+ b.write(':');
635
+ enc(v[ks[i]], level + 1);
636
+ }
637
+ b.write('}');
638
+ }
639
+ } else {
640
+ _escJson(v.toString(), b);
641
+ }
642
+ }
643
+
644
+ enc(v, 0);
645
+ return b.toString();
646
+ }
647
+
648
+ bool _hasCycle(dynamic v) {
649
+ var seen = <dynamic>[];
650
+ bool go(dynamic v) {
651
+ if (v is List) {
652
+ if (seen.any((s) => identical(s, v))) return true;
653
+ seen.add(v);
654
+ return v.any(go);
655
+ }
656
+ if (v is Map) {
657
+ if (seen.any((s) => identical(s, v))) return true;
658
+ seen.add(v);
659
+ return v.values.any(go);
660
+ }
661
+ return false;
662
+ }
663
+
664
+ return go(v);
665
+ }
666
+
667
+ String stringify([dynamic v = _noarg, dynamic maxlen, dynamic pretty]) {
668
+ var pr = pretty == true;
669
+ if (identical(v, _noarg)) return pr ? '<>' : S_MT;
670
+ String valstr;
671
+ if (v is String) {
672
+ valstr = v;
673
+ } else if (_hasCycle(v)) {
674
+ valstr = '__STRINGIFY_FAILED__';
675
+ } else {
676
+ try {
677
+ valstr = jsonEncode(v, sort: true).replaceAll('"', '');
678
+ } catch (_) {
679
+ valstr = '__STRINGIFY_FAILED__';
680
+ }
681
+ }
682
+ if (maxlen is num && maxlen > -1) {
683
+ var m = maxlen.toInt();
684
+ if (m < valstr.length) {
685
+ valstr = valstr.substring(0, m - 3 < 0 ? 0 : m - 3) + '...';
686
+ }
687
+ }
688
+ if (pr) {
689
+ var colors = [
690
+ 81,
691
+ 118,
692
+ 213,
693
+ 39,
694
+ 208,
695
+ 201,
696
+ 45,
697
+ 190,
698
+ 129,
699
+ 51,
700
+ 160,
701
+ 121,
702
+ 226,
703
+ 33,
704
+ 207,
705
+ 69
706
+ ];
707
+ var c = colors.map((n) => '\x1b[38;5;${n}m').toList();
708
+ var r = '\x1b[0m';
709
+ var d = 0;
710
+ var o = c[0];
711
+ var t = StringBuffer(c[0]);
712
+ for (var i = 0; i < valstr.length; i++) {
713
+ var ch = valstr[i];
714
+ if (ch == '{' || ch == '[') {
715
+ d++;
716
+ o = c[d % c.length];
717
+ t.write(o);
718
+ t.write(ch);
719
+ } else if (ch == '}' || ch == ']') {
720
+ t.write(o);
721
+ t.write(ch);
722
+ d--;
723
+ o = c[((d % c.length) + c.length) % c.length];
724
+ } else {
725
+ t.write(o);
726
+ t.write(ch);
727
+ }
728
+ }
729
+ t.write(r);
730
+ return t.toString();
731
+ }
732
+ return valstr;
733
+ }
734
+
735
+ String jsonify([dynamic v, dynamic flags]) {
736
+ if (v == null) return S_null;
737
+ var indent = getprop(flags, 'indent', 2);
738
+ var ind = indent is num ? indent.toInt() : 2;
739
+ try {
740
+ var str = ind > 0 ? jsonEncode(v, indent: ind) : jsonEncode(v);
741
+ var offset = getprop(flags, 'offset', 0);
742
+ var off = offset is num ? offset.toInt() : 0;
743
+ if (off > 0) {
744
+ var lines = str.split('\n');
745
+ if (lines.isNotEmpty) {
746
+ return '{\n' + lines.sublist(1).map((l) => (' ' * off) + l).join('\n');
747
+ }
748
+ }
749
+ return str;
750
+ } catch (_) {
751
+ return S_null;
752
+ }
753
+ }
754
+
755
+ String pad([dynamic s, dynamic padding, dynamic padchar]) {
756
+ var str = s is String ? s : (s == null ? 'null' : stringify(s));
757
+ var p = padding is num ? padding.toInt() : 44;
758
+ var pc = padchar is String ? (padchar + ' ').substring(0, 1) : ' ';
759
+ if (p > -1) {
760
+ var n = p - str.length;
761
+ return n > 0 ? str + (pc * n) : str;
762
+ } else {
763
+ var n = (-p) - str.length;
764
+ return n > 0 ? (pc * n) + str : str;
765
+ }
766
+ }
767
+
768
+ // ---------------------------------------------------------------------------
769
+ // join / pathify / replace
770
+ // ---------------------------------------------------------------------------
771
+
772
+ String join(dynamic arr, [dynamic sep, dynamic url]) {
773
+ if (arr is! List) return S_MT;
774
+ var sepdef = (sep == null) ? ',' : (sep is String ? sep : jsString(sep));
775
+ var single = sepdef.length == 1;
776
+ var sc = single ? sepdef[0] : ' ';
777
+ var isUrl = url == true;
778
+ var sarr = arr.length;
779
+ String stripTrailing(String s) {
780
+ var i = s.length;
781
+ while (i > 0 && s[i - 1] == sc) i--;
782
+ return s.substring(0, i);
783
+ }
784
+
785
+ String stripLeading(String s) {
786
+ var i = 0;
787
+ while (i < s.length && s[i] == sc) i++;
788
+ return s.substring(i);
789
+ }
790
+
791
+ String collapse(String s) {
792
+ var b = StringBuffer();
793
+ var i = 0;
794
+ var n = s.length;
795
+ while (i < n) {
796
+ if (s[i] != sc) {
797
+ b.write(s[i]);
798
+ i++;
799
+ } else {
800
+ var j = i;
801
+ while (j < n && s[j] == sc) j++;
802
+ var beforeNon = i > 0 && s[i - 1] != sc;
803
+ var afterNon = j < n;
804
+ if (beforeNon && afterNon) {
805
+ b.write(sc);
806
+ } else {
807
+ b.write(s.substring(i, j));
808
+ }
809
+ i = j;
810
+ }
811
+ }
812
+ return b.toString();
813
+ }
814
+
815
+ var out = <String>[];
816
+ for (var idx = 0; idx < arr.length; idx++) {
817
+ var s0 = arr[idx];
818
+ if (s0 is String && s0 != S_MT) {
819
+ String s;
820
+ if (single) {
821
+ if (isUrl && idx == 0) {
822
+ s = stripTrailing(s0);
823
+ } else {
824
+ var x = idx > 0 ? stripLeading(s0) : s0;
825
+ x = (idx < sarr - 1 || !isUrl) ? stripTrailing(x) : x;
826
+ s = collapse(x);
827
+ }
828
+ } else {
829
+ s = s0;
830
+ }
831
+ if (s != S_MT) out.add(s);
832
+ }
833
+ }
834
+ return out.join(sepdef);
835
+ }
836
+
837
+ String joinurl(dynamic arr) => join(arr, '/', true);
838
+
839
+ String replace(dynamic s, dynamic from, dynamic to) {
840
+ var ts = typify(s);
841
+ String rs;
842
+ if ((T_string & ts) == 0) {
843
+ rs = stringify(s);
844
+ } else if (((T_noval | T_null) & ts) > 0) {
845
+ rs = S_MT;
846
+ } else {
847
+ rs = stringify(s);
848
+ }
849
+ var toS = to is String ? to : jsString(to);
850
+ if (from is String && from.isNotEmpty) return rs.replaceAll(from, toS);
851
+ if (from is RegExp) return rs.replaceAll(from, toS);
852
+ return rs;
853
+ }
854
+
855
+ String pathify([dynamic v = _noarg, dynamic startin, dynamic endin]) {
856
+ var absent = identical(v, _noarg);
857
+ var val = absent ? null : v;
858
+ List<dynamic>? path;
859
+ if (val is List) {
860
+ path = val;
861
+ } else if (iskey(val)) {
862
+ path = [val];
863
+ } else {
864
+ path = null;
865
+ }
866
+ var start = startin is num ? (startin > -1 ? startin.toInt() : 0) : 0;
867
+ var endn = endin is num ? (endin > -1 ? endin.toInt() : 0) : 0;
868
+ String? pathstr;
869
+ if (path != null && start >= 0) {
870
+ var len = path.length;
871
+ var e = len - endn;
872
+ if (e < 0) e = 0;
873
+ var s = start > len ? len : start;
874
+ var sub = s <= e ? path.sublist(s, e) : <dynamic>[];
875
+ if (sub.isEmpty) {
876
+ pathstr = '<root>';
877
+ } else {
878
+ var mapped = sub.where(iskey).map((p) {
879
+ if (p is num) return numToString(p.floorToDouble());
880
+ return jsString(p).replaceAll('.', S_MT);
881
+ });
882
+ pathstr = mapped.join('.');
883
+ }
884
+ }
885
+ if (pathstr == null) {
886
+ pathstr =
887
+ '<unknown-path' + (absent ? S_MT : S_CN + stringify(val, 47)) + '>';
888
+ }
889
+ return pathstr;
890
+ }
891
+
892
+ // ---------------------------------------------------------------------------
893
+ // walk / merge
894
+ // ---------------------------------------------------------------------------
895
+
896
+ dynamic walk(dynamic val,
897
+ {Function? before,
898
+ Function? after,
899
+ dynamic maxdepth,
900
+ dynamic key,
901
+ dynamic parent,
902
+ dynamic path}) {
903
+ path ??= <dynamic>[];
904
+ var depth = size(path);
905
+ var out = before == null ? val : before(key, val, parent, path);
906
+ var md = (maxdepth is num && maxdepth >= 0) ? maxdepth.toInt() : MAXDEPTH;
907
+ if (md == 0 || (md > 0 && md <= depth)) return out;
908
+ if (isnode(out)) {
909
+ var prefix = List<dynamic>.from(path as List);
910
+ for (var pair in itemsPairs(out)) {
911
+ var ckey = pair[0] as String;
912
+ var child = pair[1];
913
+ var childpath = [...prefix, ckey];
914
+ var result = walk(child,
915
+ before: before,
916
+ after: after,
917
+ maxdepth: md,
918
+ key: ckey,
919
+ parent: out,
920
+ path: childpath);
921
+ if (out is Map) {
922
+ out[ckey] = result;
923
+ } else if (out is List) {
924
+ out[int.parse(ckey)] = result;
925
+ }
926
+ }
927
+ }
928
+ return after == null ? out : after(key, out, parent, path);
929
+ }
930
+
931
+ dynamic merge(dynamic objs, [dynamic maxdepth]) {
932
+ var md = maxdepth is num ? (maxdepth < 0 ? 0 : maxdepth.toInt()) : MAXDEPTH;
933
+ if (objs is! List) return objs;
934
+ var lenlist = objs.length;
935
+ if (lenlist == 0) return null;
936
+ if (lenlist == 1) return objs[0];
937
+ dynamic out = getprop(objs, 0, <String, dynamic>{});
938
+ for (var oi = 1; oi < lenlist; oi++) {
939
+ var obj = objs[oi];
940
+ if (!isnode(obj)) {
941
+ out = obj;
942
+ } else {
943
+ var cur = <dynamic>[out];
944
+ var dst = <dynamic>[out];
945
+ void grow(List<dynamic> a, int n) {
946
+ while (a.length <= n) a.add(null);
947
+ }
948
+
949
+ dynamic before(dynamic key, dynamic val, dynamic parent, dynamic path) {
950
+ var pi = size(path);
951
+ if (md <= pi) {
952
+ grow(cur, pi);
953
+ cur[pi] = val;
954
+ if (pi > 0) setprop(cur[pi - 1], key, val);
955
+ return null;
956
+ } else if (!isnode(val)) {
957
+ grow(cur, pi);
958
+ cur[pi] = val;
959
+ return val;
960
+ } else {
961
+ grow(dst, pi);
962
+ grow(cur, pi);
963
+ dst[pi] = pi > 0 ? getprop(dst[pi - 1], key) : dst[pi];
964
+ var tval = dst[pi];
965
+ if (tval == null) {
966
+ cur[pi] = islist(val) ? <dynamic>[] : <String, dynamic>{};
967
+ return val;
968
+ } else if ((islist(val) && islist(tval)) ||
969
+ (ismap(val) && ismap(tval))) {
970
+ cur[pi] = tval;
971
+ return val;
972
+ } else {
973
+ cur[pi] = val;
974
+ return null;
975
+ }
976
+ }
977
+ }
978
+
979
+ dynamic after(dynamic key, dynamic val, dynamic parent, dynamic path) {
980
+ var ci = size(path);
981
+ if (ci < 1) return cur.isNotEmpty ? cur[0] : val;
982
+ var target = ci - 1 < cur.length ? cur[ci - 1] : null;
983
+ var value = ci < cur.length ? cur[ci] : null;
984
+ setprop(target, key, value);
985
+ return value;
986
+ }
987
+
988
+ out = walk(obj, before: before, after: after);
989
+ }
990
+ }
991
+ if (md == 0) {
992
+ var o = getprop(objs, lenlist - 1);
993
+ out = islist(o) ? <dynamic>[] : (ismap(o) ? <String, dynamic>{} : o);
994
+ }
995
+ return out;
996
+ }
997
+
998
+ // ---------------------------------------------------------------------------
999
+ // getpath / setpath
1000
+ // ---------------------------------------------------------------------------
1001
+
1002
+ dynamic _idef(dynamic injdef, String field) {
1003
+ if (injdef is Inj) {
1004
+ switch (field) {
1005
+ case 'base':
1006
+ return injdef.base;
1007
+ case 'dparent':
1008
+ return injdef.dparent;
1009
+ case 'meta':
1010
+ return injdef.meta;
1011
+ case 'key':
1012
+ return injdef.key;
1013
+ case 'dpath':
1014
+ return injdef.dpath;
1015
+ case 'handler':
1016
+ return injdef.handler;
1017
+ }
1018
+ return null;
1019
+ }
1020
+ return getprop(injdef, field);
1021
+ }
1022
+
1023
+ dynamic getpath(dynamic store, dynamic path, [dynamic injdef]) {
1024
+ List<dynamic>? parts;
1025
+ if (path is List) {
1026
+ parts = List<dynamic>.from(path);
1027
+ } else if (path is String) {
1028
+ parts = path.split(S_DT);
1029
+ } else if (path is num && path is! bool) {
1030
+ parts = [strkey(path)];
1031
+ } else {
1032
+ return null;
1033
+ }
1034
+
1035
+ var hasInj = injdef != null;
1036
+ var base = _idef(injdef, 'base');
1037
+ var dparent = _idef(injdef, 'dparent');
1038
+ var injMeta = _idef(injdef, 'meta');
1039
+ var injKey = _idef(injdef, 'key');
1040
+ var dpath = _idef(injdef, 'dpath');
1041
+ var src = iskey(base) ? getprop(store, base, store) : store;
1042
+ var numparts = parts.length;
1043
+ dynamic val = store;
1044
+
1045
+ if (path == null ||
1046
+ store == null ||
1047
+ (numparts == 1 && parts[0] == S_MT) ||
1048
+ numparts == 0) {
1049
+ val = src;
1050
+ } else {
1051
+ if (numparts == 1) val = getprop(store, parts[0]);
1052
+ if (!isfunc(val)) {
1053
+ val = src;
1054
+ if (parts[0] is String) {
1055
+ var m = _R_META_PATH.firstMatch(parts[0]);
1056
+ if (m != null && injMeta != null && hasInj) {
1057
+ val = getprop(injMeta, m.group(1));
1058
+ parts[0] = m.group(3);
1059
+ }
1060
+ }
1061
+ var pi = 0;
1062
+ var cont = true;
1063
+ while (cont && val != null && pi < numparts) {
1064
+ var raw = parts[pi];
1065
+ dynamic part;
1066
+ if (hasInj && raw == S_DKEY) {
1067
+ part = injKey != null ? injKey : raw;
1068
+ } else if (raw is String && raw.startsWith('\$GET:')) {
1069
+ part = stringify(getpath(src, slice(raw, 5, -1)));
1070
+ } else if (raw is String && raw.startsWith('\$REF:')) {
1071
+ part = stringify(getpath(getprop(store, S_DSPEC), slice(raw, 5, -1)));
1072
+ } else if (hasInj && raw is String && raw.startsWith('\$META:')) {
1073
+ part = stringify(getpath(injMeta, slice(raw, 6, -1)));
1074
+ } else {
1075
+ part = raw;
1076
+ }
1077
+ part = part is String ? part.replaceAll('\$\$', '\$') : strkey(part);
1078
+ if (part == S_MT) {
1079
+ var ascends = 0;
1080
+ while (pi + 1 < parts.length && parts[pi + 1] == S_MT) {
1081
+ ascends++;
1082
+ pi++;
1083
+ }
1084
+ if (hasInj && ascends > 0) {
1085
+ if (pi == numparts - 1) ascends--;
1086
+ if (ascends == 0) {
1087
+ val = dparent;
1088
+ } else {
1089
+ var tail = parts.sublist(pi + 1);
1090
+ var fullpath = flatten([slice(dpath, -ascends), tail]);
1091
+ val = ascends <= size(dpath) ? getpath(store, fullpath) : null;
1092
+ cont = false;
1093
+ }
1094
+ } else {
1095
+ val = dparent;
1096
+ }
1097
+ } else {
1098
+ val = getprop(val, part);
1099
+ }
1100
+ if (cont) pi++;
1101
+ }
1102
+ }
1103
+ }
1104
+
1105
+ var handler = _idef(injdef, 'handler');
1106
+ if (hasInj && isfunc(handler)) {
1107
+ var ref = pathify(path);
1108
+ if (injdef is Inj) {
1109
+ val = handler(injdef, val, ref, store);
1110
+ } else {
1111
+ val = handler(_dummyInj(), val, ref, store);
1112
+ }
1113
+ }
1114
+ return val;
1115
+ }
1116
+
1117
+ dynamic setpath(dynamic store, dynamic path, dynamic val, [dynamic injdef]) {
1118
+ var ptype = typify(path);
1119
+ dynamic parts;
1120
+ if ((T_list & ptype) > 0) {
1121
+ parts = List<dynamic>.from(path as List);
1122
+ } else if ((T_string & ptype) > 0) {
1123
+ parts = (path as String).split(S_DT);
1124
+ } else if ((T_number & ptype) > 0) {
1125
+ parts = [path];
1126
+ } else {
1127
+ return null;
1128
+ }
1129
+ var base = injdef != null ? _idef(injdef, 'base') : null;
1130
+ var numparts = size(parts);
1131
+ var parent = iskey(base) ? getprop(store, base, store) : store;
1132
+ for (var pi = 0; pi < numparts - 1; pi++) {
1133
+ var pkey = getelem(parts, pi);
1134
+ var np = getprop(parent, pkey);
1135
+ if (!isnode(np)) {
1136
+ var nextpart = getelem(parts, pi + 1);
1137
+ np =
1138
+ (T_number & typify(nextpart)) > 0 ? <dynamic>[] : <String, dynamic>{};
1139
+ setprop(parent, pkey, np);
1140
+ }
1141
+ parent = np;
1142
+ }
1143
+ if (isDelete(val)) {
1144
+ delprop(parent, getelem(parts, -1));
1145
+ } else {
1146
+ setprop(parent, getelem(parts, -1), val);
1147
+ }
1148
+ return parent;
1149
+ }
1150
+
1151
+ // ---------------------------------------------------------------------------
1152
+ // Injection state
1153
+ // ---------------------------------------------------------------------------
1154
+
1155
+ class Inj {
1156
+ String mode = S_MVAL;
1157
+ bool full = false;
1158
+ int keyi = 0;
1159
+ dynamic keys;
1160
+ dynamic key;
1161
+ dynamic ival;
1162
+ dynamic parent;
1163
+ dynamic path;
1164
+ dynamic nodes;
1165
+ Function handler = injectHandler;
1166
+ dynamic errs;
1167
+ dynamic meta;
1168
+ dynamic dparent;
1169
+ dynamic dpath;
1170
+ dynamic base;
1171
+ Function? modify;
1172
+ Inj? prior;
1173
+ dynamic extra;
1174
+ dynamic root;
1175
+ }
1176
+
1177
+ Inj? _dummy;
1178
+ Inj _dummyInj() {
1179
+ _dummy ??= _newInj(null, <String, dynamic>{S_DTOP: null});
1180
+ return _dummy!;
1181
+ }
1182
+
1183
+ Inj _newInj(dynamic val, dynamic parent) {
1184
+ var i = Inj();
1185
+ i.mode = S_MVAL;
1186
+ i.full = false;
1187
+ i.keyi = 0;
1188
+ i.keys = [S_DTOP];
1189
+ i.key = S_DTOP;
1190
+ i.ival = val;
1191
+ i.parent = parent;
1192
+ i.path = [S_DTOP];
1193
+ i.nodes = [parent];
1194
+ i.handler = injectHandler;
1195
+ i.errs = <dynamic>[];
1196
+ i.meta = <String, dynamic>{};
1197
+ i.dparent = null;
1198
+ i.dpath = [S_DTOP];
1199
+ i.base = S_DTOP;
1200
+ i.modify = null;
1201
+ i.prior = null;
1202
+ i.extra = null;
1203
+ i.root = null;
1204
+ return i;
1205
+ }
1206
+
1207
+ dynamic _injDescend(Inj inj) {
1208
+ if (inj.meta is Map) {
1209
+ var d = (inj.meta['__d'] is num) ? inj.meta['__d'] as num : 0;
1210
+ inj.meta['__d'] = d + 1;
1211
+ }
1212
+ var parentkey = getelem(inj.path, -2);
1213
+ if (inj.dparent == null) {
1214
+ if (size(inj.dpath) > 1) {
1215
+ inj.dpath = [...(inj.dpath as List), parentkey];
1216
+ }
1217
+ } else if (parentkey != null) {
1218
+ inj.dparent = getprop(inj.dparent, parentkey);
1219
+ var lastpart = getelem(inj.dpath, -1);
1220
+ if (lastpart == '\$:' + jsString(parentkey)) {
1221
+ inj.dpath = slice(inj.dpath, -1);
1222
+ } else {
1223
+ inj.dpath = [...(inj.dpath as List), parentkey];
1224
+ }
1225
+ }
1226
+ return inj.dparent;
1227
+ }
1228
+
1229
+ Inj _injChild(Inj inj, int keyi, dynamic keys) {
1230
+ var key = strkey(getelem(keys, keyi));
1231
+ var val = inj.ival;
1232
+ var c = Inj();
1233
+ c.mode = inj.mode;
1234
+ c.full = inj.full;
1235
+ c.keyi = keyi;
1236
+ c.keys = keys;
1237
+ c.key = key;
1238
+ c.ival = getprop(val, key);
1239
+ c.parent = val;
1240
+ c.path = [...(inj.path as List), key];
1241
+ c.nodes = [...(inj.nodes as List), val];
1242
+ c.handler = inj.handler;
1243
+ c.errs = inj.errs;
1244
+ c.meta = inj.meta;
1245
+ c.base = inj.base;
1246
+ c.modify = inj.modify;
1247
+ c.prior = inj;
1248
+ c.dpath = [...(inj.dpath as List)];
1249
+ c.dparent = inj.dparent;
1250
+ c.extra = inj.extra;
1251
+ c.root = inj.root;
1252
+ return c;
1253
+ }
1254
+
1255
+ dynamic _injSetval(Inj inj, dynamic val, [int ancestor = 1]) {
1256
+ dynamic target;
1257
+ dynamic key;
1258
+ if (ancestor < 2) {
1259
+ target = inj.parent;
1260
+ key = inj.key;
1261
+ } else {
1262
+ target = getelem(inj.nodes, -ancestor);
1263
+ key = getelem(inj.path, -ancestor);
1264
+ }
1265
+ if (val == null) return delprop(target, key);
1266
+ return setprop(target, key, val);
1267
+ }
1268
+
1269
+ // ---------------------------------------------------------------------------
1270
+ // inject
1271
+ // ---------------------------------------------------------------------------
1272
+
1273
+ dynamic inject(dynamic val, dynamic store, [dynamic injdef]) {
1274
+ Inj inj;
1275
+ if (injdef is Inj) {
1276
+ inj = injdef;
1277
+ } else {
1278
+ var parent = <String, dynamic>{S_DTOP: val};
1279
+ inj = _newInj(val, parent);
1280
+ inj.dparent = store;
1281
+ inj.errs = getprop(store, S_DERRS, <dynamic>[]);
1282
+ if (inj.meta is Map) inj.meta['__d'] = 0;
1283
+ inj.root = parent;
1284
+ if (injdef != null) {
1285
+ if (getprop(injdef, 'modify') != null)
1286
+ inj.modify = getprop(injdef, 'modify');
1287
+ if (getprop(injdef, 'extra') != null)
1288
+ inj.extra = getprop(injdef, 'extra');
1289
+ if (getprop(injdef, 'meta') != null) inj.meta = getprop(injdef, 'meta');
1290
+ if (getprop(injdef, 'handler') != null)
1291
+ inj.handler = getprop(injdef, 'handler');
1292
+ }
1293
+ }
1294
+
1295
+ _injDescend(inj);
1296
+
1297
+ dynamic rv;
1298
+ if (isnode(val)) {
1299
+ List<dynamic> nodekeys;
1300
+ if (val is Map) {
1301
+ var ks = val.keys.map((k) => k.toString()).toList();
1302
+ var normal = ks.where((k) => !k.contains(S_DS)).toList()..sort();
1303
+ var trans = ks.where((k) => k.contains(S_DS)).toList()..sort();
1304
+ nodekeys = [...normal, ...trans];
1305
+ } else {
1306
+ nodekeys = List.generate((val as List).length, (i) => i.toString());
1307
+ }
1308
+
1309
+ var nki = 0;
1310
+ while (nki < nodekeys.length) {
1311
+ var childinj = _injChild(inj, nki, List<dynamic>.from(nodekeys));
1312
+ var nodekey = childinj.key;
1313
+ childinj.mode = S_MKEYPRE;
1314
+ var prekey = _injectstr(jsString(nodekey), store, childinj);
1315
+ nodekeys = (childinj.keys as List).map((e) => jsString(e)).toList();
1316
+ if (prekey != null) {
1317
+ childinj.ival = getprop(val, prekey);
1318
+ childinj.mode = S_MVAL;
1319
+ inject(childinj.ival, store, childinj);
1320
+ nodekeys = (childinj.keys as List).map((e) => jsString(e)).toList();
1321
+ childinj.mode = S_MKEYPOST;
1322
+ _injectstr(jsString(nodekey), store, childinj);
1323
+ nodekeys = (childinj.keys as List).map((e) => jsString(e)).toList();
1324
+ }
1325
+ nki = childinj.keyi + 1;
1326
+ }
1327
+ rv = val;
1328
+ } else if (val is String) {
1329
+ inj.mode = S_MVAL;
1330
+ var nv = _injectstr(val, store, inj);
1331
+ if (!isSkip(nv)) _injSetval(inj, nv);
1332
+ rv = nv;
1333
+ } else {
1334
+ rv = val;
1335
+ }
1336
+
1337
+ if (inj.modify != null && !isSkip(rv)) {
1338
+ var mkey = inj.key;
1339
+ var mparent = inj.parent;
1340
+ var mval = getprop(mparent, mkey);
1341
+ inj.modify!(mval, mkey, mparent, inj);
1342
+ }
1343
+
1344
+ inj.ival = rv;
1345
+
1346
+ if (inj.prior == null && inj.root != null && haskey(inj.root, S_DTOP)) {
1347
+ return getprop(inj.root, S_DTOP);
1348
+ }
1349
+ if (inj.key == S_DTOP && inj.parent != null && haskey(inj.parent, S_DTOP)) {
1350
+ return getprop(inj.parent, S_DTOP);
1351
+ }
1352
+ return rv;
1353
+ }
1354
+
1355
+ dynamic injectHandler(dynamic inj, dynamic val, dynamic ref, dynamic store) {
1356
+ var iscmd =
1357
+ isfunc(val) && (ref == null || (ref is String && ref.startsWith(S_DS)));
1358
+ if (iscmd) {
1359
+ return val(inj, val, ref, store);
1360
+ } else if ((inj as Inj).mode == S_MVAL && inj.full) {
1361
+ _injSetval(inj, val);
1362
+ return val;
1363
+ }
1364
+ return val;
1365
+ }
1366
+
1367
+ dynamic _injectstr(String val, dynamic store, [Inj? inj]) {
1368
+ if (val == S_MT) return S_MT;
1369
+ var m = _R_INJECT_FULL.firstMatch(val);
1370
+ if (m != null) {
1371
+ if (inj != null) inj.full = true;
1372
+ var pathref0 = m.group(1)!;
1373
+ var pathref = pathref0.length > 3
1374
+ ? pathref0.replaceAll('\$BT', S_BT).replaceAll('\$DS', S_DS)
1375
+ : pathref0;
1376
+ return getpath(store, pathref, inj);
1377
+ }
1378
+ var out = val.replaceAllMapped(_R_INJECT_PART, (mm) {
1379
+ var ref0 = mm.group(1)!;
1380
+ var ref = ref0.length > 3
1381
+ ? ref0.replaceAll('\$BT', S_BT).replaceAll('\$DS', S_DS)
1382
+ : ref0;
1383
+ if (inj != null) inj.full = false;
1384
+ var found = getpath(store, ref, inj);
1385
+ if (found == null) return S_MT;
1386
+ if (found is String) return found == '__NULL__' ? 'null' : found;
1387
+ if (isfunc(found)) return S_MT;
1388
+ try {
1389
+ return jsonEncode(found);
1390
+ } catch (_) {
1391
+ return stringify(found);
1392
+ }
1393
+ });
1394
+ if (inj != null && isfunc(inj.handler)) {
1395
+ inj.full = true;
1396
+ return inj.handler(inj, out, val, store);
1397
+ }
1398
+ return out;
1399
+ }
1400
+
1401
+ // ---------------------------------------------------------------------------
1402
+ // transform commands
1403
+ // ---------------------------------------------------------------------------
1404
+
1405
+ dynamic _transformDelete(dynamic inj, dynamic val, dynamic ref, dynamic store) {
1406
+ delprop((inj as Inj).parent, inj.key);
1407
+ return null;
1408
+ }
1409
+
1410
+ dynamic _transformCopy(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1411
+ var inj = inj0 as Inj;
1412
+ if (inj.mode == S_MKEYPRE || inj.mode == S_MKEYPOST) return inj.key;
1413
+ var out = _lookup(inj.dparent, inj.key);
1414
+ _injSetval(inj, out);
1415
+ return out;
1416
+ }
1417
+
1418
+ dynamic _transformKey(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1419
+ var inj = inj0 as Inj;
1420
+ if (inj.mode != S_MVAL) return null;
1421
+ var keyspec = _lookup(inj.parent, S_BKEY);
1422
+ if (keyspec != null) {
1423
+ delprop(inj.parent, S_BKEY);
1424
+ return getprop(inj.dparent, keyspec);
1425
+ }
1426
+ var anno = _lookup(inj.parent, S_BANNO);
1427
+ var fromanno = _lookup(anno, S_KEY);
1428
+ if (fromanno != null) return fromanno;
1429
+ return getelem(inj.path, -2);
1430
+ }
1431
+
1432
+ dynamic _transformAnno(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1433
+ delprop((inj0 as Inj).parent, S_BANNO);
1434
+ return null;
1435
+ }
1436
+
1437
+ dynamic _transformMerge(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1438
+ var inj = inj0 as Inj;
1439
+ if (inj.mode == S_MKEYPRE) return inj.key;
1440
+ if (inj.mode == S_MKEYPOST) {
1441
+ var args0 = getprop(inj.parent, inj.key);
1442
+ var args = islist(args0) ? args0 : [args0];
1443
+ _injSetval(inj, null);
1444
+ var mergelist = flatten([
1445
+ [inj.parent],
1446
+ args,
1447
+ [clone(inj.parent)]
1448
+ ]);
1449
+ merge(mergelist);
1450
+ return inj.key;
1451
+ }
1452
+ return null;
1453
+ }
1454
+
1455
+ dynamic _transformEach(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1456
+ var inj = inj0 as Inj;
1457
+ if (islist(inj.keys)) slice(inj.keys, 0, 1, true);
1458
+ if (inj.mode != S_MVAL) return null;
1459
+ var parent = inj.parent;
1460
+ var srcpath = size(parent) > 1 ? getelem(parent, 1) : null;
1461
+ var childTm = size(parent) > 2 ? clone(getelem(parent, 2)) : null;
1462
+ var srcstore = getprop(store, inj.base, store);
1463
+ var src = getpath(srcstore, srcpath, inj);
1464
+ var tkey = getelem(inj.path, -2);
1465
+ var nodes = inj.nodes;
1466
+ var target = () {
1467
+ var t = getelem(nodes, -2);
1468
+ return t == null ? getelem(nodes, -1) : t;
1469
+ }();
1470
+ var tval = <dynamic>[];
1471
+ dynamic rval = <dynamic>[];
1472
+ if (isnode(src)) {
1473
+ if (src is List) {
1474
+ for (var _ in src) {
1475
+ tval.add(clone(childTm));
1476
+ }
1477
+ } else if (src is Map) {
1478
+ src.forEach((k, _) {
1479
+ var cc = clone(childTm);
1480
+ if (ismap(cc)) setprop(cc, S_BANNO, <String, dynamic>{S_KEY: k});
1481
+ tval.add(cc);
1482
+ });
1483
+ }
1484
+ var tcurrent = src is Map
1485
+ ? src.values.toList()
1486
+ : (src is List ? List<dynamic>.from(src) : src);
1487
+ if (tval.isNotEmpty) {
1488
+ var path = inj.path;
1489
+ var ckey = getelem(path, -2);
1490
+ var plist = path is List ? List<dynamic>.from(path) : <dynamic>[];
1491
+ var tpath =
1492
+ plist.isEmpty ? <dynamic>[] : plist.sublist(0, plist.length - 1);
1493
+ var dpath = <dynamic>[S_DTOP];
1494
+ if (srcpath is String && srcpath != S_MT) {
1495
+ for (var p in srcpath.split(S_DT)) {
1496
+ if (p != S_MT) dpath.add(p);
1497
+ }
1498
+ }
1499
+ if (ckey != null) dpath.add('\$:' + jsString(ckey));
1500
+ dynamic tcur = <String, dynamic>{jsString(ckey): tcurrent};
1501
+ if (size(tpath) > 1) {
1502
+ var pkey = getelem(path, -3, S_DTOP);
1503
+ dpath.add('\$:' + jsString(pkey));
1504
+ tcur = <String, dynamic>{jsString(pkey): tcur};
1505
+ }
1506
+ var tinj = _injChild(inj, 0, ckey != null ? [ckey] : <dynamic>[]);
1507
+ tinj.path = tpath;
1508
+ var nlist = nodes is List ? List<dynamic>.from(nodes) : <dynamic>[];
1509
+ tinj.nodes =
1510
+ nlist.isEmpty ? <dynamic>[] : nlist.sublist(0, nlist.length - 1);
1511
+ tinj.parent = size(tinj.nodes) > 0 ? getelem(tinj.nodes, -1) : null;
1512
+ if (ckey != null && tinj.parent != null) setprop(tinj.parent, ckey, tval);
1513
+ tinj.ival = tval;
1514
+ tinj.dpath = dpath;
1515
+ tinj.dparent = tcur;
1516
+ inject(tval, store, tinj);
1517
+ rval = tinj.ival;
1518
+ }
1519
+ }
1520
+ setprop(target, tkey, rval);
1521
+ return (islist(rval) && size(rval) > 0) ? getelem(rval, 0) : null;
1522
+ }
1523
+
1524
+ dynamic _transformPack(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1525
+ var inj = inj0 as Inj;
1526
+ if (inj.mode != S_MKEYPRE || inj.key is! String) return null;
1527
+ var parent = inj.parent;
1528
+ var path = inj.path;
1529
+ var nodes = inj.nodes;
1530
+ var argsVal = getprop(parent, inj.key);
1531
+ if (!islist(argsVal) || size(argsVal) < 2) return null;
1532
+ var srcpath = getelem(argsVal, 0);
1533
+ var origchildspec = getelem(argsVal, 1);
1534
+ var tkey = getelem(path, -2);
1535
+ var pathsize = size(path);
1536
+ var target = () {
1537
+ var t = getelem(nodes, pathsize - 2);
1538
+ return t == null ? getelem(nodes, pathsize - 1) : t;
1539
+ }();
1540
+ var srcstore = getprop(store, inj.base, store);
1541
+ var src0 = getpath(srcstore, srcpath, inj);
1542
+ dynamic src;
1543
+ if (!islist(src0)) {
1544
+ if (ismap(src0)) {
1545
+ var ns = <dynamic>[];
1546
+ for (var p in itemsPairs(src0)) {
1547
+ setprop(p[1], S_BANNO, <String, dynamic>{S_KEY: p[0]});
1548
+ ns.add(p[1]);
1549
+ }
1550
+ src = ns;
1551
+ } else {
1552
+ src = null;
1553
+ }
1554
+ } else {
1555
+ src = src0;
1556
+ }
1557
+ if (src == null) return null;
1558
+ var keypath = getprop(origchildspec, S_BKEY);
1559
+ var childspec = delprop(origchildspec, S_BKEY);
1560
+ var child = getprop(childspec, S_BVAL, childspec);
1561
+ var tval = <String, dynamic>{};
1562
+ for (var p in itemsPairs(src)) {
1563
+ var srckey = p[0];
1564
+ var srcnode = p[1];
1565
+ dynamic k;
1566
+ if (keypath == null) {
1567
+ k = srckey;
1568
+ } else if (keypath is String && keypath.startsWith(S_BT)) {
1569
+ k = inject(
1570
+ keypath,
1571
+ merge([
1572
+ <String, dynamic>{},
1573
+ store,
1574
+ <String, dynamic>{S_DTOP: srcnode}
1575
+ ], 1));
1576
+ } else {
1577
+ k = getpath(srcnode, keypath, inj);
1578
+ }
1579
+ var tchild = clone(child);
1580
+ setprop(tval, k, tchild);
1581
+ var anno = getprop(srcnode, S_BANNO);
1582
+ if (anno == null) {
1583
+ delprop(tchild, S_BANNO);
1584
+ } else {
1585
+ setprop(tchild, S_BANNO, anno);
1586
+ }
1587
+ }
1588
+ dynamic rval = <String, dynamic>{};
1589
+ if (!isempty(tval)) {
1590
+ var tsrc = <String, dynamic>{};
1591
+ var srcList = src is List ? src : <dynamic>[];
1592
+ for (var i = 0; i < srcList.length; i++) {
1593
+ var node = srcList[i];
1594
+ dynamic kn;
1595
+ if (keypath == null) {
1596
+ kn = i;
1597
+ } else if (keypath is String && keypath.startsWith(S_BT)) {
1598
+ kn = inject(
1599
+ keypath,
1600
+ merge([
1601
+ <String, dynamic>{},
1602
+ store,
1603
+ <String, dynamic>{S_DTOP: node}
1604
+ ], 1));
1605
+ } else {
1606
+ kn = getpath(node, keypath, inj);
1607
+ }
1608
+ setprop(tsrc, kn, node);
1609
+ }
1610
+ var tpath = slice(inj.path, -1);
1611
+ var ckey = getelem(inj.path, -2);
1612
+ var dpath = flatten(
1613
+ [S_DTOP, (srcpath as String).split(S_DT), '\$:' + jsString(ckey)]);
1614
+ dynamic tcur = <String, dynamic>{jsString(ckey): tsrc};
1615
+ if (size(tpath) > 1) {
1616
+ var pkey = getelem(inj.path, -3, S_DTOP);
1617
+ (dpath as List).add('\$:' + jsString(pkey));
1618
+ tcur = <String, dynamic>{jsString(pkey): tcur};
1619
+ }
1620
+ var tinj = _injChild(inj, 0, [ckey]);
1621
+ tinj.path = tpath;
1622
+ tinj.nodes = slice(inj.nodes, -1);
1623
+ tinj.parent = getelem(tinj.nodes, -1);
1624
+ tinj.ival = tval;
1625
+ tinj.dpath = dpath;
1626
+ tinj.dparent = tcur;
1627
+ inject(tval, store, tinj);
1628
+ rval = tinj.ival;
1629
+ }
1630
+ setprop(target, tkey, rval);
1631
+ return null;
1632
+ }
1633
+
1634
+ dynamic _transformRef(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1635
+ var inj = inj0 as Inj;
1636
+ if (inj.mode != S_MVAL) return null;
1637
+ var nodes = inj.nodes;
1638
+ var refpath = _lookup(inj.parent, 1);
1639
+ inj.keyi = size(inj.keys);
1640
+ var specFunc = getprop(store, S_DSPEC);
1641
+ if (!isfunc(specFunc)) return null;
1642
+ var spec = specFunc();
1643
+ var refv = getpath(spec, refpath);
1644
+ var hasSub = false;
1645
+ if (isnode(refv)) {
1646
+ walk(refv, after: (k, v, p, pp) {
1647
+ if (v == '`\$REF`') hasSub = true;
1648
+ return v;
1649
+ });
1650
+ }
1651
+ var tref = clone(refv);
1652
+ var cpath = slice(inj.path, 0, size(inj.path) - 3);
1653
+ var tpath = slice(inj.path, 0, size(inj.path) - 1);
1654
+ var tcur = getpath(store, cpath);
1655
+ var tval = getpath(store, tpath);
1656
+ dynamic rval;
1657
+ if (refv != null && (!hasSub || tval != null)) {
1658
+ var cs = _injChild(inj, 0, [getelem(tpath, -1)]);
1659
+ cs.path = tpath;
1660
+ cs.nodes = slice(inj.nodes, 0, size(inj.nodes) - 1);
1661
+ cs.parent = getelem(nodes, -2);
1662
+ cs.ival = tref;
1663
+ cs.dparent = tcur;
1664
+ inject(tref, store, cs);
1665
+ rval = cs.ival;
1666
+ }
1667
+ _injSetval(inj, rval, 2);
1668
+ if (islist(inj.parent) && inj.prior != null) {
1669
+ inj.prior!.keyi = inj.prior!.keyi - 1;
1670
+ }
1671
+ return val;
1672
+ }
1673
+
1674
+ String _jsstr(dynamic v) {
1675
+ if (v == null) return 'null';
1676
+ if (v is bool) return v ? 'true' : 'false';
1677
+ return jsString(v);
1678
+ }
1679
+
1680
+ final Map<String, dynamic Function(dynamic, dynamic)> _FORMATTER = {
1681
+ 'identity': (k, v) => v,
1682
+ 'upper': (k, v) => isnode(v) ? v : _jsstr(v).toUpperCase(),
1683
+ 'lower': (k, v) => isnode(v) ? v : _jsstr(v).toLowerCase(),
1684
+ 'string': (k, v) => isnode(v) ? v : _jsstr(v),
1685
+ 'number': (k, v) {
1686
+ if (isnode(v)) return v;
1687
+ var n = num.tryParse(_jsstr(v)) ?? 0;
1688
+ if (n is double && n.isNaN) n = 0;
1689
+ return (n == n.truncateToDouble()) ? n.toInt() : n;
1690
+ },
1691
+ 'integer': (k, v) {
1692
+ if (isnode(v)) return v;
1693
+ var n = num.tryParse(_jsstr(v)) ?? 0;
1694
+ if (n is double && n.isNaN) n = 0;
1695
+ return n.toInt();
1696
+ },
1697
+ 'concat': (k, v) {
1698
+ if (k == null && islist(v)) {
1699
+ return join(itemsV(v, (n) => isnode(n[1]) ? S_MT : _jsstr(n[1])), S_MT);
1700
+ }
1701
+ return v;
1702
+ },
1703
+ };
1704
+
1705
+ bool checkPlacement(int modes, String ijname, int parentTypes, Inj inj) {
1706
+ var modenum = _MODE_TO_NUM[inj.mode] ?? 0;
1707
+ if ((modes & modenum) == 0) {
1708
+ var allowed = [M_KEYPRE, M_KEYPOST, M_VAL].where((m) => (modes & m) != 0);
1709
+ var placements = allowed.map((m) => m == M_VAL ? 'value' : 'key').join(',');
1710
+ var cur = modenum == M_VAL ? 'value' : 'key';
1711
+ setprop(inj.errs, size(inj.errs),
1712
+ '\$$ijname: invalid placement as $cur, expected: $placements.');
1713
+ return false;
1714
+ }
1715
+ if (!isempty(parentTypes)) {
1716
+ var ptype = typify(inj.parent);
1717
+ if ((parentTypes & ptype) == 0) {
1718
+ setprop(inj.errs, size(inj.errs),
1719
+ '\$$ijname: invalid placement in parent ${typename(ptype)}, expected: ${typename(parentTypes)}.');
1720
+ return false;
1721
+ }
1722
+ }
1723
+ return true;
1724
+ }
1725
+
1726
+ dynamic injectorArgs(List<int> argTypes, dynamic args) {
1727
+ var numargs = argTypes.length;
1728
+ var found = List<dynamic>.filled(1 + numargs, null, growable: true);
1729
+ for (var argi = 0; argi < numargs; argi++) {
1730
+ var arg = getelem(args, argi);
1731
+ var argType = typify(arg);
1732
+ if ((argTypes[argi] & argType) == 0) {
1733
+ found[0] =
1734
+ 'invalid argument: ${stringify(arg, 22)} (${typename(argType)} at position ${1 + argi}) is not of type: ${typename(argTypes[argi])}.';
1735
+ return found;
1736
+ }
1737
+ found[1 + argi] = arg;
1738
+ }
1739
+ return found;
1740
+ }
1741
+
1742
+ Inj injectChild(dynamic child, dynamic store, Inj inj) {
1743
+ var cinj = inj;
1744
+ if (inj.prior != null) {
1745
+ if (inj.prior!.prior != null) {
1746
+ var c = _injChild(inj.prior!.prior!, inj.prior!.keyi, inj.prior!.keys);
1747
+ c.ival = child;
1748
+ setprop(c.parent, inj.prior!.key, child);
1749
+ cinj = c;
1750
+ } else {
1751
+ var c = _injChild(inj.prior!, inj.keyi, inj.keys);
1752
+ c.ival = child;
1753
+ setprop(c.parent, inj.key, child);
1754
+ cinj = c;
1755
+ }
1756
+ }
1757
+ inject(child, store, cinj);
1758
+ return cinj;
1759
+ }
1760
+
1761
+ dynamic _transformFormat(
1762
+ dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1763
+ var inj = inj0 as Inj;
1764
+ slice(inj.keys, 0, 1, true);
1765
+ if (inj.mode != S_MVAL) return null;
1766
+ var name = _lookup(inj.parent, 1);
1767
+ var child = _lookup(inj.parent, 2);
1768
+ var tkey = getelem(inj.path, -2);
1769
+ var target = () {
1770
+ var t = getelem(inj.nodes, -2);
1771
+ return t == null ? getelem(inj.nodes, -1) : t;
1772
+ }();
1773
+ var cinj = injectChild(child, store, inj);
1774
+ var resolved = cinj.ival;
1775
+ dynamic Function(dynamic, dynamic)? formatter;
1776
+ if ((T_function & typify(name)) > 0) {
1777
+ formatter = (k, v) => name(_dummyInj(), v, jsString(k), null);
1778
+ } else {
1779
+ formatter = _FORMATTER[jsString(name)];
1780
+ }
1781
+ if (formatter == null) {
1782
+ setprop(inj.errs, size(inj.errs),
1783
+ '\$FORMAT: unknown format: ${jsString(name)}.');
1784
+ return null;
1785
+ }
1786
+ var out = walk(resolved, after: (k, v, p, pp) => formatter!(k, v));
1787
+ setprop(target, tkey, out);
1788
+ return out;
1789
+ }
1790
+
1791
+ dynamic _transformApply(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1792
+ var inj = inj0 as Inj;
1793
+ if (!checkPlacement(M_VAL, 'APPLY', T_list, inj)) return null;
1794
+ var res = injectorArgs([T_function, T_any], slice(inj.parent, 1));
1795
+ var err = getelem(res, 0);
1796
+ var applyFn = getelem(res, 1);
1797
+ var child = size(res) > 2 ? getelem(res, 2) : null;
1798
+ if (err != null) {
1799
+ setprop(inj.errs, size(inj.errs), '\$APPLY: ' + jsString(err));
1800
+ return null;
1801
+ }
1802
+ var tkey = getelem(inj.path, -2);
1803
+ var target = () {
1804
+ var t = getelem(inj.nodes, -2);
1805
+ return t == null ? getelem(inj.nodes, -1) : t;
1806
+ }();
1807
+ var cinj = injectChild(child, store, inj);
1808
+ var resolved = cinj.ival;
1809
+ var out = applyFn(resolved, store, cinj);
1810
+ setprop(target, tkey, out);
1811
+ return out;
1812
+ }
1813
+
1814
+ dynamic transform(dynamic data, dynamic spec0, [dynamic injdef]) {
1815
+ var origspec = spec0;
1816
+ var spec = clone(spec0);
1817
+ var extra = injdef != null ? getprop(injdef, 'extra') : null;
1818
+ var collect = injdef != null && getprop(injdef, 'errs') != null;
1819
+ var errs = collect ? getprop(injdef, 'errs') : <dynamic>[];
1820
+ var extraTransforms = <String, dynamic>{};
1821
+ var extraData = <String, dynamic>{};
1822
+ if (extra != null) {
1823
+ for (var p in itemsPairs(extra)) {
1824
+ if ((p[0] as String).startsWith(S_DS)) {
1825
+ extraTransforms[p[0]] = p[1];
1826
+ } else {
1827
+ extraData[p[0]] = p[1];
1828
+ }
1829
+ }
1830
+ }
1831
+ var dataClone =
1832
+ merge([isempty(extraData) ? null : clone(extraData), clone(data)]);
1833
+ var store = <String, dynamic>{};
1834
+ store[S_DTOP] = dataClone;
1835
+ store[S_DSPEC] = ([a, b, c, d]) => origspec;
1836
+ store['\$BT'] = ([a, b, c, d]) => S_BT;
1837
+ store['\$DS'] = ([a, b, c, d]) => S_DS;
1838
+ store['\$WHEN'] = ([a, b, c, d]) => '1970-01-01T00:00:00.000Z';
1839
+ store['\$DELETE'] = _transformDelete;
1840
+ store['\$COPY'] = _transformCopy;
1841
+ store['\$KEY'] = _transformKey;
1842
+ store['\$ANNO'] = _transformAnno;
1843
+ store['\$MERGE'] = _transformMerge;
1844
+ store['\$EACH'] = _transformEach;
1845
+ store['\$PACK'] = _transformPack;
1846
+ store['\$REF'] = _transformRef;
1847
+ store['\$FORMAT'] = _transformFormat;
1848
+ store['\$APPLY'] = _transformApply;
1849
+ for (var p in itemsPairs(extraTransforms)) {
1850
+ store[p[0]] = p[1];
1851
+ }
1852
+ store[S_DERRS] = errs;
1853
+
1854
+ var idef = <String, dynamic>{};
1855
+ if (injdef is Map) {
1856
+ injdef.forEach((k, v) => idef[k.toString()] = v);
1857
+ }
1858
+ idef['errs'] = errs;
1859
+ var out = inject(spec, store, idef);
1860
+ if (size(errs) > 0 && !collect) {
1861
+ throw StructError(join(errs, ' | '));
1862
+ }
1863
+ return out;
1864
+ }
1865
+
1866
+ class StructError implements Exception {
1867
+ final String message;
1868
+ StructError(this.message);
1869
+ @override
1870
+ String toString() => message;
1871
+ }
1872
+
1873
+ // ---------------------------------------------------------------------------
1874
+ // validate
1875
+ // ---------------------------------------------------------------------------
1876
+
1877
+ String _invalidTypeMsg(
1878
+ dynamic path, String needtype, int vt, dynamic v, String whence) {
1879
+ var vs = v == null ? 'no value' : stringify(v);
1880
+ return 'Expected ' +
1881
+ (size(path) > 1 ? 'field ' + pathify(path, 1) + ' to be ' : '') +
1882
+ needtype +
1883
+ ', but found ' +
1884
+ (v != null ? typename(vt) + S_VIZ : '') +
1885
+ vs +
1886
+ '.';
1887
+ }
1888
+
1889
+ void _pushErr(Inj inj, String msg) => setprop(inj.errs, size(inj.errs), msg);
1890
+
1891
+ dynamic _validateString(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1892
+ var inj = inj0 as Inj;
1893
+ var out = _lookup(inj.dparent, inj.key);
1894
+ var t = typify(out);
1895
+ if ((T_string & t) == 0) {
1896
+ _pushErr(inj, _invalidTypeMsg(inj.path, S_string, t, out, 'V1010'));
1897
+ return null;
1898
+ }
1899
+ if (out == S_MT) {
1900
+ _pushErr(inj, 'Empty string at ' + pathify(inj.path, 1));
1901
+ return null;
1902
+ }
1903
+ return out;
1904
+ }
1905
+
1906
+ dynamic _validateType(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1907
+ var inj = inj0 as Inj;
1908
+ var tname = (ref is String && ref.length > 1)
1909
+ ? ref.substring(1).toLowerCase()
1910
+ : 'any';
1911
+ var idx = _TYPENAME.indexOf(tname);
1912
+ var typev0 = idx >= 0 ? (1 << (31 - idx)) : 0;
1913
+ var typev = tname == S_nil ? (typev0 | T_null) : typev0;
1914
+ var out = _lookup(inj.dparent, inj.key);
1915
+ var t = typify(out);
1916
+ if ((t & typev) == 0) {
1917
+ _pushErr(inj, _invalidTypeMsg(inj.path, tname, t, out, 'V1001'));
1918
+ return null;
1919
+ }
1920
+ return out;
1921
+ }
1922
+
1923
+ dynamic _validateAny(dynamic inj0, dynamic val, dynamic ref, dynamic store) =>
1924
+ _lookup((inj0 as Inj).dparent, inj0.key);
1925
+
1926
+ dynamic _validateChild(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1927
+ var inj = inj0 as Inj;
1928
+ var parent = inj.parent;
1929
+ var key = inj.key;
1930
+ var path = inj.path;
1931
+ var keys = inj.keys;
1932
+ if (inj.mode == S_MKEYPRE) {
1933
+ var childtm = getprop(parent, key);
1934
+ var pkey = getelem(path, -2);
1935
+ var tval = getprop(inj.dparent, pkey);
1936
+ if (tval == null) {
1937
+ for (var ckey in keysof(<String, dynamic>{})) {
1938
+ setprop(parent, ckey, clone(childtm));
1939
+ setprop(keys, size(keys), ckey);
1940
+ }
1941
+ delprop(parent, key);
1942
+ return null;
1943
+ } else if (!ismap(tval)) {
1944
+ _pushErr(
1945
+ inj,
1946
+ _invalidTypeMsg(slice(path, 0, size(path) - 1), S_object,
1947
+ typify(tval), tval, 'V0220'));
1948
+ return null;
1949
+ } else {
1950
+ for (var ckey in keysof(tval)) {
1951
+ setprop(parent, ckey, clone(childtm));
1952
+ setprop(keys, size(keys), ckey);
1953
+ }
1954
+ delprop(parent, key);
1955
+ return null;
1956
+ }
1957
+ } else if (inj.mode == S_MVAL) {
1958
+ var childtm = getprop(parent, 1);
1959
+ if (!islist(parent)) {
1960
+ _pushErr(inj, 'Invalid \$CHILD as value');
1961
+ return null;
1962
+ } else if (inj.dparent == null) {
1963
+ (parent as List).clear();
1964
+ return null;
1965
+ } else if (!islist(inj.dparent)) {
1966
+ _pushErr(
1967
+ inj,
1968
+ _invalidTypeMsg(slice(path, 0, size(path) - 1), S_list,
1969
+ typify(inj.dparent), inj.dparent, 'V0230'));
1970
+ inj.keyi = size(parent);
1971
+ return inj.dparent;
1972
+ } else {
1973
+ for (var p in itemsPairs(inj.dparent)) {
1974
+ setprop(parent, p[0], clone(childtm));
1975
+ }
1976
+ var n = size(inj.dparent);
1977
+ var pl = parent as List;
1978
+ while (pl.length > n) {
1979
+ pl.removeLast();
1980
+ }
1981
+ inj.keyi = 0;
1982
+ return getprop(inj.dparent, 0);
1983
+ }
1984
+ }
1985
+ return null;
1986
+ }
1987
+
1988
+ dynamic _validateOne(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
1989
+ var inj = inj0 as Inj;
1990
+ if (inj.mode != S_MVAL) return null;
1991
+ var parent = inj.parent;
1992
+ if (!islist(parent) || inj.keyi != 0) {
1993
+ _pushErr(
1994
+ inj,
1995
+ 'The \$ONE validator at field ' +
1996
+ pathify(inj.path, 1, 1) +
1997
+ ' must be the first element of an array.');
1998
+ return null;
1999
+ }
2000
+ inj.keyi = size(inj.keys);
2001
+ _injSetval(inj, inj.dparent, 2);
2002
+ inj.path = slice(inj.path, 0, size(inj.path) - 1);
2003
+ inj.key = getelem(inj.path, -1);
2004
+ var tvals = slice(parent, 1);
2005
+ if (size(tvals) == 0) {
2006
+ _pushErr(
2007
+ inj,
2008
+ 'The \$ONE validator at field ' +
2009
+ pathify(inj.path, 1, 1) +
2010
+ ' must have at least one argument.');
2011
+ return null;
2012
+ }
2013
+ var matched = false;
2014
+ for (var tv in (tvals as List)) {
2015
+ if (matched) break;
2016
+ var terrs = <dynamic>[];
2017
+ var vstore = merge([<String, dynamic>{}, store], 1);
2018
+ setprop(vstore, S_DTOP, inj.dparent);
2019
+ var vcurrent = validate(
2020
+ inj.dparent, tv, {'extra': vstore, 'errs': terrs, 'meta': inj.meta});
2021
+ _injSetval(inj, vcurrent, -2);
2022
+ if (size(terrs) == 0) matched = true;
2023
+ }
2024
+ if (!matched) {
2025
+ var valdesc = tvals.map((x) => stringify(x)).join(', ');
2026
+ valdesc = valdesc.replaceAllMapped(
2027
+ _R_TRANSFORM_NAME, (m) => m.group(1)!.toLowerCase());
2028
+ _pushErr(
2029
+ inj,
2030
+ _invalidTypeMsg(inj.path, (size(tvals) > 1 ? 'one of ' : '') + valdesc,
2031
+ typify(inj.dparent), inj.dparent, 'V0210'));
2032
+ }
2033
+ return null;
2034
+ }
2035
+
2036
+ dynamic _validateExact(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
2037
+ var inj = inj0 as Inj;
2038
+ if (inj.mode != S_MVAL) {
2039
+ delprop(inj.parent, inj.key);
2040
+ return null;
2041
+ }
2042
+ var parent = inj.parent;
2043
+ if (!islist(parent) || inj.keyi != 0) {
2044
+ _pushErr(
2045
+ inj,
2046
+ 'The \$EXACT validator at field ' +
2047
+ pathify(inj.path, 1, 1) +
2048
+ ' must be the first element of an array.');
2049
+ return null;
2050
+ }
2051
+ inj.keyi = size(inj.keys);
2052
+ _injSetval(inj, inj.dparent, 2);
2053
+ inj.path = slice(inj.path, 0, size(inj.path) - 1);
2054
+ inj.key = getelem(inj.path, -1);
2055
+ var tvals = slice(parent, 1);
2056
+ if (size(tvals) == 0) {
2057
+ _pushErr(
2058
+ inj,
2059
+ 'The \$EXACT validator at field ' +
2060
+ pathify(inj.path, 1, 1) +
2061
+ ' must have at least one argument.');
2062
+ return null;
2063
+ }
2064
+ var matched = false;
2065
+ for (var tv in (tvals as List)) {
2066
+ if (!matched && veq(tv, inj.dparent)) matched = true;
2067
+ }
2068
+ if (!matched) {
2069
+ var valdesc = tvals.map((x) => stringify(x)).join(', ');
2070
+ valdesc = valdesc.replaceAllMapped(
2071
+ _R_TRANSFORM_NAME, (m) => m.group(1)!.toLowerCase());
2072
+ _pushErr(
2073
+ inj,
2074
+ _invalidTypeMsg(
2075
+ inj.path,
2076
+ (size(inj.path) > 1 ? '' : 'value ') +
2077
+ 'exactly equal to ' +
2078
+ (size(tvals) == 1 ? '' : 'one of ') +
2079
+ valdesc,
2080
+ typify(inj.dparent),
2081
+ inj.dparent,
2082
+ 'V0110'));
2083
+ }
2084
+ return null;
2085
+ }
2086
+
2087
+ bool veq(dynamic a, dynamic b) {
2088
+ if (a == null && b == null) return true;
2089
+ if (a is bool || b is bool) return a == b;
2090
+ if (a is num && b is num) return a == b;
2091
+ if (a is String && b is String) return a == b;
2092
+ if (a is List && b is List) {
2093
+ if (a.length != b.length) return false;
2094
+ for (var i = 0; i < a.length; i++) {
2095
+ if (!veq(a[i], b[i])) return false;
2096
+ }
2097
+ return true;
2098
+ }
2099
+ if (a is Map && b is Map) {
2100
+ if (a.length != b.length) return false;
2101
+ for (var k in a.keys) {
2102
+ if (!b.containsKey(k) || !veq(a[k], b[k])) return false;
2103
+ }
2104
+ return true;
2105
+ }
2106
+ return identical(a, b);
2107
+ }
2108
+
2109
+ void _validation(dynamic pval, dynamic key, dynamic parent, dynamic inj0) {
2110
+ var inj = inj0 as Inj;
2111
+ if (isSkip(pval)) return;
2112
+ var exact = getprop(inj.meta, S_BEXACT, false);
2113
+ var cval = getprop(inj.dparent, key);
2114
+ var exactB = exact == true;
2115
+ if (!exactB && cval == null) return;
2116
+ var ptype = typify(pval);
2117
+ if ((T_string & ptype) > 0 && jsString(pval).contains(S_DS)) return;
2118
+ var ctype = typify(cval);
2119
+ if (ptype != ctype && pval != null) {
2120
+ _pushErr(
2121
+ inj, _invalidTypeMsg(inj.path, typename(ptype), ctype, cval, 'V0010'));
2122
+ } else if (ismap(cval)) {
2123
+ if (!ismap(pval)) {
2124
+ _pushErr(inj,
2125
+ _invalidTypeMsg(inj.path, typename(ptype), ctype, cval, 'V0020'));
2126
+ } else {
2127
+ var ckeys = keysof(cval);
2128
+ var pkeys = keysof(pval);
2129
+ if (pkeys.isNotEmpty && getprop(pval, S_BOPEN) != true) {
2130
+ // A child key is "unexpected" only when the shape does not CONTAIN it.
2131
+ // Test presence, not `_lookup(...) == null`: a key that is present in
2132
+ // the shape but maps to a null value (e.g. a record whose optional
2133
+ // `serial_number` is null, merged into the shape by a `$AND` select)
2134
+ // must NOT be rejected as unexpected.
2135
+ var badkeys = ckeys.where((ck) =>
2136
+ !(pval is Map && pval.containsKey(_mapKey(ck)))).toList();
2137
+ if (badkeys.isNotEmpty) {
2138
+ _pushErr(
2139
+ inj,
2140
+ 'Unexpected keys at field ' +
2141
+ pathify(inj.path, 1) +
2142
+ S_VIZ +
2143
+ badkeys.join(', '));
2144
+ }
2145
+ } else {
2146
+ merge([pval, cval]);
2147
+ if (isnode(pval)) delprop(pval, S_BOPEN);
2148
+ }
2149
+ }
2150
+ } else if (islist(cval)) {
2151
+ if (!islist(pval)) {
2152
+ _pushErr(inj,
2153
+ _invalidTypeMsg(inj.path, typename(ptype), ctype, cval, 'V0030'));
2154
+ }
2155
+ } else if (exactB) {
2156
+ if (!veq(cval, pval)) {
2157
+ var pathmsg =
2158
+ size(inj.path) > 1 ? 'at field ' + pathify(inj.path, 1) + ': ' : '';
2159
+ _pushErr(
2160
+ inj,
2161
+ 'Value ' +
2162
+ pathmsg +
2163
+ jsString(cval) +
2164
+ ' should equal ' +
2165
+ jsString(pval) +
2166
+ '.');
2167
+ }
2168
+ } else {
2169
+ setprop(parent, key, cval);
2170
+ }
2171
+ }
2172
+
2173
+ dynamic _validateHandler(
2174
+ dynamic inj0, dynamic val, dynamic ref, dynamic store) {
2175
+ var inj = inj0 as Inj;
2176
+ var m = (ref is String) ? _R_META_PATH.firstMatch(ref) : null;
2177
+ if (m != null) {
2178
+ if (m.group(2) == '=') {
2179
+ _injSetval(inj, [S_BEXACT, val]);
2180
+ } else {
2181
+ _injSetval(inj, val);
2182
+ }
2183
+ inj.keyi = -1;
2184
+ return SKIP;
2185
+ }
2186
+ return injectHandler(inj, val, ref, store);
2187
+ }
2188
+
2189
+ dynamic validate(dynamic data, dynamic spec, [dynamic injdef]) {
2190
+ var extra = getprop(injdef, 'extra');
2191
+ var collect = injdef != null && getprop(injdef, 'errs') != null;
2192
+ var errs = collect ? getprop(injdef, 'errs') : <dynamic>[];
2193
+ var base = <String, dynamic>{};
2194
+ for (var k in [
2195
+ '\$DELETE',
2196
+ '\$COPY',
2197
+ '\$KEY',
2198
+ '\$META',
2199
+ '\$MERGE',
2200
+ '\$EACH',
2201
+ '\$PACK'
2202
+ ]) {
2203
+ base[k] = null;
2204
+ }
2205
+ base['\$STRING'] = _validateString;
2206
+ for (var k in [
2207
+ '\$NUMBER',
2208
+ '\$INTEGER',
2209
+ '\$DECIMAL',
2210
+ '\$BOOLEAN',
2211
+ '\$NULL',
2212
+ '\$NIL',
2213
+ '\$MAP',
2214
+ '\$LIST',
2215
+ '\$FUNCTION',
2216
+ '\$INSTANCE'
2217
+ ]) {
2218
+ base[k] = _validateType;
2219
+ }
2220
+ base['\$ANY'] = _validateAny;
2221
+ base['\$CHILD'] = _validateChild;
2222
+ base['\$ONE'] = _validateOne;
2223
+ base['\$EXACT'] = _validateExact;
2224
+ var store = merge([
2225
+ base,
2226
+ extra == null ? <String, dynamic>{} : extra,
2227
+ <String, dynamic>{S_DERRS: errs}
2228
+ ], 1);
2229
+ var meta = getprop(injdef, 'meta', <String, dynamic>{});
2230
+ setprop(meta, S_BEXACT, getprop(meta, S_BEXACT, false));
2231
+ var out = transform(data, spec, {
2232
+ 'meta': meta,
2233
+ 'extra': store,
2234
+ 'modify': _validation,
2235
+ 'handler': _validateHandler,
2236
+ 'errs': errs,
2237
+ });
2238
+ if (size(errs) > 0 && !collect) {
2239
+ throw StructError(join(errs, ' | '));
2240
+ }
2241
+ return out;
2242
+ }
2243
+
2244
+ // ---------------------------------------------------------------------------
2245
+ // select
2246
+ // ---------------------------------------------------------------------------
2247
+
2248
+ dynamic _selectAnd(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
2249
+ var inj = inj0 as Inj;
2250
+ if (inj.mode == S_MKEYPRE) {
2251
+ var terms = getprop(inj.parent, inj.key);
2252
+ var ppath = slice(inj.path, -1);
2253
+ var point = getpath(store, ppath);
2254
+ var vstore = merge([<String, dynamic>{}, store], 1);
2255
+ setprop(vstore, S_DTOP, point);
2256
+ for (var p in itemsPairs(terms)) {
2257
+ var terrs = <dynamic>[];
2258
+ validate(point, p[1], {'extra': vstore, 'errs': terrs, 'meta': inj.meta});
2259
+ if (size(terrs) != 0) {
2260
+ _pushErr(
2261
+ inj,
2262
+ 'AND:' +
2263
+ pathify(ppath) +
2264
+ '⨯' +
2265
+ stringify(point) +
2266
+ ' fail:' +
2267
+ stringify(terms));
2268
+ }
2269
+ }
2270
+ var gkey = getelem(inj.path, -2);
2271
+ var gp = getelem(inj.nodes, -2);
2272
+ setprop(gp, gkey, point);
2273
+ }
2274
+ return null;
2275
+ }
2276
+
2277
+ dynamic _selectOr(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
2278
+ var inj = inj0 as Inj;
2279
+ if (inj.mode == S_MKEYPRE) {
2280
+ var terms = getprop(inj.parent, inj.key);
2281
+ var ppath = slice(inj.path, -1);
2282
+ var point = getpath(store, ppath);
2283
+ var vstore = merge([<String, dynamic>{}, store], 1);
2284
+ setprop(vstore, S_DTOP, point);
2285
+ var done = false;
2286
+ for (var p in itemsPairs(terms)) {
2287
+ if (done) break;
2288
+ var terrs = <dynamic>[];
2289
+ validate(point, p[1], {'extra': vstore, 'errs': terrs, 'meta': inj.meta});
2290
+ if (size(terrs) == 0) {
2291
+ var gkey = getelem(inj.path, -2);
2292
+ var gp = getelem(inj.nodes, -2);
2293
+ setprop(gp, gkey, point);
2294
+ done = true;
2295
+ }
2296
+ }
2297
+ if (!done) {
2298
+ _pushErr(
2299
+ inj,
2300
+ 'OR:' +
2301
+ pathify(ppath) +
2302
+ '⨯' +
2303
+ stringify(point) +
2304
+ ' fail:' +
2305
+ stringify(terms));
2306
+ }
2307
+ }
2308
+ return null;
2309
+ }
2310
+
2311
+ dynamic _selectNot(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
2312
+ var inj = inj0 as Inj;
2313
+ if (inj.mode == S_MKEYPRE) {
2314
+ var term = getprop(inj.parent, inj.key);
2315
+ var ppath = slice(inj.path, -1);
2316
+ var point = getpath(store, ppath);
2317
+ var vstore = merge([<String, dynamic>{}, store], 1);
2318
+ setprop(vstore, S_DTOP, point);
2319
+ var terrs = <dynamic>[];
2320
+ validate(point, term, {'extra': vstore, 'errs': terrs, 'meta': inj.meta});
2321
+ if (size(terrs) == 0) {
2322
+ _pushErr(
2323
+ inj,
2324
+ 'NOT:' +
2325
+ pathify(ppath) +
2326
+ '⨯' +
2327
+ stringify(point) +
2328
+ ' fail:' +
2329
+ stringify(term));
2330
+ }
2331
+ var gkey = getelem(inj.path, -2);
2332
+ var gp = getelem(inj.nodes, -2);
2333
+ setprop(gp, gkey, point);
2334
+ }
2335
+ return null;
2336
+ }
2337
+
2338
+ bool _numCmp(dynamic a, dynamic b, String op) {
2339
+ if (a is num && b is num) {
2340
+ switch (op) {
2341
+ case 'gt':
2342
+ return a > b;
2343
+ case 'lt':
2344
+ return a < b;
2345
+ case 'gte':
2346
+ return a >= b;
2347
+ case 'lte':
2348
+ return a <= b;
2349
+ }
2350
+ }
2351
+ return false;
2352
+ }
2353
+
2354
+ dynamic _selectCmp(dynamic inj0, dynamic val, dynamic ref, dynamic store) {
2355
+ var inj = inj0 as Inj;
2356
+ if (inj.mode == S_MKEYPRE) {
2357
+ var term = getprop(inj.parent, inj.key);
2358
+ var gkey = getelem(inj.path, -2);
2359
+ var ppath = slice(inj.path, -1);
2360
+ var point = getpath(store, ppath);
2361
+ bool pass;
2362
+ if (ref == '\$GT') {
2363
+ pass = _numCmp(point, term, 'gt');
2364
+ } else if (ref == '\$LT') {
2365
+ pass = _numCmp(point, term, 'lt');
2366
+ } else if (ref == '\$GTE') {
2367
+ pass = _numCmp(point, term, 'gte');
2368
+ } else if (ref == '\$LTE') {
2369
+ pass = _numCmp(point, term, 'lte');
2370
+ } else if (ref == '\$LIKE') {
2371
+ pass = term is String ? RegExp(term).hasMatch(stringify(point)) : false;
2372
+ } else {
2373
+ pass = false;
2374
+ }
2375
+ if (pass) {
2376
+ var gp = getelem(inj.nodes, -2);
2377
+ setprop(gp, gkey, point);
2378
+ } else {
2379
+ _pushErr(
2380
+ inj,
2381
+ 'CMP: ' +
2382
+ pathify(ppath) +
2383
+ '⨯' +
2384
+ stringify(point) +
2385
+ ' fail:' +
2386
+ jsString(ref) +
2387
+ ' ' +
2388
+ stringify(term));
2389
+ }
2390
+ }
2391
+ return null;
2392
+ }
2393
+
2394
+ dynamic select(dynamic children0, dynamic query) {
2395
+ if (!isnode(children0)) return <dynamic>[];
2396
+ dynamic children;
2397
+ if (ismap(children0)) {
2398
+ children = itemsPairs(children0).map((p) {
2399
+ setprop(p[1], S_DKEY, p[0]);
2400
+ return p[1];
2401
+ }).toList();
2402
+ } else {
2403
+ var src = children0 as List;
2404
+ var out = <dynamic>[];
2405
+ for (var i = 0; i < src.length; i++) {
2406
+ var n = src[i];
2407
+ if (ismap(n)) {
2408
+ setprop(n, S_DKEY, i);
2409
+ out.add(n);
2410
+ } else {
2411
+ out.add(n);
2412
+ }
2413
+ }
2414
+ children = out;
2415
+ }
2416
+ var results = <dynamic>[];
2417
+ var extra = <String, dynamic>{
2418
+ '\$AND': _selectAnd,
2419
+ '\$OR': _selectOr,
2420
+ '\$NOT': _selectNot,
2421
+ '\$GT': _selectCmp,
2422
+ '\$LT': _selectCmp,
2423
+ '\$GTE': _selectCmp,
2424
+ '\$LTE': _selectCmp,
2425
+ '\$LIKE': _selectCmp,
2426
+ };
2427
+ var q = clone(query);
2428
+ walk(q, after: (k, v, p, pp) {
2429
+ if (ismap(v)) setprop(v, S_BOPEN, getprop(v, S_BOPEN, true));
2430
+ return v;
2431
+ });
2432
+ for (var child in (children as List)) {
2433
+ var errs = <dynamic>[];
2434
+ var injdef = {
2435
+ 'errs': errs,
2436
+ 'meta': <String, dynamic>{S_BEXACT: true},
2437
+ 'extra': extra,
2438
+ };
2439
+ validate(child, clone(q), injdef);
2440
+ if (size(errs) == 0) results.add(child);
2441
+ }
2442
+ return results;
2443
+ }
2444
+
2445
+ // ---------------------------------------------------------------------------
2446
+ // builders
2447
+ // ---------------------------------------------------------------------------
2448
+
2449
+ dynamic jm(List<dynamic> kv) {
2450
+ var m = <String, dynamic>{};
2451
+ var n = kv.length;
2452
+ for (var i = 0; i < n; i += 2) {
2453
+ var k0 = kv[i];
2454
+ var k = k0 == null ? 'null' : (k0 is String ? k0 : stringify(k0));
2455
+ m[k] = (i + 1 < n) ? kv[i + 1] : null;
2456
+ }
2457
+ return m;
2458
+ }
2459
+
2460
+ dynamic jt(List<dynamic> v) => List<dynamic>.from(v);
2461
+
2462
+ String tn(int t) => typename(t);