@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
package/lexer/tokens.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Lexer } from "chevrotain";
1
+ import { createToken as chevrotainCreateToken, Lexer } from "chevrotain";
2
2
  import { Identifier } from "./identifier.js";
3
3
  import {
4
4
  createTokenByName,
@@ -150,10 +150,29 @@ export const NullToken = createTokenByName("null", {
150
150
  });
151
151
 
152
152
  // regular expression (regexp) pattern
153
- export const RegExpToken = createToken({
153
+ // A regexp literal only appears after a colon (e.g., filter:pattern:/[^abc]*/)
154
+ const regexpPattern = /\/(?:[^/\n\\ ]|\\.)(?:[^/\n\\]|\\.)*\//y;
155
+ function matchRegExp(text, startOffset, tokens) {
156
+ if (
157
+ tokens.length === 0 ||
158
+ tokens[tokens.length - 1].tokenType.name !== "ColonToken"
159
+ ) {
160
+ return null;
161
+ }
162
+ regexpPattern.lastIndex = startOffset;
163
+ const result = regexpPattern.exec(text);
164
+ if (result) {
165
+ return [result[0]];
166
+ }
167
+ return null;
168
+ }
169
+
170
+ export const RegExpToken = chevrotainCreateToken({
154
171
  name: "RegExpToken",
155
172
  label: "regexp",
156
- pattern: /\/(?:[^/\n\\ ]|\\.)(?:[^/\n\\]|\\.)*\//,
173
+ pattern: { exec: matchRegExp },
174
+ line_breaks: false,
175
+ start_chars_hint: ["/"],
157
176
  });
158
177
 
159
178
  export const WhiteSpace = createToken({
package/package.json CHANGED
@@ -1,9 +1,33 @@
1
1
  {
2
2
  "name": "@xano/xanoscript-language-server",
3
- "version": "11.12.1",
3
+ "version": "11.12.3",
4
4
  "description": "Language Server Protocol implementation for XanoScript",
5
5
  "type": "module",
6
6
  "main": "server.js",
7
+ "files": [
8
+ "server.js",
9
+ "connection.js",
10
+ "documents.js",
11
+ "utils.js",
12
+ "language-server-worker.js",
13
+ "logic-assistant-script.js",
14
+ "profile-parser.js",
15
+ "cache/",
16
+ "embedded/",
17
+ "lexer/**/*.js",
18
+ "onCheckError/",
19
+ "onCompletion/contentAssist.js",
20
+ "onCompletion/onCompletion.js",
21
+ "onDefinition/onDefinition.js",
22
+ "onDidChangeContent/",
23
+ "onHover/",
24
+ "onSemanticCheck/",
25
+ "parser/**/*.js",
26
+ "workspace/",
27
+ "!**/*.spec.js",
28
+ "!**/tests/",
29
+ "!**/valid_sources/"
30
+ ],
7
31
  "repository": {
8
32
  "type": "git",
9
33
  "url": "git+https://github.com/xano-labs/xs-language-server.git"
@@ -1,11 +0,0 @@
1
- ---
2
- name: no-git-interactions
3
- description: User does not want Claude to interact with git (no commits, no staging, no git commands)
4
- type: feedback
5
- ---
6
-
7
- Do not interact with git — no commits, no staging, no git commands. Focus purely on implementation and testing.
8
-
9
- **Why:** User manages their own git workflow.
10
-
11
- **How to apply:** Skip all git-related steps in plans. When dispatching subagents, explicitly tell them not to run any git commands. Remove commit steps from task instructions.
@@ -1,21 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(npm test:*)",
5
- "Bash(git checkout:*)",
6
- "Bash(ls:*)",
7
- "Bash(npm run lint:*)",
8
- "Bash(grep:*)",
9
- "Bash(find:*)",
10
- "Read(//tmp/**)",
11
- "Bash(git stash:*)",
12
- "Bash(do)",
13
- "Bash(if ! grep -q \"guidFieldAttribute\" \"$f\")",
14
- "Bash(then)",
15
- "Bash(echo:*)",
16
- "Bash(fi)",
17
- "Bash(done)",
18
- "Bash(npx eslint:*)"
19
- ]
20
- }
21
- }
@@ -1,190 +0,0 @@
1
- # XanoScript Language Server - Copilot Instructions
2
-
3
- ## Repository Overview
4
-
5
- This repository implements a Language Server Protocol (LSP) server for **XanoScript**, a domain-specific language used by Xano for defining API queries, functions, scheduled tasks, and data schemas. The language server provides VS Code with features like auto-completion, syntax highlighting, hover documentation, and real-time error checking.
6
-
7
- **Key Facts:**
8
-
9
- - **Size:** ~540 files, 35MB, 457 JavaScript files, 171 test files
10
- - **Language:** JavaScript ES modules (Node.js 20+)
11
- - **Framework:** Chevrotain parser generator + VS Code Language Server Protocol
12
- - **Testing:** Mocha + Chai (1041 tests, comprehensive coverage)
13
- - **Architecture:** Lexer → Parser → Language Server Features
14
-
15
- ## Build Instructions
16
-
17
- ### Dependencies and Setup
18
-
19
- ```bash
20
- npm install # Install dependencies (~2s, always run before any other commands)
21
- ```
22
-
23
- ### Core Commands
24
-
25
- ```bash
26
- npm run lint # ESLint validation (required for CI, ~1s)
27
- npm test # Run all tests (1041 tests, ~45s, required for CI)
28
- npm test -- -g "test name" # Run specific tests
29
- npm run tm # Generate TextMate language definition (optional tool)
30
- ```
31
-
32
- ### Validation Sequence
33
-
34
- Always run in this order for reliable builds:
35
-
36
- 1. `npm install` (always required first)
37
- 2. `npm run lint`
38
- 3. `npm test`
39
-
40
- **Important:** Tests take ~45 seconds to complete. Set adequate timeouts (60+ seconds) for test commands. Clean installs work reliably and are fast after initial package download.
41
-
42
- ### Build Validation
43
-
44
- - **No compilation step required** - pure JavaScript ES modules
45
- - **Node.js 20+ required** (as specified in CI)
46
- - **ES modules** - uses `import`/`export`, requires Node.js with proper module support
47
- - **No build artifacts** - all source files are directly executed
48
-
49
- ### Common Issues & Workarounds
50
-
51
- - **Test timeouts:** Use 60+ second timeouts for `npm test`
52
- - **ES module errors:** Ensure Node.js 20+ with ES module support
53
- - **Dependency conflicts:** Run `rm -rf node_modules && npm install` for clean state
54
- - **3 low-severity npm audit warnings** are known and acceptable
55
-
56
- ## Project Layout & Architecture
57
-
58
- ### Core Directories
59
-
60
- - **`lexer/`** - Token definitions for XanoScript language elements
61
-
62
- - `tokens.js` - Main token registry and export
63
- - `lexer.js` - Chevrotain lexer implementation
64
- - Domain-specific tokens: `api.js`, `db.js`, `cloud.js`, `function.js`, etc.
65
- - `utils.js` - Token creation utilities (`createToken`, `createTokenByName`)
66
-
67
- - **`parser/`** - Grammar rules and parsing logic
68
-
69
- - `base_parser.js` - Core XanoBaseParser extending Chevrotain
70
- - `query_parser.js`, `function_parser.js`, `task_parser.js` - Main parsers
71
- - `attributes/` - Field attributes (description, disabled, sensitive, etc.)
72
- - `clauses/` - Language blocks (stack, input, response, security)
73
- - `definitions/` - Type and column definitions
74
- - `functions/` - Built-in function implementations organized by domain
75
- - `generic/` - Reusable parsing components
76
-
77
- - **Language Server Features**
78
- - `server.js` - Main LSP server setup and capability registration
79
- - `onCompletion/` - Auto-completion logic and content assist
80
- - `onDidChangeContent/` - Live diagnostics and error reporting
81
- - `onHover/` - Documentation and hover information providers
82
- - `onSemanticCheck/` - Syntax highlighting token generation
83
-
84
- ### Configuration Files
85
-
86
- - **`package.json`** - Dependencies, scripts, ES module configuration
87
- - **`eslint.config.js`** - ESLint configuration (ES modules format)
88
- - **`.github/workflows/ci.yml`** - GitHub Actions CI pipeline
89
- - **`.gitignore`** - Standard Node.js exclusions
90
-
91
- ### XanoScript Language Structure
92
-
93
- XanoScript defines these primary constructs:
94
-
95
- - **`query`** - API endpoints with HTTP verbs, input validation, processing logic, responses
96
- - **`function`** - Reusable logic blocks with testing capabilities
97
- - **`task`** - Scheduled operations with cron-like triggers
98
- - **`api_group`** - Collections of related API endpoints
99
- - **`table`** - Database schema definitions with column types
100
-
101
- **Core Language Patterns:**
102
-
103
- ```xs
104
- query my_endpoint verb=GET {
105
- input { text name filters=trim }
106
- stack {
107
- var $result { value = $input.name|upper }
108
- db.add 123 { data = {name: $result} }
109
- }
110
- response = $result
111
- }
112
- ```
113
-
114
- ### Critical Development Patterns
115
-
116
- **Token Creation** (in `lexer/` files):
117
-
118
- ```javascript
119
- export const MyToken = createTokenByName("keyword", {
120
- longer_alt: Identifier,
121
- categories: [Identifier],
122
- });
123
- ```
124
-
125
- **Parser Rules** (in `parser/` files):
126
-
127
- ```javascript
128
- myRule = this.RULE("myRule", () => {
129
- this.CONSUME(MyToken);
130
- this.SUBRULE(this.otherRule);
131
- });
132
- ```
133
-
134
- **Testing Pattern:**
135
-
136
- ```javascript
137
- function parse(inputText) {
138
- const lexResult = lexDocument(inputText);
139
- const parser = new Parser();
140
- parser.input = lexResult.tokens;
141
- parser.myRule();
142
- return parser;
143
- }
144
- ```
145
-
146
- ### Dependencies & Runtime
147
-
148
- - **`chevrotain`** - Parser generator and runtime
149
- - **`vscode-languageserver`** - LSP implementation
150
- - **`lodash-es`** - Utility functions (ES module version)
151
- - **`mocha`/`chai`** - Testing framework
152
- - **Runtime:** Node.js 20+ (ES modules, required for CI compatibility)
153
-
154
- ### Testing Strategy
155
-
156
- - **171 test files** using `.spec.js` naming convention
157
- - **Test organization:** Mirror source structure (`lexer/` tests, `parser/` tests)
158
- - **Example test files:** `lexer/tests/query/valid_sources/`, `parser/tests/function/valid_sources/`
159
- - **Test data:** Real XanoScript files in `valid_sources/` directories
160
- - **CI Integration:** All tests must pass for merge approval
161
-
162
- ### CI/CD Pipeline
163
-
164
- **GitHub Actions** (`.github/workflows/ci.yml`):
165
-
166
- 1. Ubuntu latest, Node.js 20, npm cache enabled
167
- 2. `npm install`
168
- 3. `npm run lint`
169
- 4. `npm test`
170
-
171
- **Pre-commit validation:** Lint and test failures block commits. Always run locally before pushing.
172
-
173
- ### Key Files Reference
174
-
175
- - **Root:** `README.md`, `package.json`, `server.js` (main entry)
176
- - **Core Logic:** `lexer/tokens.js`, `parser/base_parser.js`
177
- - **Examples:** `lexer/tests/*/valid_sources/*.xs`, `parser/tests/*/valid_sources/*.xs`
178
- - **Documentation:** `onHover/functions.md` (function documentation)
179
-
180
- ### Agent Guidelines
181
-
182
- 1. **Always run `npm install` before any build/test commands**
183
- 2. **Use 60+ second timeouts for `npm test`** (1041 tests take time)
184
- 3. **Follow existing patterns** - check similar files in same directory for conventions
185
- 4. **Test incrementally** - use `npm test -- -g "specific test"` during development
186
- 5. **Validate ES module syntax** - use `import`/`export`, not `require()`
187
- 6. **Check CI compatibility** - ensure changes work with Node.js 20
188
- 7. **Trust these instructions** - comprehensive testing validates all commands work correctly
189
-
190
- This language server is production-ready with extensive testing. Focus on understanding the domain-specific language patterns and lexer/parser architecture when making changes.
@@ -1,31 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- pull_request:
8
-
9
- jobs:
10
- xanoscript-language:
11
- runs-on: ubuntu-latest
12
-
13
- steps:
14
- - uses: actions/checkout@v4
15
- - name: Use Node.js
16
- uses: actions/setup-node@v4
17
- with:
18
- node-version: 20
19
- cache: "npm"
20
-
21
- - name: Install language dependencies
22
- run: |
23
- npm install
24
-
25
- - name: Lint language server
26
- run: |
27
- npm run lint
28
-
29
- - name: Test language server
30
- run: |
31
- npm test
package/.husky/pre-commit DELETED
@@ -1 +0,0 @@
1
- npm run lint && npm test
package/CLAUDE.md DELETED
@@ -1,256 +0,0 @@
1
- # CLAUDE.md
2
-
3
- This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
-
5
- ## Commands
6
-
7
- ```bash
8
- # Install dependencies (always run first, takes ~2s)
9
- npm install
10
-
11
- # Run tests (1041 tests, ~45s - required for CI)
12
- npm test
13
-
14
- # Run specific test
15
- npm test -- -g "test name"
16
-
17
- # Lint code (required for CI, ~1s)
18
- npm run lint
19
-
20
- # Generate TextMate language definition (optional)
21
- npm run tm
22
- ```
23
-
24
- **Important:** Tests take ~45 seconds. Set adequate timeouts (60+ seconds) for test commands.
25
-
26
- ## Architecture Overview
27
-
28
- This is a Language Server Protocol (LSP) implementation for XanoScript, built on Chevrotain parser generator. The architecture follows: **Lexer → Parser → Language Server Features**.
29
-
30
- ### Core Components
31
-
32
- **Lexer (`lexer/`)**: Token definitions and lexical analysis
33
-
34
- - `tokens.js` - Main token registry
35
- - `lexer.js` - Chevrotain lexer implementation
36
- - Domain tokens: `api.js`, `db.js`, `cloud.js`, `function.js`, etc.
37
- - `utils.js` - Token creation utilities (`createToken`, `createTokenByName`)
38
-
39
- **Parser (`parser/`)**: Grammar rules and parsing logic
40
-
41
- - `base_parser.js` - Core XanoBaseParser extending Chevrotain
42
- - Main parsers: `query_parser.js`, `function_parser.js`, `task_parser.js`, `api_group_parser.js`, `table_parser.js`, `workflow_test_parser.js`, `table_trigger_parser.js`
43
- - `attributes/` - Field attributes (description, disabled, sensitive)
44
- - `clauses/` - Language blocks (stack, input, response, security, auth, cache, history, index, schema, test)
45
- - `definitions/` - Type and column definitions
46
- - `functions/` - Built-in functions organized by domain (api, array, cloud, controls, db, debug, expect, math, object, redis, time, util, variable)
47
- - `generic/` - Reusable parsing components
48
-
49
- **Language Server (`server.js` + feature directories)**:
50
-
51
- - `onCompletion/` - Auto-completion logic
52
- - `onDidChangeContent/` - Live diagnostics and error reporting
53
- - `onHover/` - Documentation and hover information
54
- - `onSemanticCheck/` - Syntax highlighting token generation
55
-
56
- ### XanoScript Object Types
57
-
58
- Primary constructs parsed by dedicated parsers:
59
-
60
- - **query** - API endpoints with HTTP verbs, input validation, processing logic, responses
61
- - **function** - Reusable logic blocks with testing capabilities
62
- - **task** - Scheduled operations with cron-like triggers
63
- - **api_group** - Collections of related API endpoints
64
- - **table** - Database schema definitions with column types
65
- - **workflow_test** - Test definitions for workflows
66
- - **table_trigger** - Database table trigger definitions
67
-
68
- ## Adding New Features
69
-
70
- ### New Top-Level Parser (e.g., `run.job`, `run.service`)
71
-
72
- Follow this step-by-step process:
73
-
74
- **1. Create lexer tokens (`lexer/my_feature.js`)**
75
-
76
- ```javascript
77
- import { Identifier } from "./identifier.js";
78
- import { createTokenByName } from "./utils.js";
79
-
80
- export const MyToken = createTokenByName("my_keyword", {
81
- longer_alt: Identifier,
82
- categories: [Identifier],
83
- });
84
-
85
- export const MyFeatureTokens = [MyToken];
86
-
87
- export function mapTokenToType(token) {
88
- switch (token) {
89
- case MyToken.name:
90
- return "keyword";
91
- default:
92
- return null;
93
- }
94
- }
95
- ```
96
-
97
- **2. Register tokens in `lexer/tokens.js`**
98
-
99
- - Import tokens and mapper at the top
100
- - Add `...MyFeatureTokens` to `allTokens` array
101
- - Add `mapMyFeatureTokenToType` to `tokenMappers` array
102
-
103
- **3. Create parser (`parser/my_feature_parser.js`)**
104
-
105
- ```javascript
106
- import { StringLiteral } from "../lexer/literal.js";
107
- import { MyToken } from "../lexer/my_feature.js";
108
- import { Identifier, NewlineToken } from "../lexer/tokens.js";
109
-
110
- export function myFeatureDeclaration($) {
111
- return () => {
112
- $.sectionStack.push("myFeatureDeclaration");
113
- $.SUBRULE($.optionalCommentBlockFn);
114
-
115
- const parent = $.CONSUME(MyToken);
116
- $.OR([
117
- { ALT: () => $.CONSUME(StringLiteral) },
118
- { ALT: () => $.CONSUME(Identifier) },
119
- ]);
120
-
121
- // Use schemaParseAttributeFn for body with declarative schema
122
- $.SUBRULE($.schemaParseAttributeFn, {
123
- ARGS: [
124
- parent,
125
- {
126
- required_attr: "[string]",
127
- "optional_attr?": "[boolean]",
128
- "nested?": {
129
- name: "[string]",
130
- "value?": { "[string]": "[constant]" },
131
- },
132
- "array_of_strings?": ["[string]"],
133
- },
134
- ],
135
- });
136
-
137
- $.MANY2(() => $.CONSUME2(NewlineToken));
138
- $.sectionStack.pop();
139
- };
140
- }
141
- ```
142
-
143
- **4. Register parser in `parser/register.js`**
144
-
145
- ```javascript
146
- import { myFeatureDeclaration } from "./my_feature_parser.js";
147
- // In register function:
148
- $.myFeatureDeclaration = $.RULE(
149
- "myFeatureDeclaration",
150
- myFeatureDeclaration($)
151
- );
152
- ```
153
-
154
- **5. Add scheme detection in `utils.js`**
155
-
156
- ```javascript
157
- const schemeByFirstWord = {
158
- // ... existing entries
159
- my_feature: "my_feature",
160
- };
161
- ```
162
-
163
- **6. Route scheme in `parser/parser.js`**
164
-
165
- ```javascript
166
- case "my_feature":
167
- parser.myFeatureDeclaration();
168
- return parser;
169
- ```
170
-
171
- **7. Write tests (`parser/my_feature_parser.spec.js`)**
172
-
173
- ```javascript
174
- import { expect } from "chai";
175
- import { describe, it } from "mocha";
176
- import { xanoscriptParser } from "./parser.js";
177
-
178
- describe("my_feature", () => {
179
- it("should parse a basic my_feature", () => {
180
- const parser = xanoscriptParser(`my_feature "name" {
181
- required_attr = "value"
182
- }`);
183
- expect(parser.errors).to.be.empty;
184
- });
185
- });
186
- ```
187
-
188
- ### Schema Definition Types (for `schemaParseAttributeFn`)
189
-
190
- | Schema | Description | Example |
191
- | ------------------------------ | ---------------------------------- | ------------------------- |
192
- | `"[string]"` | String literal | `"hello"` |
193
- | `"[number]"` | Number literal | `123` |
194
- | `"[boolean]"` | Boolean value | `true` / `false` |
195
- | `"[constant]"` | Value expression (no variables) | `"text"`, `123`, `{a: 1}` |
196
- | `"[expression]"` | Any expression including variables | `$var`, `$input.name` |
197
- | `["[string]"]` | Array of strings | `["a", "b"]` |
198
- | `{ "[string]": "[constant]" }` | Object with string keys | `{key: "value"}` |
199
- | `"attr?"` | Optional attribute | May be omitted |
200
- | `"!attr"` | Can be disabled | `!attr = value` |
201
-
202
- ### New Keyword/Function
203
-
204
- 1. Add token definition in appropriate `lexer/` file
205
- 2. Create function implementation in `parser/functions/[domain]/`
206
- 3. Register in parent clause or parser
207
- 4. Add comprehensive tests in corresponding `.spec.js` file
208
-
209
- ### Token Creation Pattern
210
-
211
- ```javascript
212
- export const MyToken = createTokenByName("keyword", {
213
- longer_alt: Identifier,
214
- categories: [Identifier],
215
- });
216
- ```
217
-
218
- ### Parser Rule Pattern
219
-
220
- ```javascript
221
- myRule = this.RULE("myRule", () => {
222
- this.CONSUME(MyToken);
223
- this.SUBRULE(this.otherRule);
224
- });
225
- ```
226
-
227
- ## Testing Guidelines
228
-
229
- - Tests use Mocha + Chai framework
230
- - 171 test files with `.spec.js` naming convention
231
- - Test structure mirrors source structure
232
- - Real XanoScript examples in `valid_sources/` directories
233
- - Tests are explicit and straightforward - avoid dynamic test generation
234
- - CI requires all tests to pass
235
-
236
- ### Test Pattern
237
-
238
- ```javascript
239
- function parse(inputText) {
240
- const lexResult = lexDocument(inputText);
241
- const parser = new Parser();
242
- parser.input = lexResult.tokens;
243
- parser.myRule();
244
- return parser;
245
- }
246
- ```
247
-
248
- ## Development Notes
249
-
250
- - **Node.js 20+ required** for ES module support
251
- - **No compilation step** - pure JavaScript ES modules
252
- - Use `import`/`export`, not `require()`
253
- - Follow existing code conventions when adding features
254
- - Check neighboring files for patterns and conventions
255
- - Never assume a library is available - check `package.json` first
256
- - 3 low-severity npm audit warnings are known and acceptable
package/eslint.config.js DELETED
@@ -1,24 +0,0 @@
1
- import pluginJs from "@eslint/js";
2
- import simpleImportSort from "eslint-plugin-simple-import-sort";
3
- import unusedImports from "eslint-plugin-unused-imports";
4
- import globals from "globals";
5
-
6
- /** @type {import('eslint').Linter.Config[]} */
7
- export default [
8
- {
9
- languageOptions: { globals: globals.browser },
10
- plugins: {
11
- "simple-import-sort": simpleImportSort,
12
- "unused-imports": unusedImports,
13
- },
14
- rules: {
15
- "simple-import-sort/imports": ["error",
16
- {
17
- "groups": [["^\\u0000", "^node:", "^@?\\w", "^", "^\\."]]
18
- }
19
- ],
20
- "unused-imports/no-unused-imports": "error",
21
- }
22
- },
23
- pluginJs.configs.recommended,
24
- ];
@@ -1,77 +0,0 @@
1
- import { expect } from "chai";
2
- import { describe, it } from "mocha";
3
- import { CommentToken, CommentTokens } from "./comment.js";
4
- import { lexDocument } from "./lexer.js";
5
-
6
- describe("Comment Lexer", () => {
7
- describe("CommentToken", () => {
8
- it("should match a simple comment", () => {
9
- const input = "// This is a comment";
10
- const result = lexDocument(input);
11
-
12
- expect(result.errors).to.be.empty;
13
- expect(result.tokens).to.have.length(1);
14
- expect(result.tokens[0].tokenType).to.equal(CommentToken);
15
- expect(result.tokens[0].image).to.equal("// This is a comment");
16
- });
17
-
18
- it("should match comment with special characters", () => {
19
- const input = "// TODO: Fix this bug @user123!";
20
- const result = lexDocument(input);
21
-
22
- expect(result.errors).to.be.empty;
23
- expect(result.tokens).to.have.length(1);
24
- expect(result.tokens[0].tokenType).to.equal(CommentToken);
25
- expect(result.tokens[0].image).to.equal(
26
- "// TODO: Fix this bug @user123!"
27
- );
28
- });
29
-
30
- it("should match empty comment", () => {
31
- const input = "//";
32
- const result = lexDocument(input);
33
-
34
- expect(result.errors).to.be.empty;
35
- expect(result.tokens).to.have.length(1);
36
- expect(result.tokens[0].tokenType).to.equal(CommentToken);
37
- expect(result.tokens[0].image).to.equal("//");
38
- });
39
-
40
- it("should NOT match // in the middle of a line", () => {
41
- const input = "some code // comment";
42
- const result = lexDocument(input);
43
-
44
- // Comments are only allowed on their own line (with optional leading whitespace)
45
- // So // in the middle of a line should be tokenized as division operators
46
- expect(result.errors).to.be.empty;
47
- const commentTokens = result.tokens.filter(
48
- (token) => token.tokenType === CommentToken
49
- );
50
- expect(commentTokens).to.have.length(0); // No comment token should be found
51
- });
52
-
53
- it("should handle multiple lines with comments", () => {
54
- const input = `// First comment
55
- // Second comment
56
- some code
57
- // Third comment`;
58
- const result = lexDocument(input);
59
-
60
- expect(result.errors).to.be.empty;
61
- const commentTokens = result.tokens.filter(
62
- (token) => token.tokenType === CommentToken
63
- );
64
- expect(commentTokens).to.have.length(3);
65
- expect(commentTokens[0].image).to.equal("// First comment");
66
- expect(commentTokens[1].image).to.equal("// Second comment");
67
- expect(commentTokens[2].image).to.equal("// Third comment");
68
- });
69
- });
70
-
71
- describe("CommentTokens export", () => {
72
- it("should export CommentTokens array", () => {
73
- expect(CommentTokens).to.be.an("array");
74
- expect(CommentTokens).to.include(CommentToken);
75
- });
76
- });
77
- });