@xano/xanoscript-language-server 11.12.1 → 11.12.3

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 (339) hide show
  1. package/lexer/tokens.js +22 -3
  2. package/package.json +25 -1
  3. package/.claude/memory/feedback_no_git.md +0 -11
  4. package/.claude/settings.local.json +0 -21
  5. package/.github/copilot-instructions.md +0 -190
  6. package/.github/workflows/ci.yml +0 -31
  7. package/.husky/pre-commit +0 -1
  8. package/CLAUDE.md +0 -256
  9. package/eslint.config.js +0 -24
  10. package/lexer/comment.spec.js +0 -77
  11. package/lexer/multiline.spec.js +0 -179
  12. package/lexer/tests/query/query_lexer.spec.js +0 -36
  13. package/lexer/tests/query/valid_sources/basic_query.xs +0 -44
  14. package/lexer/tests/query/valid_sources/db_query.xs +0 -77
  15. package/lexer/tests/query/valid_sources/empty_query.xs +0 -5
  16. package/lexer/tests/query/valid_sources/header_query.xs +0 -15
  17. package/lexer/tests/table/basic_table.xs +0 -17
  18. package/lexer/tests/table/empty_table.xs +0 -3
  19. package/lexer/tests/table/table_lexer.spec.js +0 -324
  20. package/lexer/utils.spec.js +0 -61
  21. package/onCompletion/contentAssist.spec.js +0 -275
  22. package/onDefinition/onDefinition.spec.js +0 -313
  23. package/onHover/FilterMessageProvider.spec.js +0 -85
  24. package/onHover/FunctionMessageProvider.spec.js +0 -128
  25. package/onHover/InputFilterMessageProvider.spec.js +0 -329
  26. package/onHover/QueryFilterMessageProvider.spec.js +0 -164
  27. package/onHover/onHoverDocument.spec.js +0 -660
  28. package/parser/addon_parser.spec.js +0 -88
  29. package/parser/agent_parser.spec.js +0 -599
  30. package/parser/agent_trigger_parser.spec.js +0 -525
  31. package/parser/api_group_parser.spec.js +0 -137
  32. package/parser/attributes/columnDefaultValueAttribute.spec.js +0 -49
  33. package/parser/attributes/descriptionFieldAttribute.spec.js +0 -39
  34. package/parser/attributes/disabledFieldAttribute.spec.js +0 -34
  35. package/parser/attributes/docsFieldAttribute.spec.js +0 -44
  36. package/parser/attributes/guidFieldAttribute.spec.js +0 -93
  37. package/parser/attributes/inputFilterFn.spec.js +0 -39
  38. package/parser/attributes/sensitiveFieldAttribute.spec.js +0 -39
  39. package/parser/attributes/valueFieldAttribute.spec.js +0 -54
  40. package/parser/attributes/valuesFieldAttribute.spec.js +0 -44
  41. package/parser/attributes/visibilityFieldAttribute.spec.js +0 -44
  42. package/parser/branch_parser.spec.js +0 -34
  43. package/parser/clauses/agentClause.spec.js +0 -34
  44. package/parser/clauses/authClause.spec.js +0 -39
  45. package/parser/clauses/cacheClause.spec.js +0 -103
  46. package/parser/clauses/canonicalClause.spec.js +0 -34
  47. package/parser/clauses/channelClause.spec.js +0 -34
  48. package/parser/clauses/dbTableClause.spec.js +0 -34
  49. package/parser/clauses/historyClause.spec.js +0 -53
  50. package/parser/clauses/indexClause.spec.js +0 -47
  51. package/parser/clauses/inputClause.spec.js +0 -96
  52. package/parser/clauses/mcpServerClause.spec.js +0 -34
  53. package/parser/clauses/middlewareClause.spec.js +0 -161
  54. package/parser/clauses/nakedStackFn.spec.js +0 -73
  55. package/parser/clauses/responseClause.spec.js +0 -47
  56. package/parser/clauses/scheduleClause.spec.js +0 -71
  57. package/parser/clauses/schemaClause.spec.js +0 -102
  58. package/parser/clauses/testClause.spec.js +0 -69
  59. package/parser/clauses/viewClause.spec.js +0 -163
  60. package/parser/definitions/arraySlice.spec.js +0 -49
  61. package/parser/definitions/columnDefinition.spec.js +0 -199
  62. package/parser/definitions/dbLinkColumnDefinition.spec.js +0 -45
  63. package/parser/definitions/enumColumnDefinition.spec.js +0 -108
  64. package/parser/definitions/filterDefinition.spec.js +0 -43
  65. package/parser/definitions/objectColumnDefinition.spec.js +0 -118
  66. package/parser/function_parser.spec.js +0 -131
  67. package/parser/functions/actionCallFn.spec.js +0 -51
  68. package/parser/functions/addonCallFn.spec.js +0 -41
  69. package/parser/functions/ai/aiAgentRunFn.spec.js +0 -94
  70. package/parser/functions/ai/aiExternalMcpServerDetailsFn.spec.js +0 -85
  71. package/parser/functions/ai/aiExternalMcpToolListFn.spec.js +0 -85
  72. package/parser/functions/ai/aiExternalMcpToolRunFn.spec.js +0 -101
  73. package/parser/functions/aiFn.spec.js +0 -51
  74. package/parser/functions/api/apiCallFn.spec.js +0 -62
  75. package/parser/functions/api/apiLambdaFn.spec.js +0 -63
  76. package/parser/functions/api/apiRealtimeEventFn.spec.js +0 -82
  77. package/parser/functions/api/apiRequestFn.spec.js +0 -113
  78. package/parser/functions/api/apiStreamFn.spec.js +0 -44
  79. package/parser/functions/api/webflowRequestFn.spec.js +0 -114
  80. package/parser/functions/array/arrayDifferenceFn.spec.js +0 -34
  81. package/parser/functions/array/arrayFindFn.spec.js +0 -44
  82. package/parser/functions/array/arrayGroupByFn.spec.js +0 -41
  83. package/parser/functions/array/arrayIntersectionFn.spec.js +0 -22
  84. package/parser/functions/array/arrayMapFn.spec.js +0 -37
  85. package/parser/functions/array/arrayNoValueAs.spec.js +0 -56
  86. package/parser/functions/array/arrayPartitionFn.spec.js +0 -29
  87. package/parser/functions/array/arrayUnionFn.spec.js +0 -22
  88. package/parser/functions/array/arrayValueIfAs.spec.js +0 -54
  89. package/parser/functions/array/arrayValueOnly.spec.js +0 -61
  90. package/parser/functions/array/valueAttrOnly.spec.js +0 -61
  91. package/parser/functions/cloud/cloudAlgoliaRequestFn.spec.js +0 -30
  92. package/parser/functions/cloud/cloudAwsS3Fn.spec.js +0 -21
  93. package/parser/functions/cloud/cloudDeleteFileFn.spec.js +0 -25
  94. package/parser/functions/cloud/cloudGetFileInfoFn.spec.js +0 -25
  95. package/parser/functions/cloud/cloudListDirectoryFn.spec.js +0 -26
  96. package/parser/functions/cloud/cloudReadFileFn.spec.js +0 -25
  97. package/parser/functions/cloud/cloudSearchDocumentFn.spec.js +0 -28
  98. package/parser/functions/cloud/cloudSearchQueryFn.spec.js +0 -32
  99. package/parser/functions/cloud/cloudSearchRequestFn.spec.js +0 -32
  100. package/parser/functions/cloud/cloudSignUrlFn.spec.js +0 -26
  101. package/parser/functions/cloud/cloudStorageFn.spec.js +0 -21
  102. package/parser/functions/cloud/cloudUploadFileFn.spec.js +0 -29
  103. package/parser/functions/controls/awaitFn.spec.js +0 -48
  104. package/parser/functions/controls/conditionalFn.spec.js +0 -188
  105. package/parser/functions/controls/forEachFn.spec.js +0 -109
  106. package/parser/functions/controls/forFn.spec.js +0 -85
  107. package/parser/functions/controls/functionRunFn.spec.js +0 -77
  108. package/parser/functions/controls/groupFn.spec.js +0 -63
  109. package/parser/functions/controls/preconditionFn.spec.js +0 -107
  110. package/parser/functions/controls/returnFn.spec.js +0 -44
  111. package/parser/functions/controls/switchFn.spec.js +0 -118
  112. package/parser/functions/controls/throwFn.spec.js +0 -56
  113. package/parser/functions/controls/tryCatchFn.spec.js +0 -193
  114. package/parser/functions/controls/whileFn.spec.js +0 -94
  115. package/parser/functions/db/dbAddFn.spec.js +0 -72
  116. package/parser/functions/db/dbAddOrEditFn.spec.js +0 -97
  117. package/parser/functions/db/dbBulkAddFn.spec.js +0 -94
  118. package/parser/functions/db/dbBulkDeleteFn.spec.js +0 -28
  119. package/parser/functions/db/dbBulkPatchFn.spec.js +0 -42
  120. package/parser/functions/db/dbBulkUpdateFn.spec.js +0 -42
  121. package/parser/functions/db/dbDelFn.spec.js +0 -67
  122. package/parser/functions/db/dbDirectQueryFn.spec.js +0 -104
  123. package/parser/functions/db/dbEditFn.spec.js +0 -122
  124. package/parser/functions/db/dbExternalDirectQueryFn.spec.js +0 -103
  125. package/parser/functions/db/dbGetFn.spec.js +0 -117
  126. package/parser/functions/db/dbHasFn.spec.js +0 -62
  127. package/parser/functions/db/dbPatchFn.spec.js +0 -88
  128. package/parser/functions/db/dbQueryFn.spec.js +0 -380
  129. package/parser/functions/db/dbSchemaFn.spec.js +0 -42
  130. package/parser/functions/db/dbSetDatasourceFn.spec.js +0 -44
  131. package/parser/functions/db/dbTransactionFn.spec.js +0 -63
  132. package/parser/functions/db/dbTruncateFn.spec.js +0 -42
  133. package/parser/functions/debug/debugLogFn.spec.js +0 -44
  134. package/parser/functions/debug/debugStopFn.spec.js +0 -44
  135. package/parser/functions/expect/unitExpectToBeWithinFn.spec.js +0 -63
  136. package/parser/functions/expect/unitExpectToThrowFn.spec.js +0 -40
  137. package/parser/functions/expect/unitExpectWithArgumentsFn.spec.js +0 -355
  138. package/parser/functions/expect/unitExpectWithoutArgumentsFn.spec.js +0 -69
  139. package/parser/functions/expect/workflowExpectToBeWithinFn.spec.js +0 -70
  140. package/parser/functions/expect/workflowExpectToThrowFn.spec.js +0 -56
  141. package/parser/functions/expect/workflowExpectWithArgumentsFn.spec.js +0 -308
  142. package/parser/functions/expect/workflowExpectWithoutArgumentsFn.spec.js +0 -87
  143. package/parser/functions/math/allMathFn.spec.js +0 -100
  144. package/parser/functions/middlewareCallFn.spec.js +0 -44
  145. package/parser/functions/object/objectEntriesFn.spec.js +0 -44
  146. package/parser/functions/object/objectKeysFn.spec.js +0 -44
  147. package/parser/functions/object/objectValuesFn.spec.js +0 -44
  148. package/parser/functions/redis/redisCountFn.spec.js +0 -58
  149. package/parser/functions/redis/redisDecrFn.spec.js +0 -47
  150. package/parser/functions/redis/redisDelFn.spec.js +0 -58
  151. package/parser/functions/redis/redisGetFn.spec.js +0 -67
  152. package/parser/functions/redis/redisHasFn.spec.js +0 -58
  153. package/parser/functions/redis/redisIncrFn.spec.js +0 -74
  154. package/parser/functions/redis/redisKeysFn.spec.js +0 -67
  155. package/parser/functions/redis/redisPopFn.spec.js +0 -75
  156. package/parser/functions/redis/redisPushFn.spec.js +0 -71
  157. package/parser/functions/redis/redisRangeFn.spec.js +0 -80
  158. package/parser/functions/redis/redisRateLimitFn.spec.js +0 -87
  159. package/parser/functions/redis/redisRemoveFn.spec.js +0 -65
  160. package/parser/functions/redis/redisSetFn.spec.js +0 -89
  161. package/parser/functions/redis/redisShiftFn.spec.js +0 -75
  162. package/parser/functions/redis/redisUnshiftFn.spec.js +0 -73
  163. package/parser/functions/schema/schemaFn.spec.js +0 -92
  164. package/parser/functions/schema/schemaParseArrayFn.spec.js +0 -134
  165. package/parser/functions/schema/schemaParseAttributeFn.spec.js +0 -285
  166. package/parser/functions/schema/schemaParseConstantFn.spec.js +0 -122
  167. package/parser/functions/schema/schemaParseEnum.spec.js +0 -47
  168. package/parser/functions/schema/schemaParseImmutableFn.spec.js +0 -99
  169. package/parser/functions/schema/schemaParseObjectFn.spec.js +0 -223
  170. package/parser/functions/schema/utils.spec.js +0 -27
  171. package/parser/functions/security/securityCheckPasswordFn.spec.js +0 -22
  172. package/parser/functions/security/securityCreateAuthTokenFn.spec.js +0 -51
  173. package/parser/functions/security/securityCreateCurveKeyFn.spec.js +0 -22
  174. package/parser/functions/security/securityCreatePasswordFn.spec.js +0 -26
  175. package/parser/functions/security/securityCreateRsaKeyFn.spec.js +0 -22
  176. package/parser/functions/security/securityCreateSecretKeyFn.spec.js +0 -22
  177. package/parser/functions/security/securityCreateUuidFn.spec.js +0 -27
  178. package/parser/functions/security/securityDecryptFn.spec.js +0 -24
  179. package/parser/functions/security/securityEncryptFn.spec.js +0 -24
  180. package/parser/functions/security/securityJweDecodeFn.spec.js +0 -26
  181. package/parser/functions/security/securityJweDecodeLegacyFn.spec.js +0 -26
  182. package/parser/functions/security/securityJweEncodeFn.spec.js +0 -26
  183. package/parser/functions/security/securityJweEncodeLegacyFn.spec.js +0 -25
  184. package/parser/functions/security/securityJwsDecodeFn.spec.js +0 -25
  185. package/parser/functions/security/securityJwsEncodeFn.spec.js +0 -25
  186. package/parser/functions/security/securityRandomBytesFn.spec.js +0 -21
  187. package/parser/functions/security/securityRandomNumberFn.spec.js +0 -22
  188. package/parser/functions/storage/storageCreateAttachmentFn.spec.js +0 -87
  189. package/parser/functions/storage/storageCreateAudioFn.spec.js +0 -98
  190. package/parser/functions/storage/storageCreateFileResourceFn.spec.js +0 -72
  191. package/parser/functions/storage/storageCreateImageFn.spec.js +0 -98
  192. package/parser/functions/storage/storageCreateVideoFn.spec.js +0 -99
  193. package/parser/functions/storage/storageDeleteFileFn.spec.js +0 -67
  194. package/parser/functions/storage/storageReadFileResourceFn.spec.js +0 -60
  195. package/parser/functions/storage/storageSignPrivateUrlFn.spec.js +0 -72
  196. package/parser/functions/stream/streamFromCsvFn.spec.js +0 -69
  197. package/parser/functions/stream/streamFromJsonlFn.spec.js +0 -47
  198. package/parser/functions/stream/streamFromRequestFn.spec.js +0 -103
  199. package/parser/functions/text/allTextWithReturnValueFn.spec.js +0 -100
  200. package/parser/functions/text/allTextWithoutReturnValueFn.spec.js +0 -122
  201. package/parser/functions/toolCallFn.spec.js +0 -28
  202. package/parser/functions/triggerCallFn.spec.js +0 -51
  203. package/parser/functions/unitExpectFn.spec.js +0 -21
  204. package/parser/functions/util/utilGeoDistanceFn.spec.js +0 -79
  205. package/parser/functions/util/utilGetAllInputFn.spec.js +0 -33
  206. package/parser/functions/util/utilGetEnvFn.spec.js +0 -33
  207. package/parser/functions/util/utilGetRawInputFn.spec.js +0 -62
  208. package/parser/functions/util/utilGetVarsFn.spec.js +0 -33
  209. package/parser/functions/util/utilIpLookupFn.spec.js +0 -37
  210. package/parser/functions/util/utilPostProcessFn.spec.js +0 -63
  211. package/parser/functions/util/utilSendEmailFn.spec.js +0 -62
  212. package/parser/functions/util/utilSetHeaderFn.spec.js +0 -48
  213. package/parser/functions/util/utilSleepFn.spec.js +0 -44
  214. package/parser/functions/util/utilTemplateFn.spec.js +0 -78
  215. package/parser/functions/varFn.spec.js +0 -332
  216. package/parser/functions/workflowExpectFn.spec.js +0 -32
  217. package/parser/functions/zip/zipAddToArchiveFn.spec.js +0 -78
  218. package/parser/functions/zip/zipCreateArchiveFn.spec.js +0 -53
  219. package/parser/functions/zip/zipDeleteFromArchiveFn.spec.js +0 -69
  220. package/parser/functions/zip/zipExtractFn.spec.js +0 -52
  221. package/parser/functions/zip/zipViewContentsFn.spec.js +0 -52
  222. package/parser/generic/arrayWithValues.spec.js +0 -72
  223. package/parser/generic/asVariable.spec.js +0 -117
  224. package/parser/generic/assignableVariableAs.spec.js +0 -126
  225. package/parser/generic/assignableVariableProperty.spec.js +0 -138
  226. package/parser/generic/castedValue.spec.js +0 -29
  227. package/parser/generic/chainedIdentifier.spec.js +0 -89
  228. package/parser/generic/completeAuthVariable.spec.js +0 -23
  229. package/parser/generic/completeEnvVariable.spec.js +0 -99
  230. package/parser/generic/completeErrorVariable.spec.js +0 -17
  231. package/parser/generic/completeInputVariable.spec.js +0 -53
  232. package/parser/generic/expressionFn.spec.js +0 -605
  233. package/parser/generic/filterFn.spec.js +0 -47
  234. package/parser/generic/functionAttrReq.spec.js +0 -353
  235. package/parser/generic/longFormVariable.spec.js +0 -25
  236. package/parser/generic/minimalFnBody.spec.js +0 -47
  237. package/parser/generic/mockAttribute.spec.js +0 -57
  238. package/parser/generic/multilineFilterFn.spec.js +0 -51
  239. package/parser/generic/objectWithAttributes.spec.js +0 -147
  240. package/parser/generic/requiredValueFnBody.spec.js +0 -56
  241. package/parser/generic/shortFormVariable.spec.js +0 -27
  242. package/parser/generic/stringArray.spec.js +0 -55
  243. package/parser/generic/tagsAttribute.spec.js +0 -47
  244. package/parser/generic/variableOnly.spec.js +0 -47
  245. package/parser/mcp_server_parser.spec.js +0 -478
  246. package/parser/mcp_server_trigger_parser.spec.js +0 -396
  247. package/parser/metadata/columnMetadataDefinition.spec.js +0 -47
  248. package/parser/metadata/enumColumnMetadataDefinition.spec.js +0 -81
  249. package/parser/middleware_parser.spec.js +0 -230
  250. package/parser/multidoc.spec.js +0 -946
  251. package/parser/query_parser.spec.js +0 -202
  252. package/parser/realtime_channel_parser.spec.js +0 -20
  253. package/parser/realtime_trigger_parser.spec.js +0 -469
  254. package/parser/run_parser.spec.js +0 -100
  255. package/parser/table_parser.spec.js +0 -176
  256. package/parser/table_trigger_parser.spec.js +0 -478
  257. package/parser/task_parser.spec.js +0 -94
  258. package/parser/tests/agent/agent_parser.spec.js +0 -52
  259. package/parser/tests/agent/valid_sources/customer_servier_agent.xs +0 -45
  260. package/parser/tests/api_group/api_group_parser.spec.js +0 -52
  261. package/parser/tests/api_group/valid_sources/api_group_history.xs +0 -4
  262. package/parser/tests/api_group/valid_sources/basic_api_group.xs +0 -3
  263. package/parser/tests/api_group/valid_sources/complete_api_group.xs +0 -7
  264. package/parser/tests/api_group/valid_sources/protected_api_group.xs +0 -7
  265. package/parser/tests/function/function_parser.spec.js +0 -52
  266. package/parser/tests/function/valid_sources/all_controls.xs +0 -68
  267. package/parser/tests/function/valid_sources/all_query_return_types.xs +0 -227
  268. package/parser/tests/function/valid_sources/all_storage.xs +0 -45
  269. package/parser/tests/function/valid_sources/discord_poll_send_to_slack.xs +0 -133
  270. package/parser/tests/function/valid_sources/expression_in_response.xs +0 -22
  271. package/parser/tests/function/valid_sources/filter_by_value.xs +0 -55
  272. package/parser/tests/function/valid_sources/filter_query.xs +0 -82
  273. package/parser/tests/function/valid_sources/large_regex.xs +0 -13
  274. package/parser/tests/function/valid_sources/ledash_ends_with.xs +0 -90
  275. package/parser/tests/function/valid_sources/multiline_description.xs +0 -28
  276. package/parser/tests/function/valid_sources/multiline_expr.xs +0 -41
  277. package/parser/tests/function/valid_sources/set_theory_fn.xs +0 -129
  278. package/parser/tests/function/valid_sources/simple_unit_test.xs +0 -33
  279. package/parser/tests/function/valid_sources/valid_officer.xs +0 -57
  280. package/parser/tests/function/valid_sources/webflow.xs +0 -18
  281. package/parser/tests/multidoc/multidoc_parser.spec.js +0 -55
  282. package/parser/tests/multidoc/valid_sources/function_stack.xs +0 -130603
  283. package/parser/tests/query/query_parser.spec.js +0 -54
  284. package/parser/tests/query/valid_sources/all_basics.xs +0 -51
  285. package/parser/tests/query/valid_sources/all_cloud.xs +0 -141
  286. package/parser/tests/query/valid_sources/all_db.xs +0 -102
  287. package/parser/tests/query/valid_sources/all_external_db.xs +0 -43
  288. package/parser/tests/query/valid_sources/all_keywords.xs +0 -65
  289. package/parser/tests/query/valid_sources/all_math.xs +0 -53
  290. package/parser/tests/query/valid_sources/all_object.xs +0 -25
  291. package/parser/tests/query/valid_sources/all_redis.xs +0 -106
  292. package/parser/tests/query/valid_sources/all_security.xs +0 -105
  293. package/parser/tests/query/valid_sources/all_stream.xs +0 -69
  294. package/parser/tests/query/valid_sources/all_text.xs +0 -54
  295. package/parser/tests/query/valid_sources/all_util.xs +0 -66
  296. package/parser/tests/query/valid_sources/all_zip.xs +0 -39
  297. package/parser/tests/query/valid_sources/arrays.xs +0 -33
  298. package/parser/tests/query/valid_sources/disabled_response.xs +0 -27
  299. package/parser/tests/query/valid_sources/multiline_lambda_GET.xs +0 -50
  300. package/parser/tests/query/valid_sources/mutliline_query.xs +0 -140
  301. package/parser/tests/query/valid_sources/patch_expression_multiline.xs +0 -27
  302. package/parser/tests/query/valid_sources/query_cache.xs +0 -34
  303. package/parser/tests/query/valid_sources/query_example.xs +0 -43
  304. package/parser/tests/query/valid_sources/query_mini.xs +0 -11
  305. package/parser/tests/query/valid_sources/query_rich_inputs.xs +0 -32
  306. package/parser/tests/query/valid_sources/simple_unit_test.xs +0 -33
  307. package/parser/tests/query/valid_sources/test_with_slashes.xs +0 -22
  308. package/parser/tests/query/valid_sources/with_unit_test.xs +0 -97
  309. package/parser/tests/table/table_parser.spec.js +0 -52
  310. package/parser/tests/table/valid_sources/account.xs +0 -31
  311. package/parser/tests/table/valid_sources/all_basic_columns.xs +0 -44
  312. package/parser/tests/table/valid_sources/basic_table.xs +0 -15
  313. package/parser/tests/table/valid_sources/empty_object.xs +0 -17
  314. package/parser/tests/table/valid_sources/empty_table.xs +0 -3
  315. package/parser/tests/table/valid_sources/multiline_index.xs +0 -33
  316. package/parser/tests/table/valid_sources/relation.xs +0 -44
  317. package/parser/tests/table/valid_sources/rich_columns.xs +0 -31
  318. package/parser/tests/table/valid_sources/table_with_comments.xs +0 -17
  319. package/parser/tests/table/valid_sources/table_with_search_index.xs +0 -31
  320. package/parser/tests/table/valid_sources/view_table.xs +0 -62
  321. package/parser/tests/task/task_parser.spec.js +0 -53
  322. package/parser/tests/task/valid_sources/active_event.xs +0 -11
  323. package/parser/tests/task/valid_sources/all_events.xs +0 -17
  324. package/parser/tests/task/valid_sources/create_leak.xs +0 -165
  325. package/parser/tests/task/valid_sources/daily_sales_report.xs +0 -56
  326. package/parser/tests/task/valid_sources/inactive_event.xs +0 -11
  327. package/parser/tests/variable_test/coverage_check.xs +0 -293
  328. package/parser/tests/workflow_test/valid_sources/basic_workflow_test.xs +0 -13
  329. package/parser/tests/workflow_test/workflow_test_parser.spec.js +0 -52
  330. package/parser/tool_parser.spec.js +0 -115
  331. package/parser/variableValidator.spec.js +0 -179
  332. package/parser/workflow_test_parser.spec.js +0 -136
  333. package/parser/workspace_parser.spec.js +0 -142
  334. package/parser/workspace_trigger_parser.spec.js +0 -332
  335. package/toTmLanguage.js +0 -75
  336. package/utils.spec.js +0 -369
  337. package/workspace/crossFileValidator.spec.js +0 -654
  338. package/workspace/referenceTracking.spec.js +0 -420
  339. package/workspace/workspaceIndex.spec.js +0 -189
@@ -1,324 +0,0 @@
1
- import { expect } from "chai";
2
- import { tokenMatcher } from "chevrotain";
3
- import { readFileSync } from "fs";
4
- import { describe, it } from "mocha";
5
- import { Iterator } from "../../../utils.js";
6
- import { IntToken, TimestampToken } from "../../columns.js";
7
- import {
8
- ColonToken,
9
- CommaToken,
10
- EqualToken,
11
- LCurly,
12
- LSquare,
13
- Question,
14
- RCurly,
15
- RSquare,
16
- } from "../../control.js";
17
- import { SchemaToken } from "../../db.js";
18
- import { lexDocument } from "../../lexer.js";
19
- import { StringLiteral } from "../../literal.js";
20
- import { SecurityToken } from "../../security.js";
21
- import { TableToken } from "../../table.js";
22
- import {
23
- AuthToken,
24
- FalseToken,
25
- FieldToken,
26
- GuidToken,
27
- Identifier,
28
- IndexToken,
29
- NewlineToken,
30
- NowToken,
31
- TrueToken,
32
- TypeToken,
33
- } from "../../tokens.js";
34
-
35
- describe("Xanoscript Table Lexer", () => {
36
- it("Can Lex an empty table", () => {
37
- const empty_table = readFileSync(
38
- "lexer/tests/table/empty_table.xs",
39
- "utf8"
40
- );
41
- const lexingResult = lexDocument(empty_table);
42
-
43
- expect(lexingResult.errors).to.be.empty;
44
-
45
- const tokens = new Iterator(lexingResult.tokens);
46
- expect(tokens.next().image).to.equal("table");
47
- expect(tokens.next().image).to.equal("empty");
48
- expect(tokens.next().image).to.equal("{");
49
- expect(tokens.next().image).to.equal("\n");
50
- expect(tokens.next().image).to.equal("auth");
51
- expect(tokens.next().image).to.equal("=");
52
- expect(tokens.next().image).to.equal("false");
53
- expect(tokens.next().image).to.equal("\n");
54
- expect(tokens.next().image).to.equal("}");
55
- expect(tokens.next()).to.be.undefined;
56
-
57
- tokens.reset();
58
- // tokenMatcher acts as an "instanceof" check for Tokens
59
- expect(tokenMatcher(tokens.next(), TableToken)).to.be.true;
60
- expect(tokenMatcher(tokens.next(), Identifier)).to.be.true;
61
- expect(tokenMatcher(tokens.next(), LCurly)).to.be.true;
62
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
63
- expect(tokenMatcher(tokens.next(), AuthToken)).to.be.true;
64
- expect(tokenMatcher(tokens.next(), EqualToken)).to.be.true;
65
- expect(tokenMatcher(tokens.next(), FalseToken)).to.be.true;
66
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
67
- expect(tokenMatcher(tokens.next(), RCurly)).to.be.true;
68
- });
69
-
70
- it("Can Lex a basic table", () => {
71
- const basic_table = readFileSync(
72
- "lexer/tests/table/basic_table.xs",
73
- "utf8"
74
- );
75
- const lexingResult = lexDocument(basic_table);
76
-
77
- expect(lexingResult.errors).to.be.empty;
78
-
79
- const tokens = new Iterator(lexingResult.tokens);
80
- expect(tokens.next().image).to.equal("table");
81
- expect(tokens.next().image).to.equal("empty");
82
- expect(tokens.next().image).to.equal("{");
83
-
84
- // auth = true
85
- expect(tokens.next().image).to.equal("\n");
86
- expect(tokens.next().image).to.equal("auth");
87
- expect(tokens.next().image).to.equal("=");
88
- expect(tokens.next().image).to.equal("true");
89
- expect(tokens.next().image).to.equal("\n");
90
-
91
- // entering security section
92
- expect(tokens.next().image).to.equal("security");
93
- expect(tokens.next().image).to.equal("=");
94
- expect(tokens.next().image).to.equal("{");
95
- expect(tokens.next().image).to.equal("\n");
96
-
97
- // guid = "-iOFONN4cySSKJ0MTrPNojIWB5c"
98
- expect(tokens.next().image).to.equal("guid");
99
- expect(tokens.next().image).to.equal(":");
100
- expect(tokens.next().image).to.equal('"-iOFONN4cySSKJ0MTrPNojIWB5c"');
101
- expect(tokens.next().image).to.equal("\n");
102
-
103
- // leaving security section
104
- expect(tokens.next().image).to.equal("}");
105
- expect(tokens.next().image).to.equal("\n");
106
- expect(tokens.next().image).to.equal("\n");
107
-
108
- // entering schema section
109
- expect(tokens.next().image).to.equal("schema");
110
- expect(tokens.next().image).to.equal("{");
111
- expect(tokens.next().image).to.equal("\n");
112
-
113
- // int id
114
- expect(tokens.next().image).to.equal("int");
115
- expect(tokens.next().image).to.equal("id");
116
- expect(tokens.next().image).to.equal("\n");
117
-
118
- // timestamp created_at?=now
119
- expect(tokens.next().image).to.equal("timestamp");
120
- expect(tokens.next().image).to.equal("created_at");
121
- expect(tokens.next().image).to.equal("?");
122
- expect(tokens.next().image).to.equal("=");
123
- expect(tokens.next().image).to.equal("now");
124
- expect(tokens.next().image).to.equal("\n");
125
-
126
- // leaving schema section
127
- expect(tokens.next().image).to.equal("}");
128
- expect(tokens.next().image).to.equal("\n");
129
- expect(tokens.next().image).to.equal("\n");
130
-
131
- // entering index section
132
- expect(tokens.next().image).to.equal("index");
133
- expect(tokens.next().image).to.equal("=");
134
- expect(tokens.next().image).to.equal("[");
135
- expect(tokens.next().image).to.equal("\n");
136
-
137
- // {type: "primary", field: [{name: "id"}]}
138
- expect(tokens.next().image).to.equal("{");
139
- expect(tokens.next().image).to.equal("type");
140
- expect(tokens.next().image).to.equal(":");
141
- expect(tokens.next().image).to.equal('"primary"');
142
- expect(tokens.next().image).to.equal(",");
143
- expect(tokens.next().image).to.equal("field");
144
- expect(tokens.next().image).to.equal(":");
145
- expect(tokens.next().image).to.equal("[");
146
- expect(tokens.next().image).to.equal("{");
147
- expect(tokens.next().image).to.equal("name");
148
- expect(tokens.next().image).to.equal(":");
149
- expect(tokens.next().image).to.equal('"id"');
150
- expect(tokens.next().image).to.equal("}");
151
- expect(tokens.next().image).to.equal("]");
152
- expect(tokens.next().image).to.equal("}");
153
- expect(tokens.next().image).to.equal("\n");
154
-
155
- // {type: "gin", field: [{name: "xdo", op: "jsonb_path_op"}]}
156
- expect(tokens.next().image).to.equal("{");
157
- expect(tokens.next().image).to.equal("type");
158
- expect(tokens.next().image).to.equal(":");
159
- expect(tokens.next().image).to.equal('"gin"');
160
- expect(tokens.next().image).to.equal(",");
161
- expect(tokens.next().image).to.equal("field");
162
- expect(tokens.next().image).to.equal(":");
163
- expect(tokens.next().image).to.equal("[");
164
- expect(tokens.next().image).to.equal("{");
165
- expect(tokens.next().image).to.equal("name");
166
- expect(tokens.next().image).to.equal(":");
167
- expect(tokens.next().image).to.equal('"xdo"');
168
- expect(tokens.next().image).to.equal(",");
169
- expect(tokens.next().image).to.equal("op");
170
- expect(tokens.next().image).to.equal(":");
171
- expect(tokens.next().image).to.equal('"jsonb_path_op"');
172
- expect(tokens.next().image).to.equal("}");
173
- expect(tokens.next().image).to.equal("]");
174
- expect(tokens.next().image).to.equal("}");
175
- expect(tokens.next().image).to.equal("\n");
176
-
177
- // {type: "btree", field: [{name: "created_at", op: "desc"}]}
178
- expect(tokens.next().image).to.equal("{");
179
- expect(tokens.next().image).to.equal("type");
180
- expect(tokens.next().image).to.equal(":");
181
- expect(tokens.next().image).to.equal('"btree"');
182
- expect(tokens.next().image).to.equal(",");
183
- expect(tokens.next().image).to.equal("field");
184
- expect(tokens.next().image).to.equal(":");
185
- expect(tokens.next().image).to.equal("[");
186
- expect(tokens.next().image).to.equal("{");
187
- expect(tokens.next().image).to.equal("name");
188
- expect(tokens.next().image).to.equal(":");
189
- expect(tokens.next().image).to.equal('"created_at"');
190
- expect(tokens.next().image).to.equal(",");
191
- expect(tokens.next().image).to.equal("op");
192
- expect(tokens.next().image).to.equal(":");
193
- expect(tokens.next().image).to.equal('"desc"');
194
- expect(tokens.next().image).to.equal("}");
195
- expect(tokens.next().image).to.equal("]");
196
- expect(tokens.next().image).to.equal("}");
197
- expect(tokens.next().image).to.equal("\n");
198
-
199
- // leaving index section
200
- expect(tokens.next().image).to.equal("]");
201
- expect(tokens.next().image).to.equal("\n");
202
-
203
- // leaving table
204
- expect(tokens.next().image).to.equal("}");
205
-
206
- tokens.reset();
207
- // // tokenMatcher acts as an "instanceof" check for Tokens
208
- expect(tokenMatcher(tokens.next(), TableToken)).to.be.true;
209
- expect(tokenMatcher(tokens.next(), Identifier)).to.be.true;
210
- expect(tokenMatcher(tokens.next(), LCurly)).to.be.true;
211
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
212
- expect(tokenMatcher(tokens.next(), AuthToken)).to.be.true;
213
- expect(tokenMatcher(tokens.next(), EqualToken)).to.be.true;
214
- expect(tokenMatcher(tokens.next(), TrueToken)).to.be.true;
215
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
216
-
217
- // security {
218
- // guid = "-iOFONN4cySSKJ0MTrPNojIWB5c"
219
- // }
220
- expect(tokenMatcher(tokens.next(), SecurityToken)).to.be.true;
221
- expect(tokenMatcher(tokens.next(), EqualToken)).to.be.true;
222
- expect(tokenMatcher(tokens.next(), LCurly)).to.be.true;
223
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
224
- expect(tokenMatcher(tokens.next(), GuidToken)).to.be.true;
225
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
226
- expect(tokenMatcher(tokens.next(), StringLiteral)).to.be.true;
227
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
228
- expect(tokenMatcher(tokens.next(), RCurly)).to.be.true;
229
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
230
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
231
-
232
- // schema {
233
- // int id
234
- // timestamp created_at?=now
235
- // }
236
- expect(tokenMatcher(tokens.next(), SchemaToken)).to.be.true;
237
- expect(tokenMatcher(tokens.next(), LCurly)).to.be.true;
238
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
239
- expect(tokenMatcher(tokens.next(), IntToken)).to.be.true;
240
- expect(tokenMatcher(tokens.next(), Identifier)).to.be.true;
241
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
242
- expect(tokenMatcher(tokens.next(), TimestampToken)).to.be.true;
243
- expect(tokenMatcher(tokens.next(), Identifier)).to.be.true;
244
- expect(tokenMatcher(tokens.next(), Question)).to.be.true;
245
- expect(tokenMatcher(tokens.next(), EqualToken)).to.be.true;
246
- expect(tokenMatcher(tokens.next(), NowToken)).to.be.true;
247
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
248
- expect(tokenMatcher(tokens.next(), RCurly)).to.be.true;
249
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
250
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
251
-
252
- // index = [{...}, {...}, {...}]
253
- expect(tokenMatcher(tokens.next(), IndexToken)).to.be.true;
254
- expect(tokenMatcher(tokens.next(), EqualToken)).to.be.true;
255
- expect(tokenMatcher(tokens.next(), LSquare)).to.be.true;
256
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
257
-
258
- // {type: "primary", field: [{name: "id"}]}
259
- expect(tokenMatcher(tokens.next(), LCurly)).to.be.true;
260
- expect(tokenMatcher(tokens.next(), TypeToken)).to.be.true;
261
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
262
- expect(tokenMatcher(tokens.next(), StringLiteral)).to.be.true;
263
- expect(tokenMatcher(tokens.next(), CommaToken)).to.be.true;
264
- expect(tokenMatcher(tokens.next(), FieldToken)).to.be.true;
265
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
266
- expect(tokenMatcher(tokens.next(), LSquare)).to.be.true;
267
- expect(tokenMatcher(tokens.next(), LCurly)).to.be.true;
268
- expect(tokenMatcher(tokens.next(), Identifier)).to.be.true;
269
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
270
- expect(tokenMatcher(tokens.next(), StringLiteral)).to.be.true;
271
- expect(tokenMatcher(tokens.next(), RCurly)).to.be.true;
272
- expect(tokenMatcher(tokens.next(), RSquare)).to.be.true;
273
- expect(tokenMatcher(tokens.next(), RCurly)).to.be.true;
274
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
275
-
276
- // {type: "gin", field: [{name: "xdo", op: "jsonb_path_op"}]}
277
- expect(tokenMatcher(tokens.next(), LCurly)).to.be.true;
278
- expect(tokenMatcher(tokens.next(), TypeToken)).to.be.true;
279
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
280
- expect(tokenMatcher(tokens.next(), StringLiteral)).to.be.true;
281
- expect(tokenMatcher(tokens.next(), CommaToken)).to.be.true;
282
- expect(tokenMatcher(tokens.next(), FieldToken)).to.be.true;
283
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
284
- expect(tokenMatcher(tokens.next(), LSquare)).to.be.true;
285
- expect(tokenMatcher(tokens.next(), LCurly)).to.be.true;
286
- expect(tokenMatcher(tokens.next(), Identifier)).to.be.true;
287
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
288
- expect(tokenMatcher(tokens.next(), StringLiteral)).to.be.true;
289
- expect(tokenMatcher(tokens.next(), CommaToken)).to.be.true;
290
- expect(tokenMatcher(tokens.next(), Identifier)).to.be.true;
291
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
292
- expect(tokenMatcher(tokens.next(), StringLiteral)).to.be.true;
293
- expect(tokenMatcher(tokens.next(), RCurly)).to.be.true;
294
- expect(tokenMatcher(tokens.next(), RSquare)).to.be.true;
295
- expect(tokenMatcher(tokens.next(), RCurly)).to.be.true;
296
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
297
-
298
- // {type: "btree", field: [{name: "created_at", op: "desc"}]}
299
- expect(tokenMatcher(tokens.next(), LCurly)).to.be.true;
300
- expect(tokenMatcher(tokens.next(), TypeToken)).to.be.true;
301
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
302
- expect(tokenMatcher(tokens.next(), StringLiteral)).to.be.true;
303
- expect(tokenMatcher(tokens.next(), CommaToken)).to.be.true;
304
- expect(tokenMatcher(tokens.next(), FieldToken)).to.be.true;
305
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
306
- expect(tokenMatcher(tokens.next(), LSquare)).to.be.true;
307
- expect(tokenMatcher(tokens.next(), LCurly)).to.be.true;
308
- expect(tokenMatcher(tokens.next(), Identifier)).to.be.true;
309
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
310
- expect(tokenMatcher(tokens.next(), StringLiteral)).to.be.true;
311
- expect(tokenMatcher(tokens.next(), CommaToken)).to.be.true;
312
- expect(tokenMatcher(tokens.next(), Identifier)).to.be.true;
313
- expect(tokenMatcher(tokens.next(), ColonToken)).to.be.true;
314
- expect(tokenMatcher(tokens.next(), StringLiteral)).to.be.true;
315
- expect(tokenMatcher(tokens.next(), RCurly)).to.be.true;
316
- expect(tokenMatcher(tokens.next(), RSquare)).to.be.true;
317
- expect(tokenMatcher(tokens.next(), RCurly)).to.be.true;
318
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
319
-
320
- expect(tokenMatcher(tokens.next(), RSquare)).to.be.true;
321
- expect(tokenMatcher(tokens.next(), NewlineToken)).to.be.true;
322
- expect(tokenMatcher(tokens.next(), RCurly)).to.be.true;
323
- });
324
- });
@@ -1,61 +0,0 @@
1
- import { expect } from "chai";
2
- import { beforeEach,describe, it } from "mocha";
3
- import {
4
- __resetTokens,
5
- createTokenByName,
6
- createUniqToken,
7
- sortUniqTokens,
8
- } from "./utils.js";
9
-
10
- describe("createUniqToken", () => {
11
- beforeEach(() => {
12
- __resetTokens();
13
- });
14
-
15
- it("creates a token with a unique pattern", () => {
16
- const token1 = createUniqToken({ pattern: /foo/ });
17
- const token2 = createUniqToken({ pattern: /foo/ });
18
- expect(token1).to.equal(token2);
19
- });
20
- });
21
-
22
- describe("createTokenByName", () => {
23
- beforeEach(() => {
24
- __resetTokens();
25
- });
26
-
27
- it("creates a token with a name derived from the given name", () => {
28
- const token = createTokenByName("foo");
29
- expect(token.name).to.equal("foo token");
30
- expect(token.LABEL).to.equal("foo");
31
- expect(new RegExp(token.pattern).test("foo")).to.be.true;
32
- });
33
-
34
- it("creates a token with a name derived from the given name", () => {
35
- const token = createTokenByName("$remote_ip", { pattern: /\$remote_ip/ });
36
- expect(token.name).to.equal("$remote_ip token");
37
- expect(token.LABEL).to.equal("$remote_ip");
38
- });
39
-
40
- it("does not create duplicate tokens", () => {
41
- const token1 = createTokenByName("foo");
42
- const token2 = createTokenByName("foo");
43
- expect(token1).to.equal(token2);
44
- });
45
-
46
- it("differentiate between lowercase and uppercase", () => {
47
- const token_get = createTokenByName("get");
48
- const token_GET = createTokenByName("GET");
49
- expect(token_get.name).to.not.equal(token_GET.name);
50
- });
51
- });
52
-
53
- describe("sortUniqTokens", () => {
54
- it("sorts tokens by pattern length", () => {
55
- const token1 = createUniqToken({ pattern: /foo/ });
56
- const token2 = createUniqToken({ pattern: /fooBar/ });
57
- const token3 = createUniqToken({ pattern: /fooBarBaz/ });
58
- const tokens = sortUniqTokens([token1, token2, token3]);
59
- expect(tokens).to.deep.equal([token3, token2, token1]);
60
- });
61
- });
@@ -1,275 +0,0 @@
1
- import { expect } from "chai";
2
- import { describe, it, xit } from "mocha";
3
- import { getContentAssistSuggestions, suggestable } from "./contentAssist.js";
4
-
5
- describe("contentAssist", () => {
6
- describe("suggestable", () => {
7
- it("should return true for suggestions with LABEL", () => {
8
- const suggestion = {
9
- nextTokenType: {
10
- LABEL: "test_label",
11
- },
12
- };
13
- expect(suggestable(suggestion)).to.be.true;
14
- });
15
-
16
- it("should return false for suggestions without LABEL", () => {
17
- const suggestion = {
18
- nextTokenType: {
19
- name: "TestToken",
20
- },
21
- };
22
- expect(suggestable(suggestion)).to.be.false;
23
- });
24
-
25
- it("should return false for suggestions with empty LABEL", () => {
26
- const suggestion = {
27
- nextTokenType: {
28
- LABEL: "",
29
- },
30
- };
31
- expect(suggestable(suggestion)).to.be.false;
32
- });
33
- });
34
-
35
- describe("getContentAssistSuggestions", () => {
36
- xit("should return suggestions for each parser scheme with minimal valid input", () => {
37
- const schemes = ["function", "api", "db", "task"];
38
- const minimalInputs = {
39
- function: "function test { input {\n} \nstack {\ndb.",
40
- api: "query test { input { text name } stack { } \nresponse = null }",
41
- db: "table test { columns { id int } }",
42
- task: "task test { input { } stack { } }",
43
- };
44
- schemes.forEach((scheme) => {
45
- const text = minimalInputs[scheme];
46
- const suggestions = getContentAssistSuggestions(text, scheme);
47
- console.log(`Scheme: ${scheme}, Suggestions:`, suggestions);
48
- expect(suggestions).to.be.an("array");
49
- expect(suggestions.length).to.be.greaterThan(0);
50
- // Should contain at least one suggestion with a label
51
- expect(suggestions.some((s) => s.label)).to.be.true;
52
- });
53
- });
54
- describe("filter suggestions after pipe token", () => {
55
- it("should suggest filters when text ends with pipe token", () => {
56
- const text = "$variable|";
57
- const suggestions = getContentAssistSuggestions(text, "api");
58
-
59
- expect(suggestions).to.be.an("array");
60
- expect(suggestions.length).to.be.greaterThan(0);
61
-
62
- // Check that we get filter suggestions
63
- const filterLabels = suggestions.map((s) => s.label);
64
- expect(filterLabels).to.include("to_upper");
65
- expect(filterLabels).to.include("to_lower");
66
- expect(filterLabels).to.include("trim");
67
- expect(filterLabels).to.include("count");
68
- });
69
-
70
- it("should suggest filters with correct completion kind", () => {
71
- const text = "$var|";
72
- const suggestions = getContentAssistSuggestions(text, "api");
73
-
74
- expect(suggestions.length).to.be.greaterThan(0);
75
-
76
- // All suggestions should have a kind property (encoded as number)
77
- suggestions.forEach((suggestion) => {
78
- expect(suggestion).to.have.property("kind");
79
- expect(suggestion.kind).to.be.a("number");
80
- });
81
- });
82
-
83
- it("should suggest filters for complex expressions ending with pipe", () => {
84
- const text = "$input.name|";
85
- const suggestions = getContentAssistSuggestions(text, "api");
86
-
87
- expect(suggestions).to.be.an("array");
88
- expect(suggestions.length).to.be.greaterThan(0);
89
-
90
- const filterLabels = suggestions.map((s) => s.label);
91
- expect(filterLabels).to.include("to_upper");
92
- });
93
-
94
- it("should include math filters in suggestions", () => {
95
- const text = "$number|";
96
- const suggestions = getContentAssistSuggestions(text, "api");
97
-
98
- const filterLabels = suggestions.map((s) => s.label);
99
- expect(filterLabels).to.include("sin");
100
- expect(filterLabels).to.include("cos");
101
- expect(filterLabels).to.include("floor");
102
- expect(filterLabels).to.include("ceil");
103
- });
104
-
105
- it("should include array filters in suggestions", () => {
106
- const text = "$array|";
107
- const suggestions = getContentAssistSuggestions(text, "api");
108
-
109
- const filterLabels = suggestions.map((s) => s.label);
110
- expect(filterLabels).to.include("first");
111
- expect(filterLabels).to.include("last");
112
- expect(filterLabels).to.include("count");
113
- expect(filterLabels).to.include("reverse");
114
- });
115
-
116
- it("should work with different schemes when pipe is present", () => {
117
- const text = "$var|";
118
-
119
- const apiSuggestions = getContentAssistSuggestions(text, "api");
120
- const dbSuggestions = getContentAssistSuggestions(text, "db");
121
- const functionSuggestions = getContentAssistSuggestions(
122
- text,
123
- "function"
124
- );
125
- const taskSuggestions = getContentAssistSuggestions(text, "task");
126
-
127
- // All should return filter suggestions since pipe is detected first
128
- expect(apiSuggestions.length).to.be.greaterThan(0);
129
- expect(dbSuggestions.length).to.be.greaterThan(0);
130
- expect(functionSuggestions.length).to.be.greaterThan(0);
131
- expect(taskSuggestions.length).to.be.greaterThan(0);
132
-
133
- // They should all be the same (filter suggestions)
134
- expect(apiSuggestions.length).to.equal(dbSuggestions.length);
135
- expect(apiSuggestions.length).to.equal(functionSuggestions.length);
136
- expect(apiSuggestions.length).to.equal(taskSuggestions.length);
137
- });
138
-
139
- it("should include documentation for filters when available", () => {
140
- const text = "$var|";
141
- const suggestions = getContentAssistSuggestions(text, "api");
142
-
143
- expect(suggestions.length).to.be.greaterThan(0);
144
-
145
- // Find a filter that should have documentation
146
- const upperFilter = suggestions.find((s) => s.label === "upper");
147
- const trimFilter = suggestions.find((s) => s.label === "trim");
148
-
149
- // Check that some filters have documentation
150
- if (upperFilter) {
151
- expect(upperFilter).to.have.property("documentation");
152
- if (upperFilter.documentation) {
153
- expect(upperFilter.documentation).to.have.property(
154
- "kind",
155
- "markdown"
156
- );
157
- expect(upperFilter.documentation).to.have.property("value");
158
- expect(upperFilter.documentation.value).to.be.a("string");
159
- }
160
- }
161
-
162
- if (trimFilter) {
163
- expect(trimFilter).to.have.property("documentation");
164
- if (trimFilter.documentation) {
165
- expect(trimFilter.documentation).to.have.property(
166
- "kind",
167
- "markdown"
168
- );
169
- expect(trimFilter.documentation).to.have.property("value");
170
- expect(trimFilter.documentation.value).to.be.a("string");
171
- }
172
- }
173
- });
174
- });
175
-
176
- describe("normal completion without pipe token", () => {
177
- it("should return empty array for unknown scheme", () => {
178
- const text = "query test { ";
179
- const suggestions = getContentAssistSuggestions(text, "unknown");
180
-
181
- expect(suggestions).to.be.an("array");
182
- expect(suggestions.length).to.equal(0);
183
- });
184
-
185
- it("should handle empty text", () => {
186
- const text = "";
187
- const suggestions = getContentAssistSuggestions(text, "api");
188
-
189
- expect(suggestions).to.be.an("array");
190
- // Should not crash and return some form of suggestions or empty array
191
- });
192
-
193
- it("should not suggest filters when no pipe token present", () => {
194
- const text = "query test { stack { var $test { value = ";
195
- const suggestions = getContentAssistSuggestions(text, "api");
196
-
197
- // Should not return filter suggestions (those would have 270+ items)
198
- // Normal syntactic suggestions should be much fewer
199
- if (suggestions.length > 200) {
200
- // If we get a lot of suggestions, they shouldn't be filters
201
- const filterLabels = suggestions.map((s) => s.label);
202
- expect(filterLabels).to.not.include("upper");
203
- expect(filterLabels).to.not.include("lower");
204
- }
205
- });
206
-
207
- it("should handle malformed syntax gracefully", () => {
208
- const text = "query { { { invalid syntax";
209
-
210
- // Should not throw an error
211
- expect(() => {
212
- getContentAssistSuggestions(text, "api");
213
- }).to.not.throw();
214
- });
215
- });
216
-
217
- describe("edge cases", () => {
218
- it("should handle text with only pipe token", () => {
219
- const text = "|";
220
- const suggestions = getContentAssistSuggestions(text, "api");
221
-
222
- expect(suggestions).to.be.an("array");
223
- expect(suggestions.length).to.be.greaterThan(0);
224
-
225
- // Should still suggest filters
226
- const filterLabels = suggestions.map((s) => s.label);
227
- expect(filterLabels).to.include("to_upper");
228
- });
229
-
230
- it("should handle multiple pipe tokens", () => {
231
- const text = "$var|to_upper|";
232
- const suggestions = getContentAssistSuggestions(text, "api");
233
-
234
- expect(suggestions).to.be.an("array");
235
- expect(suggestions.length).to.be.greaterThan(0);
236
-
237
- // Should suggest filters for the last pipe
238
- const filterLabels = suggestions.map((s) => s.label);
239
- expect(filterLabels).to.include("to_lower");
240
- });
241
-
242
- it("should handle whitespace around pipe", () => {
243
- const text = "$var | ";
244
- const suggestions = getContentAssistSuggestions(text, "api");
245
-
246
- expect(suggestions).to.be.an("array");
247
- // Should handle this case gracefully, even if no suggestions
248
- });
249
- });
250
-
251
- describe("error handling", () => {
252
- it("should handle invalid input gracefully", () => {
253
- // Test with text that might cause issues but should not throw
254
- const edgeCases = [
255
- "", // empty string should work
256
- " ", // whitespace
257
- "invalid_syntax_here",
258
- ];
259
-
260
- edgeCases.forEach((text) => {
261
- expect(() => {
262
- const result = getContentAssistSuggestions(text, "api");
263
- expect(result).to.be.an("array");
264
- }).to.not.throw();
265
- });
266
- });
267
-
268
- it("should return empty array on lexer errors", () => {
269
- // Test with text that causes lexer issues - should catch and return []
270
- const result = getContentAssistSuggestions("query { invalid }", "api");
271
- expect(result).to.be.an("array");
272
- });
273
- });
274
- });
275
- });