@credibledata/cred-cli 0.0.103 → 0.0.105

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 (430) hide show
  1. package/README.md +106 -1
  2. package/dist/agent-contract.spec.js +548 -0
  3. package/dist/agent-contract.spec.js.map +1 -0
  4. package/dist/browser.js +72 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/browser.spec.js +125 -0
  7. package/dist/browser.spec.js.map +1 -0
  8. package/dist/client/api.js +4137 -1159
  9. package/dist/client/api.js.map +1 -1
  10. package/dist/client-codeassist/api.js +476 -0
  11. package/dist/client-codeassist/api.js.map +1 -0
  12. package/dist/client-codeassist/base.js +69 -0
  13. package/dist/client-codeassist/base.js.map +1 -0
  14. package/dist/client-codeassist/common.js +162 -0
  15. package/dist/client-codeassist/common.js.map +1 -0
  16. package/dist/client-codeassist/configuration.js +44 -0
  17. package/dist/client-codeassist/configuration.js.map +1 -0
  18. package/dist/client-codeassist/index.js +32 -0
  19. package/dist/client-codeassist/index.js.map +1 -0
  20. package/dist/clientconfiguration.js +17 -289
  21. package/dist/clientconfiguration.js.map +1 -1
  22. package/dist/clientconfiguration.spec.js +35 -96
  23. package/dist/clientconfiguration.spec.js.map +1 -1
  24. package/dist/commands/add.js +103 -3
  25. package/dist/commands/add.js.map +1 -1
  26. package/dist/commands/add.spec.js +113 -0
  27. package/dist/commands/add.spec.js.map +1 -0
  28. package/dist/commands/connection/createconnections.js +104 -7
  29. package/dist/commands/connection/createconnections.js.map +1 -1
  30. package/dist/commands/connection/createconnections.spec.js +35 -1
  31. package/dist/commands/connection/createconnections.spec.js.map +1 -1
  32. package/dist/commands/connection/deleteconnection.js +4 -2
  33. package/dist/commands/connection/deleteconnection.js.map +1 -1
  34. package/dist/commands/connection/deleteconnection.spec.js +6 -1
  35. package/dist/commands/connection/deleteconnection.spec.js.map +1 -1
  36. package/dist/commands/connection/listconnections.js +2 -0
  37. package/dist/commands/connection/listconnections.js.map +1 -1
  38. package/dist/commands/connection/updateconnection.js +365 -0
  39. package/dist/commands/connection/updateconnection.js.map +1 -0
  40. package/dist/commands/connection/updateconnection.spec.js +625 -0
  41. package/dist/commands/connection/updateconnection.spec.js.map +1 -0
  42. package/dist/commands/database/createdatabase.js +52 -0
  43. package/dist/commands/database/createdatabase.js.map +1 -0
  44. package/dist/commands/database/database.spec.js +267 -0
  45. package/dist/commands/database/database.spec.js.map +1 -0
  46. package/dist/commands/database/deletedatabase.js +91 -0
  47. package/dist/commands/database/deletedatabase.js.map +1 -0
  48. package/dist/commands/database/getdatabase.js +97 -0
  49. package/dist/commands/database/getdatabase.js.map +1 -0
  50. package/dist/commands/database/listdatabases.js +36 -0
  51. package/dist/commands/database/listdatabases.js.map +1 -0
  52. package/dist/commands/database/shared.js +125 -0
  53. package/dist/commands/database/shared.js.map +1 -0
  54. package/dist/commands/database/shared.spec.js +109 -0
  55. package/dist/commands/database/shared.spec.js.map +1 -0
  56. package/dist/commands/database/updatedatabase.js +39 -0
  57. package/dist/commands/database/updatedatabase.js.map +1 -0
  58. package/dist/commands/environment/createenvironment.js +59 -28
  59. package/dist/commands/environment/createenvironment.js.map +1 -1
  60. package/dist/commands/environment/createenvironment.spec.js +29 -0
  61. package/dist/commands/environment/createenvironment.spec.js.map +1 -1
  62. package/dist/commands/environment/deleteenvironment.js +3 -2
  63. package/dist/commands/environment/deleteenvironment.js.map +1 -1
  64. package/dist/commands/environment/deleteenvironment.spec.js +5 -1
  65. package/dist/commands/environment/deleteenvironment.spec.js.map +1 -1
  66. package/dist/commands/environment/getenvironment.js +1 -0
  67. package/dist/commands/environment/getenvironment.js.map +1 -1
  68. package/dist/commands/environment/listenvironments.js +40 -8
  69. package/dist/commands/environment/listenvironments.js.map +1 -1
  70. package/dist/commands/environment/listenvironments.spec.js +41 -2
  71. package/dist/commands/environment/listenvironments.spec.js.map +1 -1
  72. package/dist/commands/environment/setenvironment.js +145 -6
  73. package/dist/commands/environment/setenvironment.js.map +1 -1
  74. package/dist/commands/environment/setenvironment.spec.js +256 -8
  75. package/dist/commands/environment/setenvironment.spec.js.map +1 -1
  76. package/dist/commands/environment/updateenvironment.js +12 -8
  77. package/dist/commands/environment/updateenvironment.js.map +1 -1
  78. package/dist/commands/environment/updateenvironment.spec.js +36 -2
  79. package/dist/commands/environment/updateenvironment.spec.js.map +1 -1
  80. package/dist/commands/get.js +64 -1
  81. package/dist/commands/get.js.map +1 -1
  82. package/dist/commands/group/addmember.js +3 -1
  83. package/dist/commands/group/addmember.js.map +1 -1
  84. package/dist/commands/group/addmember.spec.js +7 -2
  85. package/dist/commands/group/addmember.spec.js.map +1 -1
  86. package/dist/commands/group/creategroup.js +2 -0
  87. package/dist/commands/group/creategroup.js.map +1 -1
  88. package/dist/commands/group/deletegroup.js +3 -1
  89. package/dist/commands/group/deletegroup.js.map +1 -1
  90. package/dist/commands/group/deletegroup.spec.js +7 -1
  91. package/dist/commands/group/deletegroup.spec.js.map +1 -1
  92. package/dist/commands/group/getgroup.js +2 -0
  93. package/dist/commands/group/getgroup.js.map +1 -1
  94. package/dist/commands/group/listgroups.js +2 -0
  95. package/dist/commands/group/listgroups.js.map +1 -1
  96. package/dist/commands/group/removemember.js +3 -1
  97. package/dist/commands/group/removemember.js.map +1 -1
  98. package/dist/commands/group/removemember.spec.js +7 -2
  99. package/dist/commands/group/removemember.spec.js.map +1 -1
  100. package/dist/commands/groupaccesstoken/deleteToken.js +2 -1
  101. package/dist/commands/groupaccesstoken/deleteToken.js.map +1 -1
  102. package/dist/commands/groupaccesstoken/groupContainer.js +2 -0
  103. package/dist/commands/groupaccesstoken/groupContainer.js.map +1 -1
  104. package/dist/commands/list.js +24 -4
  105. package/dist/commands/list.js.map +1 -1
  106. package/dist/commands/materialization/cancelrun.js +3 -1
  107. package/dist/commands/materialization/cancelrun.js.map +1 -1
  108. package/dist/commands/materialization/getindex.js +2 -0
  109. package/dist/commands/materialization/getindex.js.map +1 -1
  110. package/dist/commands/materialization/getmaterialization.js +2 -0
  111. package/dist/commands/materialization/getmaterialization.js.map +1 -1
  112. package/dist/commands/materialization/getpreaggregate.js +2 -0
  113. package/dist/commands/materialization/getpreaggregate.js.map +1 -1
  114. package/dist/commands/materialization/getrun.js +2 -0
  115. package/dist/commands/materialization/getrun.js.map +1 -1
  116. package/dist/commands/materialization/listindexes.js +2 -0
  117. package/dist/commands/materialization/listindexes.js.map +1 -1
  118. package/dist/commands/materialization/listmaterializations.js +2 -0
  119. package/dist/commands/materialization/listmaterializations.js.map +1 -1
  120. package/dist/commands/materialization/listpreaggregates.js +2 -0
  121. package/dist/commands/materialization/listpreaggregates.js.map +1 -1
  122. package/dist/commands/materialization/listruns.js +3 -1
  123. package/dist/commands/materialization/listruns.js.map +1 -1
  124. package/dist/commands/materialization/rerun.js +3 -1
  125. package/dist/commands/materialization/rerun.js.map +1 -1
  126. package/dist/commands/misc/inquirerHost.js +87 -0
  127. package/dist/commands/misc/inquirerHost.js.map +1 -0
  128. package/dist/commands/misc/inquirerHost.spec.js +91 -0
  129. package/dist/commands/misc/inquirerHost.spec.js.map +1 -0
  130. package/dist/commands/misc/login.js +348 -58
  131. package/dist/commands/misc/login.js.map +1 -1
  132. package/dist/commands/misc/login.spec.js +525 -7
  133. package/dist/commands/misc/login.spec.js.map +1 -1
  134. package/dist/commands/misc/logout.js +26 -3
  135. package/dist/commands/misc/logout.js.map +1 -1
  136. package/dist/commands/misc/logout.spec.js +52 -12
  137. package/dist/commands/misc/logout.spec.js.map +1 -1
  138. package/dist/commands/misc/resolveLoginTarget.spec.js +90 -0
  139. package/dist/commands/misc/resolveLoginTarget.spec.js.map +1 -0
  140. package/dist/commands/misc/scope.spec.js +108 -0
  141. package/dist/commands/misc/scope.spec.js.map +1 -0
  142. package/dist/commands/misc/set-access-token.js +1 -1
  143. package/dist/commands/misc/set-access-token.js.map +1 -1
  144. package/dist/commands/misc/set-access-token.spec.js +13 -2
  145. package/dist/commands/misc/set-access-token.spec.js.map +1 -1
  146. package/dist/commands/misc/setup.js +819 -0
  147. package/dist/commands/misc/setup.js.map +1 -0
  148. package/dist/commands/misc/setup.spec.js +783 -0
  149. package/dist/commands/misc/setup.spec.js.map +1 -0
  150. package/dist/commands/misc/status.js +168 -0
  151. package/dist/commands/misc/status.js.map +1 -0
  152. package/dist/commands/misc/status.spec.js +301 -0
  153. package/dist/commands/misc/status.spec.js.map +1 -0
  154. package/dist/commands/misc/token.js +57 -0
  155. package/dist/commands/misc/token.js.map +1 -0
  156. package/dist/commands/misc/token.spec.js +92 -0
  157. package/dist/commands/misc/token.spec.js.map +1 -0
  158. package/dist/commands/package/deletepackage.js +4 -2
  159. package/dist/commands/package/deletepackage.js.map +1 -1
  160. package/dist/commands/package/deletepackage.spec.js +7 -1
  161. package/dist/commands/package/deletepackage.spec.js.map +1 -1
  162. package/dist/commands/package/getpackage.js +142 -0
  163. package/dist/commands/package/getpackage.js.map +1 -0
  164. package/dist/commands/package/getpackage.spec.js +246 -0
  165. package/dist/commands/package/getpackage.spec.js.map +1 -0
  166. package/dist/commands/package/listpackages.js +2 -0
  167. package/dist/commands/package/listpackages.js.map +1 -1
  168. package/dist/commands/package/publish.archive.spec.js +570 -0
  169. package/dist/commands/package/publish.archive.spec.js.map +1 -0
  170. package/dist/commands/package/publish.js +780 -49
  171. package/dist/commands/package/publish.js.map +1 -1
  172. package/dist/commands/package/publish.spec.js +451 -8
  173. package/dist/commands/package/publish.spec.js.map +1 -1
  174. package/dist/commands/package/updatepackage.js +22 -19
  175. package/dist/commands/package/updatepackage.js.map +1 -1
  176. package/dist/commands/package/updatepackage.spec.js +36 -1
  177. package/dist/commands/package/updatepackage.spec.js.map +1 -1
  178. package/dist/commands/permission/createpermission.js +3 -1
  179. package/dist/commands/permission/createpermission.js.map +1 -1
  180. package/dist/commands/permission/deletepermission.js +6 -3
  181. package/dist/commands/permission/deletepermission.js.map +1 -1
  182. package/dist/commands/permission/getpermission.js +2 -0
  183. package/dist/commands/permission/getpermission.js.map +1 -1
  184. package/dist/commands/permission/listpermissions.js +2 -0
  185. package/dist/commands/permission/listpermissions.js.map +1 -1
  186. package/dist/commands/rm.js +21 -0
  187. package/dist/commands/rm.js.map +1 -1
  188. package/dist/commands/set.js +40 -6
  189. package/dist/commands/set.js.map +1 -1
  190. package/dist/commands/set.spec.js +123 -0
  191. package/dist/commands/set.spec.js.map +1 -0
  192. package/dist/commands/table/addtable.js +155 -0
  193. package/dist/commands/table/addtable.js.map +1 -0
  194. package/dist/commands/table/deletetable.js +45 -0
  195. package/dist/commands/table/deletetable.js.map +1 -0
  196. package/dist/commands/table/gettable.js +32 -0
  197. package/dist/commands/table/gettable.js.map +1 -0
  198. package/dist/commands/table/listtables.js +36 -0
  199. package/dist/commands/table/listtables.js.map +1 -0
  200. package/dist/commands/table/table.spec.js +304 -0
  201. package/dist/commands/table/table.spec.js.map +1 -0
  202. package/dist/commands/table/tablefile.js +195 -0
  203. package/dist/commands/table/tablefile.js.map +1 -0
  204. package/dist/commands/table/tablefile.spec.js +158 -0
  205. package/dist/commands/table/tablefile.spec.js.map +1 -0
  206. package/dist/commands/update.js +21 -0
  207. package/dist/commands/update.js.map +1 -1
  208. package/dist/commands/version/archive-unarchive-version.js +4 -2
  209. package/dist/commands/version/archive-unarchive-version.js.map +1 -1
  210. package/dist/commands/version/archive-unarchive-version.spec.js +6 -1
  211. package/dist/commands/version/archive-unarchive-version.spec.js.map +1 -1
  212. package/dist/commands/version/listversions.js +2 -0
  213. package/dist/commands/version/listversions.js.map +1 -1
  214. package/dist/common/UserGroupId.js +9 -4
  215. package/dist/common/UserGroupId.js.map +1 -1
  216. package/dist/common/UserGroupId.spec.js +5 -0
  217. package/dist/common/UserGroupId.spec.js.map +1 -1
  218. package/dist/constants.js +37 -143
  219. package/dist/constants.js.map +1 -1
  220. package/dist/index.js +487 -90
  221. package/dist/index.js.map +1 -1
  222. package/dist/logger.js +42 -9
  223. package/dist/logger.js.map +1 -1
  224. package/dist/session.js +56 -0
  225. package/dist/session.js.map +1 -0
  226. package/dist/session.spec.js +103 -0
  227. package/dist/session.spec.js.map +1 -0
  228. package/dist/setup-core/briefing.js +176 -0
  229. package/dist/setup-core/briefing.js.map +1 -0
  230. package/dist/setup-core/credstore.js +415 -0
  231. package/dist/setup-core/credstore.js.map +1 -0
  232. package/dist/setup-core/credstore.spec.js +238 -0
  233. package/dist/setup-core/credstore.spec.js.map +1 -0
  234. package/dist/setup-core/environments.js +267 -0
  235. package/dist/setup-core/environments.js.map +1 -0
  236. package/dist/setup-core/flow.e2e.js +165 -0
  237. package/dist/setup-core/flow.e2e.js.map +1 -0
  238. package/dist/setup-core/flow.js +765 -0
  239. package/dist/setup-core/flow.js.map +1 -0
  240. package/dist/setup-core/flow.spec.js +1348 -0
  241. package/dist/setup-core/flow.spec.js.map +1 -0
  242. package/dist/setup-core/folderconfig.js +283 -0
  243. package/dist/setup-core/folderconfig.js.map +1 -0
  244. package/dist/setup-core/git.js +97 -0
  245. package/dist/setup-core/git.js.map +1 -0
  246. package/dist/setup-core/host.js +77 -0
  247. package/dist/setup-core/host.js.map +1 -0
  248. package/dist/setup-core/importconnections.js +470 -0
  249. package/dist/setup-core/importconnections.js.map +1 -0
  250. package/dist/setup-core/importconnections.spec.js +594 -0
  251. package/dist/setup-core/importconnections.spec.js.map +1 -0
  252. package/dist/setup-core/liveness.js +94 -0
  253. package/dist/setup-core/liveness.js.map +1 -0
  254. package/dist/setup-core/liveness.spec.js +59 -0
  255. package/dist/setup-core/liveness.spec.js.map +1 -0
  256. package/dist/setup-core/localpublisherconfig.js +26 -0
  257. package/dist/setup-core/localpublisherconfig.js.map +1 -0
  258. package/dist/setup-core/localpublisherconfig.spec.js +29 -0
  259. package/dist/setup-core/localpublisherconfig.spec.js.map +1 -0
  260. package/dist/setup-core/mcpconfig.js +198 -0
  261. package/dist/setup-core/mcpconfig.js.map +1 -0
  262. package/dist/setup-core/mcpconfig.spec.js +205 -0
  263. package/dist/setup-core/mcpconfig.spec.js.map +1 -0
  264. package/dist/setup-core/packagemanifest.js +55 -0
  265. package/dist/setup-core/packagemanifest.js.map +1 -0
  266. package/dist/setup-core/ports.js +182 -0
  267. package/dist/setup-core/ports.js.map +1 -0
  268. package/dist/setup-core/ports.spec.js +173 -0
  269. package/dist/setup-core/ports.spec.js.map +1 -0
  270. package/dist/setup-core/publisherconfig.js +268 -0
  271. package/dist/setup-core/publisherconfig.js.map +1 -0
  272. package/dist/setup-core/publisherconfig.oracle.js +166 -0
  273. package/dist/setup-core/publisherconfig.oracle.js.map +1 -0
  274. package/dist/setup-core/publisherconfig.spec.js +277 -0
  275. package/dist/setup-core/publisherconfig.spec.js.map +1 -0
  276. package/dist/setup-core/publisherversion.js +26 -0
  277. package/dist/setup-core/publisherversion.js.map +1 -0
  278. package/dist/setup-core/readiness.spec.js +161 -0
  279. package/dist/setup-core/readiness.spec.js.map +1 -0
  280. package/dist/setup-core/readylines.js +169 -0
  281. package/dist/setup-core/readylines.js.map +1 -0
  282. package/dist/setup-core/readylines.spec.js +70 -0
  283. package/dist/setup-core/readylines.spec.js.map +1 -0
  284. package/dist/setup-core/refresh.js +348 -0
  285. package/dist/setup-core/refresh.js.map +1 -0
  286. package/dist/setup-core/refresh.spec.js +501 -0
  287. package/dist/setup-core/refresh.spec.js.map +1 -0
  288. package/dist/setup-core/skills.js +279 -0
  289. package/dist/setup-core/skills.js.map +1 -0
  290. package/dist/setup-core/skills.spec.js +334 -0
  291. package/dist/setup-core/skills.spec.js.map +1 -0
  292. package/dist/setup-core/supervisor.js +879 -0
  293. package/dist/setup-core/supervisor.js.map +1 -0
  294. package/dist/setup-core/supervisor.spec.js +833 -0
  295. package/dist/setup-core/supervisor.spec.js.map +1 -0
  296. package/dist/setup-core/writefile.js +61 -0
  297. package/dist/setup-core/writefile.js.map +1 -0
  298. package/dist/setup-core/writefile.spec.js +68 -0
  299. package/dist/setup-core/writefile.spec.js.map +1 -0
  300. package/dist/utils.js +409 -3
  301. package/dist/utils.js.map +1 -1
  302. package/dist/utils.spec.js +373 -2
  303. package/dist/utils.spec.js.map +1 -1
  304. package/dist/versioncheck-refresh.js +18 -0
  305. package/dist/versioncheck-refresh.js.map +1 -0
  306. package/dist/versioncheck.js +324 -0
  307. package/dist/versioncheck.js.map +1 -0
  308. package/dist/versioncheck.spec.js +587 -0
  309. package/dist/versioncheck.spec.js.map +1 -0
  310. package/node_modules/@credibledata/cli-auth/dist/index.d.ts +86 -0
  311. package/node_modules/@credibledata/cli-auth/dist/index.js +102 -0
  312. package/node_modules/@credibledata/cli-auth/package.json +19 -0
  313. package/package.json +18 -6
  314. package/.github/workflows/build.yml +0 -23
  315. package/.mocharc.json +0 -10
  316. package/.prettierignore +0 -2
  317. package/.prettierrc +0 -4
  318. package/README-DEV.md +0 -40
  319. package/coverage/coverage-summary.json +0 -40
  320. package/coverage/tmp/coverage-2152-1789496974457-0.json +0 -1
  321. package/coverage/tmp/coverage-2153-1789496954404-0.json +0 -1
  322. package/docker/Dockerfile.ci +0 -18
  323. package/docker-compose.yml +0 -18
  324. package/eslint.config.mjs +0 -45
  325. package/generate-client.sh +0 -27
  326. package/mocha.setup.ts +0 -4
  327. package/openapitools.json +0 -10
  328. package/src/client/.openapi-generator/FILES +0 -9
  329. package/src/client/.openapi-generator/VERSION +0 -1
  330. package/src/client/.openapi-generator-ignore +0 -23
  331. package/src/client/api.ts +0 -15999
  332. package/src/client/base.ts +0 -86
  333. package/src/client/common.ts +0 -150
  334. package/src/client/configuration.ts +0 -110
  335. package/src/client/git_push.sh +0 -57
  336. package/src/client/index.ts +0 -18
  337. package/src/clientconfiguration.spec.ts +0 -615
  338. package/src/clientconfiguration.ts +0 -364
  339. package/src/commands/add.ts +0 -191
  340. package/src/commands/connection/createconnections.spec.ts +0 -413
  341. package/src/commands/connection/createconnections.ts +0 -109
  342. package/src/commands/connection/deleteconnection.spec.ts +0 -189
  343. package/src/commands/connection/deleteconnection.ts +0 -57
  344. package/src/commands/connection/listconnections.spec.ts +0 -132
  345. package/src/commands/connection/listconnections.ts +0 -58
  346. package/src/commands/environment/createenvironment.spec.ts +0 -249
  347. package/src/commands/environment/createenvironment.ts +0 -73
  348. package/src/commands/environment/deleteenvironment.spec.ts +0 -152
  349. package/src/commands/environment/deleteenvironment.ts +0 -48
  350. package/src/commands/environment/getenvironment.spec.ts +0 -110
  351. package/src/commands/environment/getenvironment.ts +0 -43
  352. package/src/commands/environment/listenvironments.spec.ts +0 -123
  353. package/src/commands/environment/listenvironments.ts +0 -67
  354. package/src/commands/environment/setenvironment.spec.ts +0 -63
  355. package/src/commands/environment/setenvironment.ts +0 -14
  356. package/src/commands/environment/updateenvironment.spec.ts +0 -386
  357. package/src/commands/environment/updateenvironment.ts +0 -168
  358. package/src/commands/get.ts +0 -153
  359. package/src/commands/group/addmember.spec.ts +0 -257
  360. package/src/commands/group/addmember.ts +0 -85
  361. package/src/commands/group/creategroup.spec.ts +0 -146
  362. package/src/commands/group/creategroup.ts +0 -54
  363. package/src/commands/group/deletegroup.spec.ts +0 -120
  364. package/src/commands/group/deletegroup.ts +0 -45
  365. package/src/commands/group/getgroup.spec.ts +0 -129
  366. package/src/commands/group/getgroup.ts +0 -47
  367. package/src/commands/group/listgroups.spec.ts +0 -137
  368. package/src/commands/group/listgroups.ts +0 -45
  369. package/src/commands/group/removemember.spec.ts +0 -224
  370. package/src/commands/group/removemember.ts +0 -75
  371. package/src/commands/groupaccesstoken/createToken.spec.ts +0 -211
  372. package/src/commands/groupaccesstoken/createToken.ts +0 -72
  373. package/src/commands/groupaccesstoken/deleteToken.spec.ts +0 -147
  374. package/src/commands/groupaccesstoken/deleteToken.ts +0 -29
  375. package/src/commands/groupaccesstoken/groupContainer.ts +0 -83
  376. package/src/commands/groupaccesstoken/listTokens.spec.ts +0 -147
  377. package/src/commands/groupaccesstoken/listTokens.ts +0 -29
  378. package/src/commands/legacy.ts +0 -5
  379. package/src/commands/list.ts +0 -326
  380. package/src/commands/materialization/cancelrun.ts +0 -70
  381. package/src/commands/materialization/getindex.ts +0 -55
  382. package/src/commands/materialization/getmaterialization.ts +0 -57
  383. package/src/commands/materialization/getpreaggregate.ts +0 -58
  384. package/src/commands/materialization/getrun.ts +0 -55
  385. package/src/commands/materialization/listindexes.ts +0 -69
  386. package/src/commands/materialization/listmaterializations.ts +0 -53
  387. package/src/commands/materialization/listpreaggregates.ts +0 -74
  388. package/src/commands/materialization/listruns.ts +0 -77
  389. package/src/commands/materialization/rerun.ts +0 -123
  390. package/src/commands/misc/login.spec.ts +0 -371
  391. package/src/commands/misc/login.ts +0 -343
  392. package/src/commands/misc/logout.spec.ts +0 -32
  393. package/src/commands/misc/logout.ts +0 -9
  394. package/src/commands/misc/loopbackOAuth.ts +0 -127
  395. package/src/commands/misc/set-access-token.spec.ts +0 -95
  396. package/src/commands/misc/set-access-token.ts +0 -32
  397. package/src/commands/package/deletepackage.spec.ts +0 -164
  398. package/src/commands/package/deletepackage.ts +0 -58
  399. package/src/commands/package/listpackages.spec.ts +0 -163
  400. package/src/commands/package/listpackages.ts +0 -74
  401. package/src/commands/package/publish.spec.ts +0 -642
  402. package/src/commands/package/publish.ts +0 -236
  403. package/src/commands/package/updatepackage.spec.ts +0 -319
  404. package/src/commands/package/updatepackage.ts +0 -95
  405. package/src/commands/permission/createpermission.spec.ts +0 -507
  406. package/src/commands/permission/createpermission.ts +0 -181
  407. package/src/commands/permission/deletepermission.ts +0 -117
  408. package/src/commands/permission/getpermission.ts +0 -115
  409. package/src/commands/permission/listpermissions.ts +0 -101
  410. package/src/commands/permission/scope.ts +0 -180
  411. package/src/commands/rm.ts +0 -146
  412. package/src/commands/set.ts +0 -25
  413. package/src/commands/update.ts +0 -107
  414. package/src/commands/version/archive-unarchive-version.spec.ts +0 -456
  415. package/src/commands/version/archive-unarchive-version.ts +0 -108
  416. package/src/commands/version/listversions.spec.ts +0 -138
  417. package/src/commands/version/listversions.ts +0 -45
  418. package/src/common/UserGroupId.spec.ts +0 -115
  419. package/src/common/UserGroupId.ts +0 -137
  420. package/src/constants.spec.ts +0 -111
  421. package/src/constants.ts +0 -228
  422. package/src/index.ts +0 -378
  423. package/src/logger.spec.ts +0 -158
  424. package/src/logger.ts +0 -90
  425. package/src/polyfills/file.polyfill.ts +0 -6
  426. package/src/utils.spec.ts +0 -135
  427. package/src/utils.ts +0 -115
  428. package/src/validator.spec.ts +0 -51
  429. package/src/validator.ts +0 -44
  430. package/tsconfig.json +0 -17
@@ -1,615 +0,0 @@
1
- import { expect } from "chai";
2
- import fs from "fs";
3
- import os from "os";
4
- import { join } from "path";
5
- import sinon from "sinon";
6
- import { ClientConfiguration } from "./clientconfiguration";
7
- import { ALL_ENVIRONMENTS, type Environment } from "./constants";
8
- import { logger } from "./logger";
9
-
10
- /** Expected `configPerEnvironment` shape after `loadConfig()` (every env has an object). */
11
- function fullPerEnv(
12
- filled: Partial<Record<Environment, Record<string, unknown>>> = {},
13
- ): Record<string, Record<string, unknown>> {
14
- const out: Record<string, Record<string, unknown>> = {};
15
- for (const env of ALL_ENVIRONMENTS) {
16
- out[env] = filled[env] != null ? { ...filled[env]! } : {};
17
- }
18
- return out;
19
- }
20
-
21
- describe("ClientConfiguration", () => {
22
- let clientConfig: ClientConfiguration;
23
- let readFileSyncStub: sinon.SinonStub;
24
- let writeFileSyncStub: sinon.SinonStub;
25
- let renameSyncStub: sinon.SinonStub;
26
- let customConfigPath: string;
27
-
28
- // Simulate a real ENOENT from readFileSync (has `.code = "ENOENT"`).
29
- // A bare `Error("File not found")` no longer triggers first-time-setup —
30
- // loadConfig now rethrows non-ENOENT errors instead of silently masking them.
31
- const enoent = () => Object.assign(new Error("ENOENT"), { code: "ENOENT" });
32
-
33
- // Pull the most-recent persisted config payload off the stubs. Atomic writes
34
- // go through writeFileSync(tmpPath, json) followed by renameSync(tmp, path).
35
- const lastWrittenConfig = () => {
36
- const args = writeFileSyncStub.lastCall.args;
37
- return JSON.parse(args[1] as string);
38
- };
39
-
40
- beforeEach(() => {
41
- customConfigPath = join(os.homedir(), ".cred_test");
42
- clientConfig = new ClientConfiguration(customConfigPath);
43
-
44
- fs.writeFileSync(customConfigPath, "{}");
45
-
46
- readFileSyncStub = sinon.stub(fs, "readFileSync");
47
- writeFileSyncStub = sinon.stub(fs, "writeFileSync");
48
- renameSyncStub = sinon.stub(fs, "renameSync");
49
- });
50
-
51
- afterEach(() => {
52
- sinon.restore();
53
-
54
- if (fs.existsSync(customConfigPath)) {
55
- fs.unlinkSync(customConfigPath);
56
- }
57
- });
58
-
59
- it("should load the default config if the file does not exist", () => {
60
- readFileSyncStub.throws(enoent());
61
- clientConfig.loadConfig();
62
- expect(clientConfig["config"]).to.deep.equal({
63
- configPerEnvironment: fullPerEnv(),
64
- activeEnvironment: "production",
65
- });
66
- });
67
-
68
- it("should throw loudly when the config file is unparseable", () => {
69
- // Non-atomic writes from older binaries can leave `.cred` truncated.
70
- // loadConfig must fail loud instead of silently overwriting — a silent
71
- // reset erases the access token for every subsequent caller.
72
- readFileSyncStub.returns("{ not json");
73
- expect(() => clientConfig.loadConfig()).to.throw(/may be corrupt/);
74
- expect(writeFileSyncStub.called).to.be.false;
75
- });
76
-
77
- it("should throw when readFileSync fails with a non-ENOENT error", () => {
78
- const eacces = Object.assign(new Error("EACCES"), { code: "EACCES" });
79
- readFileSyncStub.throws(eacces);
80
- expect(() => clientConfig.loadConfig()).to.throw(/EACCES/);
81
- });
82
-
83
- it("should load the config file correctly", () => {
84
- const mockConfig = {
85
- configPerEnvironment: {
86
- production: { project: "test-project" },
87
- staging: {},
88
- localhost: {},
89
- },
90
- activeEnvironment: "production",
91
- };
92
- readFileSyncStub.returns(JSON.stringify(mockConfig));
93
- clientConfig.loadConfig();
94
- expect(clientConfig["config"]).to.deep.equal({
95
- configPerEnvironment: fullPerEnv({
96
- production: { project: "test-project" },
97
- }),
98
- activeEnvironment: "production",
99
- });
100
- });
101
-
102
- it("should allow setAccessToken when activeEnvironment had no bucket on disk (e.g. videoamp)", () => {
103
- const mockConfig = {
104
- configPerEnvironment: {
105
- production: {},
106
- staging: {},
107
- dev: {},
108
- localhost: {},
109
- "e2e-test": {},
110
- },
111
- activeEnvironment: "videoamp",
112
- };
113
- readFileSyncStub.returns(JSON.stringify(mockConfig));
114
- clientConfig.setAccessToken(true, "user-jwt");
115
- const written = JSON.parse(writeFileSyncStub.lastCall.args[1] as string);
116
- expect(written.configPerEnvironment.videoamp.accessToken).to.equal(
117
- "user-jwt",
118
- );
119
- expect(written.configPerEnvironment.videoamp.isServiceAccountToken).to.be
120
- .false;
121
- });
122
-
123
- it("should set and get the project correctly", () => {
124
- readFileSyncStub.throws(enoent());
125
- clientConfig.setProject("new-project");
126
-
127
- expect(lastWrittenConfig()).to.deep.equal({
128
- configPerEnvironment: fullPerEnv({
129
- production: { project: "new-project" },
130
- }),
131
- activeEnvironment: "production",
132
- });
133
- expect(renameSyncStub.lastCall.args[1]).to.equal(customConfigPath);
134
- });
135
-
136
- it("should set and get the access token correctly", () => {
137
- readFileSyncStub.throws(enoent());
138
- clientConfig.setAccessToken(false, "token-123");
139
-
140
- expect(lastWrittenConfig()).to.deep.equal({
141
- configPerEnvironment: fullPerEnv({
142
- production: {
143
- isServiceAccountToken: true,
144
- accessToken: "token-123",
145
- },
146
- }),
147
- activeEnvironment: "production",
148
- });
149
- });
150
-
151
- it("should preserve other per-env fields when setting access token", () => {
152
- // Valid initial config (with an activeEnvironment so loadConfig accepts it).
153
- readFileSyncStub.returns(
154
- JSON.stringify({
155
- configPerEnvironment: {
156
- production: {
157
- auth: { username: "user", password: "pass" },
158
- },
159
- },
160
- activeEnvironment: "production",
161
- }),
162
- );
163
- clientConfig.setAccessToken(true, "new-token");
164
- expect(lastWrittenConfig().configPerEnvironment.production).to.deep.equal(
165
- {
166
- auth: { username: "user", password: "pass" },
167
- isServiceAccountToken: false,
168
- accessToken: "new-token",
169
- },
170
- );
171
- });
172
-
173
- it("should set and get organization", () => {
174
- readFileSyncStub.throws(enoent());
175
- clientConfig.setOrganization("my-org");
176
-
177
- expect(lastWrittenConfig()).to.deep.equal({
178
- configPerEnvironment: fullPerEnv({
179
- production: { organization: "my-org" },
180
- }),
181
- activeEnvironment: "production",
182
- });
183
- });
184
-
185
- it("should set and get refresh token", () => {
186
- readFileSyncStub.throws(enoent());
187
- clientConfig.setRefreshToken("refresh-token-123");
188
-
189
- expect(lastWrittenConfig()).to.deep.equal({
190
- configPerEnvironment: fullPerEnv({
191
- production: { refreshToken: "refresh-token-123" },
192
- }),
193
- activeEnvironment: "production",
194
- });
195
- });
196
-
197
- it("should set and get VSCode user", () => {
198
- readFileSyncStub.throws(enoent());
199
- clientConfig.setVSCodeUser("testuser", "test@example.com");
200
-
201
- expect(lastWrittenConfig()).to.deep.equal({
202
- configPerEnvironment: fullPerEnv({
203
- production: {
204
- vsCodeUser: {
205
- username: "testuser",
206
- email: "test@example.com",
207
- },
208
- },
209
- }),
210
- activeEnvironment: "production",
211
- });
212
- });
213
-
214
- it("should set and get JWT access token", () => {
215
- readFileSyncStub.throws(enoent());
216
- clientConfig.setJwtAccessToken("jwt-token-abc");
217
-
218
- expect(lastWrittenConfig()).to.deep.equal({
219
- configPerEnvironment: fullPerEnv({
220
- production: { jwtAccessToken: "jwt-token-abc" },
221
- }),
222
- activeEnvironment: "production",
223
- });
224
- });
225
-
226
- it("should return true for doesConfigExists when environment config exists", () => {
227
- const mockConfig = {
228
- configPerEnvironment: {
229
- production: { project: "test" },
230
- staging: {},
231
- localhost: {},
232
- },
233
- activeEnvironment: "production",
234
- };
235
- readFileSyncStub.returns(JSON.stringify(mockConfig));
236
-
237
- expect(clientConfig.doesConfigExists()).to.be.true;
238
- });
239
-
240
- it("should destroy config by resetting environment config to empty", () => {
241
- const mockConfig = {
242
- configPerEnvironment: {
243
- production: { organization: "my-org", project: "my-proj" },
244
- staging: {},
245
- localhost: {},
246
- },
247
- activeEnvironment: "production",
248
- };
249
- readFileSyncStub.returns(JSON.stringify(mockConfig));
250
- clientConfig.destroyConfig();
251
-
252
- expect(lastWrittenConfig()).to.deep.equal({
253
- configPerEnvironment: fullPerEnv(),
254
- activeEnvironment: "production",
255
- });
256
- });
257
-
258
- it("should set and get environment", () => {
259
- readFileSyncStub.throws(enoent());
260
- clientConfig.setEnvironment("staging");
261
-
262
- expect(lastWrittenConfig()).to.deep.equal({
263
- configPerEnvironment: fullPerEnv(),
264
- activeEnvironment: "staging",
265
- });
266
- });
267
-
268
- it("should return headers with Bearer token for user tokens", () => {
269
- const mockConfig = {
270
- configPerEnvironment: {
271
- production: {
272
- accessToken: "user-token",
273
- isServiceAccountToken: false,
274
- },
275
- staging: {},
276
- localhost: {},
277
- },
278
- activeEnvironment: "production",
279
- };
280
- readFileSyncStub.returns(JSON.stringify(mockConfig));
281
- clientConfig.loadConfig();
282
-
283
- const headers = clientConfig.getHeaders();
284
- expect(headers.Authorization).to.equal("Bearer user-token");
285
- });
286
-
287
- it("should return headers with ApiKey for service account tokens", () => {
288
- const mockConfig = {
289
- configPerEnvironment: {
290
- production: {
291
- accessToken: "service-token",
292
- isServiceAccountToken: true,
293
- },
294
- staging: {},
295
- localhost: {},
296
- },
297
- activeEnvironment: "production",
298
- };
299
- readFileSyncStub.returns(JSON.stringify(mockConfig));
300
- clientConfig.loadConfig();
301
-
302
- const headers = clientConfig.getHeaders();
303
- expect(headers.Authorization).to.equal("ApiKey service-token");
304
- });
305
-
306
- it("should throw when config file is missing activeEnvironment", () => {
307
- // Previously loadConfig silently reset to defaults — that turned one
308
- // corrupt read into permanent state loss for every caller. Now we fail loud.
309
- readFileSyncStub.returns(JSON.stringify({ configPerEnvironment: {} }));
310
- expect(() => clientConfig.loadConfig()).to.throw(
311
- /Invalid config structure/,
312
- );
313
- expect(writeFileSyncStub.called).to.be.false;
314
- });
315
-
316
- describe("recoverIfCorrupt", () => {
317
- it("returns null and writes nothing when the config is already valid", () => {
318
- readFileSyncStub.returns(
319
- JSON.stringify({
320
- configPerEnvironment: {},
321
- activeEnvironment: "staging",
322
- }),
323
- );
324
-
325
- expect(clientConfig.recoverIfCorrupt()).to.be.null;
326
- expect(renameSyncStub.called).to.be.false;
327
- // Valid config preserved — active environment untouched.
328
- expect(clientConfig.getEnvironment()).to.equal("staging");
329
- });
330
-
331
- it("backs up an unparseable file and resets to defaults", () => {
332
- readFileSyncStub.returns("{ not json");
333
-
334
- const backupPath = clientConfig.recoverIfCorrupt();
335
-
336
- expect(backupPath).to.match(
337
- new RegExp(`${customConfigPath}\\.corrupt-[0-9a-f]{16}$`),
338
- );
339
- // Renamed aside, never deleted, so the bad file is recoverable.
340
- expect(renameSyncStub.calledWith(customConfigPath, backupPath!)).to.be
341
- .true;
342
- expect(lastWrittenConfig()).to.deep.equal({
343
- configPerEnvironment: fullPerEnv(),
344
- activeEnvironment: "production",
345
- });
346
- });
347
-
348
- it("backs up a structurally-invalid file and resets to defaults", () => {
349
- readFileSyncStub.returns(JSON.stringify({ configPerEnvironment: {} }));
350
-
351
- const backupPath = clientConfig.recoverIfCorrupt();
352
-
353
- expect(backupPath).to.be.a("string");
354
- expect(renameSyncStub.calledWith(customConfigPath, backupPath!)).to.be
355
- .true;
356
- expect(lastWrittenConfig().activeEnvironment).to.equal("production");
357
- });
358
-
359
- it("rethrows fs errors (e.g. EACCES) instead of masking them as a reset", () => {
360
- // A permissions problem must surface — resetting would just fail to
361
- // write anyway, and silently "recovering" would hide the real cause.
362
- const eacces = Object.assign(new Error("EACCES"), { code: "EACCES" });
363
- readFileSyncStub.throws(eacces);
364
-
365
- expect(() => clientConfig.recoverIfCorrupt()).to.throw(/EACCES/);
366
- expect(renameSyncStub.called).to.be.false;
367
- });
368
-
369
- it("creates a fresh default when the file is absent (ENOENT)", () => {
370
- readFileSyncStub.throws(enoent());
371
-
372
- // First-time setup is not corruption — nothing to back up. (The atomic
373
- // write of the new default does call renameSync, but never to a
374
- // `.corrupt-` backup path.)
375
- expect(clientConfig.recoverIfCorrupt()).to.be.null;
376
- expect(
377
- renameSyncStub
378
- .getCalls()
379
- .some((c) => String(c.args[1]).includes(".corrupt-")),
380
- ).to.be.false;
381
- });
382
- });
383
-
384
- describe("isTokenValid", () => {
385
- it("should return invalid when no token exists", () => {
386
- const mockConfig = {
387
- configPerEnvironment: {
388
- production: {},
389
- staging: {},
390
- localhost: {},
391
- },
392
- activeEnvironment: "production",
393
- };
394
- readFileSyncStub.returns(JSON.stringify(mockConfig));
395
-
396
- const result = clientConfig.isTokenValid();
397
- expect(result.valid).to.be.false;
398
- expect(result.reason).to.equal("No token found. Please login.");
399
- });
400
-
401
- it("should return valid for service account tokens", () => {
402
- const mockConfig = {
403
- configPerEnvironment: {
404
- production: {
405
- accessToken: "some-api-key",
406
- isServiceAccountToken: true,
407
- },
408
- staging: {},
409
- localhost: {},
410
- },
411
- activeEnvironment: "production",
412
- };
413
- readFileSyncStub.returns(JSON.stringify(mockConfig));
414
-
415
- const result = clientConfig.isTokenValid();
416
- expect(result.valid).to.be.true;
417
- });
418
-
419
- it("should return invalid for expired JWT", () => {
420
- // Create a JWT with an expired exp claim
421
- const payload = { exp: Math.floor(Date.now() / 1000) - 3600 };
422
- const fakeJwt =
423
- Buffer.from(JSON.stringify({ alg: "HS256" })).toString(
424
- "base64url",
425
- ) +
426
- "." +
427
- Buffer.from(JSON.stringify(payload)).toString("base64url") +
428
- ".signature";
429
-
430
- const mockConfig = {
431
- configPerEnvironment: {
432
- production: {
433
- accessToken: fakeJwt,
434
- isServiceAccountToken: false,
435
- },
436
- staging: {},
437
- localhost: {},
438
- },
439
- activeEnvironment: "production",
440
- };
441
- readFileSyncStub.returns(JSON.stringify(mockConfig));
442
-
443
- const result = clientConfig.isTokenValid();
444
- expect(result.valid).to.be.false;
445
- expect(result.reason).to.equal("Token expired. Please login again.");
446
- });
447
-
448
- it("should return valid for non-expired JWT", () => {
449
- const payload = { exp: Math.floor(Date.now() / 1000) + 3600 };
450
- const fakeJwt =
451
- Buffer.from(JSON.stringify({ alg: "HS256" })).toString(
452
- "base64url",
453
- ) +
454
- "." +
455
- Buffer.from(JSON.stringify(payload)).toString("base64url") +
456
- ".signature";
457
-
458
- const mockConfig = {
459
- configPerEnvironment: {
460
- production: {
461
- accessToken: fakeJwt,
462
- isServiceAccountToken: false,
463
- },
464
- staging: {},
465
- localhost: {},
466
- },
467
- activeEnvironment: "production",
468
- };
469
- readFileSyncStub.returns(JSON.stringify(mockConfig));
470
-
471
- const result = clientConfig.isTokenValid();
472
- expect(result.valid).to.be.true;
473
- });
474
-
475
- it("should return invalid for malformed token", () => {
476
- const mockConfig = {
477
- configPerEnvironment: {
478
- production: {
479
- accessToken: "not-a-valid-jwt",
480
- isServiceAccountToken: false,
481
- },
482
- staging: {},
483
- localhost: {},
484
- },
485
- activeEnvironment: "production",
486
- };
487
- readFileSyncStub.returns(JSON.stringify(mockConfig));
488
-
489
- const result = clientConfig.isTokenValid();
490
- expect(result.valid).to.be.false;
491
- expect(result.reason).to.equal(
492
- "Invalid token format. Please login again.",
493
- );
494
- });
495
- });
496
-
497
- describe("printStatus", () => {
498
- let loggerStub: sinon.SinonStubbedInstance<typeof logger>;
499
- let consoleLogStub: sinon.SinonStub;
500
-
501
- beforeEach(() => {
502
- loggerStub = sinon.stub(logger);
503
- consoleLogStub = sinon.stub(console, "log");
504
- });
505
-
506
- it("should print org and project when token is valid", () => {
507
- const payload = { exp: Math.floor(Date.now() / 1000) + 3600 };
508
- const fakeJwt =
509
- Buffer.from(JSON.stringify({ alg: "HS256" })).toString(
510
- "base64url",
511
- ) +
512
- "." +
513
- Buffer.from(JSON.stringify(payload)).toString("base64url") +
514
- ".signature";
515
-
516
- const mockConfig = {
517
- configPerEnvironment: {
518
- production: {
519
- accessToken: fakeJwt,
520
- isServiceAccountToken: false,
521
- organization: "my-org",
522
- project: "my-project",
523
- },
524
- staging: {},
525
- localhost: {},
526
- },
527
- activeEnvironment: "production",
528
- };
529
- readFileSyncStub.returns(JSON.stringify(mockConfig));
530
-
531
- clientConfig.printStatus();
532
-
533
- expect(loggerStub.info.calledWith(sinon.match("Organization:"))).to.be
534
- .true;
535
- expect(loggerStub.info.calledWith(sinon.match("Environment:"))).to.be
536
- .true;
537
- });
538
-
539
- it("should name the targeted cell when the token is valid", () => {
540
- const payload = { exp: Math.floor(Date.now() / 1000) + 3600 };
541
- const fakeJwt =
542
- Buffer.from(JSON.stringify({ alg: "HS256" })).toString(
543
- "base64url",
544
- ) +
545
- "." +
546
- Buffer.from(JSON.stringify(payload)).toString("base64url") +
547
- ".signature";
548
-
549
- const mockConfig = {
550
- configPerEnvironment: {
551
- production: {},
552
- staging: {},
553
- localhost: {},
554
- dev: {
555
- accessToken: fakeJwt,
556
- isServiceAccountToken: false,
557
- organization: "demo",
558
- project: "demo",
559
- },
560
- },
561
- activeEnvironment: "dev",
562
- };
563
- readFileSyncStub.returns(JSON.stringify(mockConfig));
564
-
565
- clientConfig.printStatus();
566
-
567
- expect(loggerStub.info.calledWith(sinon.match("Cell:"))).to.be.true;
568
- expect(loggerStub.info.calledWith(sinon.match("dev"))).to.be.true;
569
- expect(
570
- loggerStub.info.calledWith(
571
- sinon.match("https://dev-admin.credibledata.com/api/v0"),
572
- ),
573
- ).to.be.true;
574
- });
575
-
576
- it("should name the targeted cell even when the token is invalid", () => {
577
- const mockConfig = {
578
- configPerEnvironment: {
579
- production: {},
580
- staging: {},
581
- localhost: {},
582
- },
583
- activeEnvironment: "localhost",
584
- };
585
- readFileSyncStub.returns(JSON.stringify(mockConfig));
586
-
587
- clientConfig.printStatus();
588
-
589
- expect(loggerStub.info.calledWith(sinon.match("Cell:"))).to.be.true;
590
- expect(
591
- loggerStub.info.calledWith(
592
- sinon.match("http://admin.ms2.localhost/api/v0"),
593
- ),
594
- ).to.be.true;
595
- });
596
-
597
- it("should print error when token is invalid", () => {
598
- const mockConfig = {
599
- configPerEnvironment: {
600
- production: {},
601
- staging: {},
602
- localhost: {},
603
- },
604
- activeEnvironment: "production",
605
- };
606
- readFileSyncStub.returns(JSON.stringify(mockConfig));
607
-
608
- clientConfig.printStatus();
609
-
610
- expect(
611
- loggerStub.error.calledWith(sinon.match("Failed to get status")),
612
- ).to.be.true;
613
- });
614
- });
615
- });