@xano/xanoscript-language-server 11.0.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 (716) hide show
  1. package/.claude/settings.local.json +27 -0
  2. package/.github/copilot-instructions.md +190 -0
  3. package/.github/workflows/ci.yml +31 -0
  4. package/.husky/pre-commit +1 -0
  5. package/CLAUDE.md +121 -0
  6. package/LICENSE +21 -0
  7. package/README.md +55 -0
  8. package/connection.js +7 -0
  9. package/documents.js +5 -0
  10. package/embedded/README.md +102 -0
  11. package/embedded/embeddedContent.js +74 -0
  12. package/embedded/embeddedDocuments.js +57 -0
  13. package/embedded/jsLanguageService.js +74 -0
  14. package/eslint.config.js +24 -0
  15. package/language-server-worker.js +52 -0
  16. package/lexer/action.js +31 -0
  17. package/lexer/addon.js +31 -0
  18. package/lexer/agent.js +37 -0
  19. package/lexer/agent_trigger.js +42 -0
  20. package/lexer/ai.js +82 -0
  21. package/lexer/api.js +81 -0
  22. package/lexer/api_group.js +58 -0
  23. package/lexer/arrays.js +161 -0
  24. package/lexer/branch.js +31 -0
  25. package/lexer/cast.js +105 -0
  26. package/lexer/cloud.js +159 -0
  27. package/lexer/columns.js +234 -0
  28. package/lexer/comment.js +61 -0
  29. package/lexer/comment.spec.js +77 -0
  30. package/lexer/control.js +634 -0
  31. package/lexer/db.js +190 -0
  32. package/lexer/debug.js +37 -0
  33. package/lexer/expect.js +157 -0
  34. package/lexer/function.js +36 -0
  35. package/lexer/identifier.js +6 -0
  36. package/lexer/lexer.js +26 -0
  37. package/lexer/literal.js +77 -0
  38. package/lexer/math.js +97 -0
  39. package/lexer/mcp_server.js +51 -0
  40. package/lexer/mcp_server_trigger.js +42 -0
  41. package/lexer/middleware.js +42 -0
  42. package/lexer/multiline.js +24 -0
  43. package/lexer/multiline.spec.js +179 -0
  44. package/lexer/object.js +44 -0
  45. package/lexer/query.js +99 -0
  46. package/lexer/realtime_trigger.js +50 -0
  47. package/lexer/redis.js +145 -0
  48. package/lexer/security.js +161 -0
  49. package/lexer/storage.js +99 -0
  50. package/lexer/stream.js +49 -0
  51. package/lexer/table.js +38 -0
  52. package/lexer/table_trigger.js +50 -0
  53. package/lexer/task.js +83 -0
  54. package/lexer/tests/query/query_lexer.spec.js +36 -0
  55. package/lexer/tests/query/valid_sources/basic_query.xs +44 -0
  56. package/lexer/tests/query/valid_sources/db_query.xs +77 -0
  57. package/lexer/tests/query/valid_sources/empty_query.xs +5 -0
  58. package/lexer/tests/query/valid_sources/header_query.xs +15 -0
  59. package/lexer/tests/table/basic_table.xs +17 -0
  60. package/lexer/tests/table/empty_table.xs +3 -0
  61. package/lexer/tests/table/table_lexer.spec.js +324 -0
  62. package/lexer/text.js +114 -0
  63. package/lexer/tokens.js +526 -0
  64. package/lexer/tool.js +39 -0
  65. package/lexer/util.js +113 -0
  66. package/lexer/utils.js +56 -0
  67. package/lexer/utils.spec.js +61 -0
  68. package/lexer/var.js +30 -0
  69. package/lexer/variables.js +217 -0
  70. package/lexer/workflow_test.js +42 -0
  71. package/lexer/workspace.js +23 -0
  72. package/lexer/workspace_trigger.js +42 -0
  73. package/lexer/zip.js +63 -0
  74. package/logic-assistant-script.js +8 -0
  75. package/onCheckError/onCheckError.js +43 -0
  76. package/onCompletion/contentAssist.js +183 -0
  77. package/onCompletion/contentAssist.spec.js +275 -0
  78. package/onCompletion/onCompletion.js +38 -0
  79. package/onDidChangeContent/onDidChangeContent.js +128 -0
  80. package/onHover/FilterMessageProvider.js +102 -0
  81. package/onHover/FilterMessageProvider.spec.js +85 -0
  82. package/onHover/FunctionMessageProvider.js +122 -0
  83. package/onHover/FunctionMessageProvider.spec.js +128 -0
  84. package/onHover/HoverMessageProvider.js +31 -0
  85. package/onHover/InputFilterMessageProvider.js +140 -0
  86. package/onHover/InputFilterMessageProvider.spec.js +329 -0
  87. package/onHover/InputVariableMessageProvider.js +55 -0
  88. package/onHover/QueryFilterMessageProvider.spec.js +164 -0
  89. package/onHover/filters.md +2852 -0
  90. package/onHover/functions.md +2617 -0
  91. package/onHover/inputFilters.md +271 -0
  92. package/onHover/onHover.js +40 -0
  93. package/onHover/onHoverDocument.js +64 -0
  94. package/onHover/onHoverDocument.spec.js +486 -0
  95. package/onHover/queryFilterMessageProvider.js +122 -0
  96. package/onHover/queryFilters.md +489 -0
  97. package/onSemanticCheck/highlight.js +45 -0
  98. package/onSemanticCheck/onSemanticCheck.js +25 -0
  99. package/onSemanticCheck/tokens.js +40 -0
  100. package/package.json +48 -0
  101. package/parser/addon_parser.js +90 -0
  102. package/parser/addon_parser.spec.js +88 -0
  103. package/parser/agent_parser.js +281 -0
  104. package/parser/agent_parser.spec.js +599 -0
  105. package/parser/agent_trigger_parser.js +138 -0
  106. package/parser/agent_trigger_parser.spec.js +525 -0
  107. package/parser/api_group_parser.js +143 -0
  108. package/parser/api_group_parser.spec.js +127 -0
  109. package/parser/attributes/columnDefaultValueAttribute.js +33 -0
  110. package/parser/attributes/columnDefaultValueAttribute.spec.js +49 -0
  111. package/parser/attributes/descriptionFieldAttribute.js +24 -0
  112. package/parser/attributes/descriptionFieldAttribute.spec.js +39 -0
  113. package/parser/attributes/disabledFieldAttribute.js +19 -0
  114. package/parser/attributes/disabledFieldAttribute.spec.js +34 -0
  115. package/parser/attributes/docsFieldAttribute.js +24 -0
  116. package/parser/attributes/docsFieldAttribute.spec.js +39 -0
  117. package/parser/attributes/inputFilterFn.js +71 -0
  118. package/parser/attributes/inputFilterFn.spec.js +39 -0
  119. package/parser/attributes/register.js +41 -0
  120. package/parser/attributes/sensitiveFieldAttribute.js +17 -0
  121. package/parser/attributes/sensitiveFieldAttribute.spec.js +39 -0
  122. package/parser/attributes/valueFieldAttribute.js +17 -0
  123. package/parser/attributes/valueFieldAttribute.spec.js +54 -0
  124. package/parser/attributes/valuesFieldAttribute.js +18 -0
  125. package/parser/attributes/valuesFieldAttribute.spec.js +44 -0
  126. package/parser/base_parser.js +249 -0
  127. package/parser/branch_parser.js +49 -0
  128. package/parser/branch_parser.spec.js +34 -0
  129. package/parser/clauses/agentClause.js +23 -0
  130. package/parser/clauses/agentClause.spec.js +34 -0
  131. package/parser/clauses/authClause.js +17 -0
  132. package/parser/clauses/authClause.spec.js +39 -0
  133. package/parser/clauses/cacheClause.js +32 -0
  134. package/parser/clauses/cacheClause.spec.js +103 -0
  135. package/parser/clauses/canonicalClause.js +23 -0
  136. package/parser/clauses/canonicalClause.spec.js +34 -0
  137. package/parser/clauses/channelClause.js +23 -0
  138. package/parser/clauses/channelClause.spec.js +34 -0
  139. package/parser/clauses/dbTableClause.js +23 -0
  140. package/parser/clauses/dbTableClause.spec.js +34 -0
  141. package/parser/clauses/flexibleStringClause.js +43 -0
  142. package/parser/clauses/historyClause.js +19 -0
  143. package/parser/clauses/historyClause.spec.js +53 -0
  144. package/parser/clauses/indexClause.js +36 -0
  145. package/parser/clauses/indexClause.spec.js +47 -0
  146. package/parser/clauses/inputClause.js +35 -0
  147. package/parser/clauses/inputClause.spec.js +79 -0
  148. package/parser/clauses/mcpServerClause.js +23 -0
  149. package/parser/clauses/mcpServerClause.spec.js +34 -0
  150. package/parser/clauses/middlewareClause.js +39 -0
  151. package/parser/clauses/middlewareClause.spec.js +161 -0
  152. package/parser/clauses/nakedStackFn.js +69 -0
  153. package/parser/clauses/nakedStackFn.spec.js +63 -0
  154. package/parser/clauses/outputClause.js +33 -0
  155. package/parser/clauses/register.js +50 -0
  156. package/parser/clauses/responseClause.js +17 -0
  157. package/parser/clauses/responseClause.spec.js +42 -0
  158. package/parser/clauses/scheduleClause.js +37 -0
  159. package/parser/clauses/scheduleClause.spec.js +71 -0
  160. package/parser/clauses/schemaClause.js +66 -0
  161. package/parser/clauses/schemaClause.spec.js +66 -0
  162. package/parser/clauses/stackClause.js +16 -0
  163. package/parser/clauses/testClause.js +73 -0
  164. package/parser/clauses/testClause.spec.js +78 -0
  165. package/parser/clauses/viewClause.js +49 -0
  166. package/parser/clauses/viewClause.spec.js +154 -0
  167. package/parser/definitions/arraySlice.js +70 -0
  168. package/parser/definitions/arraySlice.spec.js +49 -0
  169. package/parser/definitions/columnDefinition.js +139 -0
  170. package/parser/definitions/columnDefinition.spec.js +199 -0
  171. package/parser/definitions/dbLinkColumnDefinition.js +24 -0
  172. package/parser/definitions/dbLinkColumnDefinition.spec.js +45 -0
  173. package/parser/definitions/enumColumnDefinition.js +55 -0
  174. package/parser/definitions/enumColumnDefinition.spec.js +108 -0
  175. package/parser/definitions/filterDefinition.js +23 -0
  176. package/parser/definitions/filterDefinition.spec.js +43 -0
  177. package/parser/definitions/objectColumnDefinition.js +52 -0
  178. package/parser/definitions/objectColumnDefinition.spec.js +118 -0
  179. package/parser/definitions/register.js +28 -0
  180. package/parser/function_parser.js +123 -0
  181. package/parser/function_parser.spec.js +83 -0
  182. package/parser/functions/actionCallFn.js +41 -0
  183. package/parser/functions/actionCallFn.spec.js +51 -0
  184. package/parser/functions/addonCallFn.js +39 -0
  185. package/parser/functions/addonCallFn.spec.js +41 -0
  186. package/parser/functions/ai/aiAgentRunFn.js +40 -0
  187. package/parser/functions/ai/aiAgentRunFn.spec.js +94 -0
  188. package/parser/functions/ai/aiExternalMcpServerDetailsFn.js +28 -0
  189. package/parser/functions/ai/aiExternalMcpServerDetailsFn.spec.js +85 -0
  190. package/parser/functions/ai/aiExternalMcpToolListFn.js +28 -0
  191. package/parser/functions/ai/aiExternalMcpToolListFn.spec.js +85 -0
  192. package/parser/functions/ai/aiExternalMcpToolRunFn.js +30 -0
  193. package/parser/functions/ai/aiExternalMcpToolRunFn.spec.js +101 -0
  194. package/parser/functions/ai/register.js +24 -0
  195. package/parser/functions/aiFn.js +61 -0
  196. package/parser/functions/aiFn.spec.js +51 -0
  197. package/parser/functions/api/apiCallFn.js +49 -0
  198. package/parser/functions/api/apiCallFn.spec.js +60 -0
  199. package/parser/functions/api/apiLambdaFn.js +19 -0
  200. package/parser/functions/api/apiLambdaFn.spec.js +63 -0
  201. package/parser/functions/api/apiRealtimeEventFn.js +25 -0
  202. package/parser/functions/api/apiRealtimeEventFn.spec.js +82 -0
  203. package/parser/functions/api/apiRequestFn.js +47 -0
  204. package/parser/functions/api/apiRequestFn.spec.js +113 -0
  205. package/parser/functions/api/apiStreamFn.js +22 -0
  206. package/parser/functions/api/apiStreamFn.spec.js +44 -0
  207. package/parser/functions/api/register.js +19 -0
  208. package/parser/functions/api/webflowRequestFn.js +47 -0
  209. package/parser/functions/api/webflowRequestFn.spec.js +114 -0
  210. package/parser/functions/apiFn.js +24 -0
  211. package/parser/functions/array/arrayDifferenceFn.js +37 -0
  212. package/parser/functions/array/arrayDifferenceFn.spec.js +34 -0
  213. package/parser/functions/array/arrayEveryFn.js +13 -0
  214. package/parser/functions/array/arrayFilterCountFn.js +14 -0
  215. package/parser/functions/array/arrayFilterFn.js +14 -0
  216. package/parser/functions/array/arrayFindFn.js +14 -0
  217. package/parser/functions/array/arrayFindFn.spec.js +44 -0
  218. package/parser/functions/array/arrayFindIndexFn.js +14 -0
  219. package/parser/functions/array/arrayGroupByFn.js +36 -0
  220. package/parser/functions/array/arrayGroupByFn.spec.js +41 -0
  221. package/parser/functions/array/arrayHasFn.js +14 -0
  222. package/parser/functions/array/arrayIntersectionFn.js +37 -0
  223. package/parser/functions/array/arrayIntersectionFn.spec.js +22 -0
  224. package/parser/functions/array/arrayMapFn.js +36 -0
  225. package/parser/functions/array/arrayMapFn.spec.js +37 -0
  226. package/parser/functions/array/arrayMergeFn.js +17 -0
  227. package/parser/functions/array/arrayNoValueAs.js +31 -0
  228. package/parser/functions/array/arrayNoValueAs.spec.js +56 -0
  229. package/parser/functions/array/arrayPartitionFn.js +19 -0
  230. package/parser/functions/array/arrayPartitionFn.spec.js +29 -0
  231. package/parser/functions/array/arrayPopFn.js +17 -0
  232. package/parser/functions/array/arrayPushFn.js +14 -0
  233. package/parser/functions/array/arrayShiftFn.js +15 -0
  234. package/parser/functions/array/arrayUnionFn.js +37 -0
  235. package/parser/functions/array/arrayUnionFn.spec.js +22 -0
  236. package/parser/functions/array/arrayUnshiftFn.js +14 -0
  237. package/parser/functions/array/arrayValueIfAs.js +51 -0
  238. package/parser/functions/array/arrayValueIfAs.spec.js +54 -0
  239. package/parser/functions/array/arrayValueOnly.js +40 -0
  240. package/parser/functions/array/arrayValueOnly.spec.js +61 -0
  241. package/parser/functions/array/register.js +49 -0
  242. package/parser/functions/array/valueAttrOnly.js +47 -0
  243. package/parser/functions/array/valueAttrOnly.spec.js +61 -0
  244. package/parser/functions/arrayFn.js +33 -0
  245. package/parser/functions/cloud/cloudAlgoliaFn.js +18 -0
  246. package/parser/functions/cloud/cloudAlgoliaRequestFn.js +26 -0
  247. package/parser/functions/cloud/cloudAlgoliaRequestFn.spec.js +30 -0
  248. package/parser/functions/cloud/cloudAwsFn.js +19 -0
  249. package/parser/functions/cloud/cloudAwsOpenSearchFn.js +19 -0
  250. package/parser/functions/cloud/cloudAwsS3Fn.js +22 -0
  251. package/parser/functions/cloud/cloudAwsS3Fn.spec.js +21 -0
  252. package/parser/functions/cloud/cloudAzureFn.js +18 -0
  253. package/parser/functions/cloud/cloudDeleteFileFn.js +23 -0
  254. package/parser/functions/cloud/cloudDeleteFileFn.spec.js +25 -0
  255. package/parser/functions/cloud/cloudElasticSearchFn.js +19 -0
  256. package/parser/functions/cloud/cloudGetFileInfoFn.js +24 -0
  257. package/parser/functions/cloud/cloudGetFileInfoFn.spec.js +25 -0
  258. package/parser/functions/cloud/cloudGoogleFn.js +18 -0
  259. package/parser/functions/cloud/cloudListDirectoryFn.js +24 -0
  260. package/parser/functions/cloud/cloudListDirectoryFn.spec.js +26 -0
  261. package/parser/functions/cloud/cloudReadFileFn.js +24 -0
  262. package/parser/functions/cloud/cloudReadFileFn.spec.js +25 -0
  263. package/parser/functions/cloud/cloudSearchDocumentFn.js +24 -0
  264. package/parser/functions/cloud/cloudSearchDocumentFn.spec.js +28 -0
  265. package/parser/functions/cloud/cloudSearchQueryFn.js +24 -0
  266. package/parser/functions/cloud/cloudSearchQueryFn.spec.js +32 -0
  267. package/parser/functions/cloud/cloudSearchRequestFn.js +24 -0
  268. package/parser/functions/cloud/cloudSearchRequestFn.spec.js +32 -0
  269. package/parser/functions/cloud/cloudSignUrlFn.js +24 -0
  270. package/parser/functions/cloud/cloudSignUrlFn.spec.js +26 -0
  271. package/parser/functions/cloud/cloudStorageFn.js +23 -0
  272. package/parser/functions/cloud/cloudStorageFn.spec.js +21 -0
  273. package/parser/functions/cloud/cloudUploadFileFn.js +24 -0
  274. package/parser/functions/cloud/cloudUploadFileFn.spec.js +29 -0
  275. package/parser/functions/cloud/register.js +61 -0
  276. package/parser/functions/cloudFn.js +21 -0
  277. package/parser/functions/controlFn.js +34 -0
  278. package/parser/functions/controls/awaitFn.js +21 -0
  279. package/parser/functions/controls/awaitFn.spec.js +48 -0
  280. package/parser/functions/controls/conditionalElifFn.js +19 -0
  281. package/parser/functions/controls/conditionalElseFn.js +13 -0
  282. package/parser/functions/controls/conditionalFn.js +62 -0
  283. package/parser/functions/controls/conditionalFn.spec.js +167 -0
  284. package/parser/functions/controls/conditionalIfFn.js +19 -0
  285. package/parser/functions/controls/forEachFn.js +70 -0
  286. package/parser/functions/controls/forEachFn.spec.js +101 -0
  287. package/parser/functions/controls/forFn.js +55 -0
  288. package/parser/functions/controls/forFn.spec.js +85 -0
  289. package/parser/functions/controls/functionCallFn.js +38 -0
  290. package/parser/functions/controls/functionRunFn.js +40 -0
  291. package/parser/functions/controls/functionRunFn.spec.js +77 -0
  292. package/parser/functions/controls/groupFn.js +42 -0
  293. package/parser/functions/controls/groupFn.spec.js +63 -0
  294. package/parser/functions/controls/preconditionFn.js +40 -0
  295. package/parser/functions/controls/preconditionFn.spec.js +97 -0
  296. package/parser/functions/controls/register.js +45 -0
  297. package/parser/functions/controls/returnFn.js +21 -0
  298. package/parser/functions/controls/returnFn.spec.js +44 -0
  299. package/parser/functions/controls/switchCaseFn.js +22 -0
  300. package/parser/functions/controls/switchDefaultFn.js +13 -0
  301. package/parser/functions/controls/switchFn.js +50 -0
  302. package/parser/functions/controls/switchFn.spec.js +104 -0
  303. package/parser/functions/controls/taskCallFn.js +31 -0
  304. package/parser/functions/controls/throwFn.js +21 -0
  305. package/parser/functions/controls/throwFn.spec.js +56 -0
  306. package/parser/functions/controls/tryCatchFn.js +67 -0
  307. package/parser/functions/controls/tryCatchFn.spec.js +180 -0
  308. package/parser/functions/controls/whileFn.js +52 -0
  309. package/parser/functions/controls/whileFn.spec.js +94 -0
  310. package/parser/functions/db/dbAddFn.js +38 -0
  311. package/parser/functions/db/dbAddFn.spec.js +72 -0
  312. package/parser/functions/db/dbAddOrEditFn.js +39 -0
  313. package/parser/functions/db/dbAddOrEditFn.spec.js +97 -0
  314. package/parser/functions/db/dbAddonAttr.js +17 -0
  315. package/parser/functions/db/dbBulkAddFn.js +54 -0
  316. package/parser/functions/db/dbBulkAddFn.spec.js +94 -0
  317. package/parser/functions/db/dbBulkDeleteFn.js +35 -0
  318. package/parser/functions/db/dbBulkDeleteFn.spec.js +28 -0
  319. package/parser/functions/db/dbBulkFn.js +20 -0
  320. package/parser/functions/db/dbBulkPatchFn.js +35 -0
  321. package/parser/functions/db/dbBulkPatchFn.spec.js +42 -0
  322. package/parser/functions/db/dbBulkUpdateFn.js +35 -0
  323. package/parser/functions/db/dbBulkUpdateFn.spec.js +42 -0
  324. package/parser/functions/db/dbDelFn.js +34 -0
  325. package/parser/functions/db/dbDelFn.spec.js +62 -0
  326. package/parser/functions/db/dbDirectQueryFn.js +37 -0
  327. package/parser/functions/db/dbDirectQueryFn.spec.js +104 -0
  328. package/parser/functions/db/dbEditFn.js +40 -0
  329. package/parser/functions/db/dbEditFn.spec.js +122 -0
  330. package/parser/functions/db/dbExternalDirectQueryFn.js +29 -0
  331. package/parser/functions/db/dbExternalDirectQueryFn.spec.js +103 -0
  332. package/parser/functions/db/dbExternalFn.js +29 -0
  333. package/parser/functions/db/dbGetFn.js +40 -0
  334. package/parser/functions/db/dbGetFn.spec.js +117 -0
  335. package/parser/functions/db/dbHasFn.js +34 -0
  336. package/parser/functions/db/dbHasFn.spec.js +62 -0
  337. package/parser/functions/db/dbPatchFn.js +39 -0
  338. package/parser/functions/db/dbPatchFn.spec.js +88 -0
  339. package/parser/functions/db/dbQueryFn.js +73 -0
  340. package/parser/functions/db/dbQueryFn.spec.js +333 -0
  341. package/parser/functions/db/dbSchemaFn.js +25 -0
  342. package/parser/functions/db/dbSchemaFn.spec.js +42 -0
  343. package/parser/functions/db/dbSetDatasourceFn.js +18 -0
  344. package/parser/functions/db/dbSetDatasourceFn.spec.js +44 -0
  345. package/parser/functions/db/dbTransactionFn.js +43 -0
  346. package/parser/functions/db/dbTransactionFn.spec.js +63 -0
  347. package/parser/functions/db/dbTruncateFn.js +33 -0
  348. package/parser/functions/db/dbTruncateFn.spec.js +42 -0
  349. package/parser/functions/db/register.js +52 -0
  350. package/parser/functions/db/schema.js +8 -0
  351. package/parser/functions/dbFn.js +31 -0
  352. package/parser/functions/debug/debugLogFn.js +21 -0
  353. package/parser/functions/debug/debugLogFn.spec.js +44 -0
  354. package/parser/functions/debug/debugStopFn.js +21 -0
  355. package/parser/functions/debug/debugStopFn.spec.js +44 -0
  356. package/parser/functions/debug/register.js +11 -0
  357. package/parser/functions/debugFn.js +18 -0
  358. package/parser/functions/expect/register.js +44 -0
  359. package/parser/functions/expect/unitExpectToBeWithinFn.js +28 -0
  360. package/parser/functions/expect/unitExpectToBeWithinFn.spec.js +61 -0
  361. package/parser/functions/expect/unitExpectToThrowFn.js +15 -0
  362. package/parser/functions/expect/unitExpectToThrowFn.spec.js +40 -0
  363. package/parser/functions/expect/unitExpectWithArgumentsFn.js +49 -0
  364. package/parser/functions/expect/unitExpectWithArgumentsFn.spec.js +341 -0
  365. package/parser/functions/expect/unitExpectWithoutArgumentsFn.js +42 -0
  366. package/parser/functions/expect/unitExpectWithoutArgumentsFn.spec.js +69 -0
  367. package/parser/functions/expect/workflowExpectToBeWithinFn.js +22 -0
  368. package/parser/functions/expect/workflowExpectToBeWithinFn.spec.js +70 -0
  369. package/parser/functions/expect/workflowExpectToThrowFn.js +21 -0
  370. package/parser/functions/expect/workflowExpectToThrowFn.spec.js +56 -0
  371. package/parser/functions/expect/workflowExpectWithArgumentsFn.js +40 -0
  372. package/parser/functions/expect/workflowExpectWithArgumentsFn.spec.js +301 -0
  373. package/parser/functions/expect/workflowExpectWithoutArgumentsFn.js +39 -0
  374. package/parser/functions/expect/workflowExpectWithoutArgumentsFn.spec.js +87 -0
  375. package/parser/functions/math/allMathFn.js +64 -0
  376. package/parser/functions/math/allMathFn.spec.js +100 -0
  377. package/parser/functions/math/register.js +9 -0
  378. package/parser/functions/mathFn.js +15 -0
  379. package/parser/functions/middlewareCallFn.js +43 -0
  380. package/parser/functions/middlewareCallFn.spec.js +44 -0
  381. package/parser/functions/object/objectEntriesFn.js +22 -0
  382. package/parser/functions/object/objectEntriesFn.spec.js +44 -0
  383. package/parser/functions/object/objectKeysFn.js +22 -0
  384. package/parser/functions/object/objectKeysFn.spec.js +44 -0
  385. package/parser/functions/object/objectValuesFn.js +22 -0
  386. package/parser/functions/object/objectValuesFn.spec.js +44 -0
  387. package/parser/functions/object/register.js +13 -0
  388. package/parser/functions/objectFn.js +22 -0
  389. package/parser/functions/redis/redisCountFn.js +26 -0
  390. package/parser/functions/redis/redisCountFn.spec.js +58 -0
  391. package/parser/functions/redis/redisDecrFn.js +28 -0
  392. package/parser/functions/redis/redisDecrFn.spec.js +47 -0
  393. package/parser/functions/redis/redisDelFn.js +25 -0
  394. package/parser/functions/redis/redisDelFn.spec.js +58 -0
  395. package/parser/functions/redis/redisGetFn.js +26 -0
  396. package/parser/functions/redis/redisGetFn.spec.js +67 -0
  397. package/parser/functions/redis/redisHasFn.js +26 -0
  398. package/parser/functions/redis/redisHasFn.spec.js +58 -0
  399. package/parser/functions/redis/redisIncrFn.js +28 -0
  400. package/parser/functions/redis/redisIncrFn.spec.js +74 -0
  401. package/parser/functions/redis/redisKeysFn.js +26 -0
  402. package/parser/functions/redis/redisKeysFn.spec.js +67 -0
  403. package/parser/functions/redis/redisPopFn.js +26 -0
  404. package/parser/functions/redis/redisPopFn.spec.js +67 -0
  405. package/parser/functions/redis/redisPushFn.js +28 -0
  406. package/parser/functions/redis/redisPushFn.spec.js +71 -0
  407. package/parser/functions/redis/redisRangeFn.js +30 -0
  408. package/parser/functions/redis/redisRangeFn.spec.js +80 -0
  409. package/parser/functions/redis/redisRateLimitFn.js +32 -0
  410. package/parser/functions/redis/redisRateLimitFn.spec.js +87 -0
  411. package/parser/functions/redis/redisRemoveFn.js +29 -0
  412. package/parser/functions/redis/redisRemoveFn.spec.js +65 -0
  413. package/parser/functions/redis/redisSetFn.js +29 -0
  414. package/parser/functions/redis/redisSetFn.spec.js +89 -0
  415. package/parser/functions/redis/redisShiftFn.js +26 -0
  416. package/parser/functions/redis/redisShiftFn.spec.js +67 -0
  417. package/parser/functions/redis/redisUnshiftFn.js +28 -0
  418. package/parser/functions/redis/redisUnshiftFn.spec.js +73 -0
  419. package/parser/functions/redis/register.js +37 -0
  420. package/parser/functions/redisFn.js +31 -0
  421. package/parser/functions/register.js +91 -0
  422. package/parser/functions/schema/register.js +30 -0
  423. package/parser/functions/schema/schemaFn.js +173 -0
  424. package/parser/functions/schema/schemaFn.spec.js +92 -0
  425. package/parser/functions/schema/schemaParseArrayFn.js +47 -0
  426. package/parser/functions/schema/schemaParseArrayFn.spec.js +134 -0
  427. package/parser/functions/schema/schemaParseAttributeFn.js +194 -0
  428. package/parser/functions/schema/schemaParseAttributeFn.spec.js +281 -0
  429. package/parser/functions/schema/schemaParseConstantFn.js +136 -0
  430. package/parser/functions/schema/schemaParseConstantFn.spec.js +122 -0
  431. package/parser/functions/schema/schemaParseEnum.js +52 -0
  432. package/parser/functions/schema/schemaParseEnum.spec.js +47 -0
  433. package/parser/functions/schema/schemaParseImmutableFn.js +134 -0
  434. package/parser/functions/schema/schemaParseImmutableFn.spec.js +99 -0
  435. package/parser/functions/schema/schemaParseObjectFn.js +171 -0
  436. package/parser/functions/schema/schemaParseObjectFn.spec.js +223 -0
  437. package/parser/functions/schema/utils.js +136 -0
  438. package/parser/functions/schema/utils.spec.js +27 -0
  439. package/parser/functions/security/register.js +64 -0
  440. package/parser/functions/security/securityCheckPasswordFn.js +24 -0
  441. package/parser/functions/security/securityCheckPasswordFn.spec.js +22 -0
  442. package/parser/functions/security/securityCreateAuthTokenFn.js +24 -0
  443. package/parser/functions/security/securityCreateAuthTokenFn.spec.js +24 -0
  444. package/parser/functions/security/securityCreateCurveKeyFn.js +19 -0
  445. package/parser/functions/security/securityCreateCurveKeyFn.spec.js +22 -0
  446. package/parser/functions/security/securityCreatePasswordFn.js +26 -0
  447. package/parser/functions/security/securityCreatePasswordFn.spec.js +26 -0
  448. package/parser/functions/security/securityCreateRsaKeyFn.js +19 -0
  449. package/parser/functions/security/securityCreateRsaKeyFn.spec.js +22 -0
  450. package/parser/functions/security/securityCreateSecretKeyFn.js +24 -0
  451. package/parser/functions/security/securityCreateSecretKeyFn.spec.js +22 -0
  452. package/parser/functions/security/securityCreateUuidFn.js +26 -0
  453. package/parser/functions/security/securityCreateUuidFn.spec.js +27 -0
  454. package/parser/functions/security/securityDecryptFn.js +24 -0
  455. package/parser/functions/security/securityDecryptFn.spec.js +24 -0
  456. package/parser/functions/security/securityEncryptFn.js +24 -0
  457. package/parser/functions/security/securityEncryptFn.spec.js +24 -0
  458. package/parser/functions/security/securityJweDecodeFn.js +24 -0
  459. package/parser/functions/security/securityJweDecodeFn.spec.js +26 -0
  460. package/parser/functions/security/securityJweEncodeFn.js +24 -0
  461. package/parser/functions/security/securityJweEncodeFn.spec.js +26 -0
  462. package/parser/functions/security/securityJwsDecodeFn.js +24 -0
  463. package/parser/functions/security/securityJwsDecodeFn.spec.js +25 -0
  464. package/parser/functions/security/securityJwsEncodeFn.js +24 -0
  465. package/parser/functions/security/securityJwsEncodeFn.spec.js +25 -0
  466. package/parser/functions/security/securityRandomBytesFn.js +24 -0
  467. package/parser/functions/security/securityRandomBytesFn.spec.js +21 -0
  468. package/parser/functions/security/securityRandomNumberFn.js +24 -0
  469. package/parser/functions/security/securityRandomNumberFn.spec.js +22 -0
  470. package/parser/functions/securityFn.js +30 -0
  471. package/parser/functions/storage/register.js +44 -0
  472. package/parser/functions/storage/storageCreateAttachmentFn.js +25 -0
  473. package/parser/functions/storage/storageCreateAttachmentFn.spec.js +87 -0
  474. package/parser/functions/storage/storageCreateAudioFn.js +29 -0
  475. package/parser/functions/storage/storageCreateAudioFn.spec.js +98 -0
  476. package/parser/functions/storage/storageCreateFileResourceFn.js +19 -0
  477. package/parser/functions/storage/storageCreateFileResourceFn.spec.js +72 -0
  478. package/parser/functions/storage/storageCreateImageFn.js +25 -0
  479. package/parser/functions/storage/storageCreateImageFn.spec.js +98 -0
  480. package/parser/functions/storage/storageCreateVideoFn.js +29 -0
  481. package/parser/functions/storage/storageCreateVideoFn.spec.js +99 -0
  482. package/parser/functions/storage/storageDeleteFileFn.js +17 -0
  483. package/parser/functions/storage/storageDeleteFileFn.spec.js +67 -0
  484. package/parser/functions/storage/storageReadFileResourceFn.js +19 -0
  485. package/parser/functions/storage/storageReadFileResourceFn.spec.js +60 -0
  486. package/parser/functions/storage/storageSignPrivateUrlFn.js +19 -0
  487. package/parser/functions/storage/storageSignPrivateUrlFn.spec.js +72 -0
  488. package/parser/functions/storageFn.js +24 -0
  489. package/parser/functions/stream/register.js +13 -0
  490. package/parser/functions/stream/streamFromCsvFn.js +20 -0
  491. package/parser/functions/stream/streamFromCsvFn.spec.js +69 -0
  492. package/parser/functions/stream/streamFromJsonlFn.js +21 -0
  493. package/parser/functions/stream/streamFromJsonlFn.spec.js +47 -0
  494. package/parser/functions/stream/streamFromRequestFn.js +50 -0
  495. package/parser/functions/stream/streamFromRequestFn.spec.js +103 -0
  496. package/parser/functions/streamFn.js +19 -0
  497. package/parser/functions/text/allTextWithReturnValueFn.js +36 -0
  498. package/parser/functions/text/allTextWithReturnValueFn.spec.js +100 -0
  499. package/parser/functions/text/allTextWithoutReturnValueFn.js +34 -0
  500. package/parser/functions/text/allTextWithoutReturnValueFn.spec.js +122 -0
  501. package/parser/functions/text/register.js +17 -0
  502. package/parser/functions/textFn.js +33 -0
  503. package/parser/functions/toolCallFn.js +40 -0
  504. package/parser/functions/toolCallFn.spec.js +28 -0
  505. package/parser/functions/unitExpectFn.js +20 -0
  506. package/parser/functions/unitExpectFn.spec.js +21 -0
  507. package/parser/functions/util/register.js +29 -0
  508. package/parser/functions/util/utilGeoDistanceFn.js +30 -0
  509. package/parser/functions/util/utilGeoDistanceFn.spec.js +79 -0
  510. package/parser/functions/util/utilGetAllInputFn.js +20 -0
  511. package/parser/functions/util/utilGetAllInputFn.spec.js +33 -0
  512. package/parser/functions/util/utilGetEnvFn.js +20 -0
  513. package/parser/functions/util/utilGetEnvFn.spec.js +33 -0
  514. package/parser/functions/util/utilGetRawInputFn.js +25 -0
  515. package/parser/functions/util/utilGetRawInputFn.spec.js +55 -0
  516. package/parser/functions/util/utilGetVarsFn.js +20 -0
  517. package/parser/functions/util/utilGetVarsFn.spec.js +33 -0
  518. package/parser/functions/util/utilIpLookupFn.js +22 -0
  519. package/parser/functions/util/utilIpLookupFn.spec.js +37 -0
  520. package/parser/functions/util/utilPostProcessFn.js +43 -0
  521. package/parser/functions/util/utilPostProcessFn.spec.js +63 -0
  522. package/parser/functions/util/utilSendEmailFn.js +108 -0
  523. package/parser/functions/util/utilSendEmailFn.spec.js +62 -0
  524. package/parser/functions/util/utilSetHeaderFn.js +22 -0
  525. package/parser/functions/util/utilSetHeaderFn.spec.js +48 -0
  526. package/parser/functions/util/utilSleepFn.js +19 -0
  527. package/parser/functions/util/utilSleepFn.spec.js +44 -0
  528. package/parser/functions/util/utilTemplateFn.js +19 -0
  529. package/parser/functions/util/utilTemplateFn.spec.js +78 -0
  530. package/parser/functions/utilFn.js +39 -0
  531. package/parser/functions/varFn.js +51 -0
  532. package/parser/functions/varFn.spec.js +173 -0
  533. package/parser/functions/webflowFn.js +19 -0
  534. package/parser/functions/workflowExpectFn.js +20 -0
  535. package/parser/functions/zip/register.js +20 -0
  536. package/parser/functions/zip/zipAddToArchiveFn.js +31 -0
  537. package/parser/functions/zip/zipAddToArchiveFn.spec.js +78 -0
  538. package/parser/functions/zip/zipCreateArchiveFn.js +29 -0
  539. package/parser/functions/zip/zipCreateArchiveFn.spec.js +53 -0
  540. package/parser/functions/zip/zipDeleteFromArchiveFn.js +23 -0
  541. package/parser/functions/zip/zipDeleteFromArchiveFn.spec.js +69 -0
  542. package/parser/functions/zip/zipExtractFn.js +23 -0
  543. package/parser/functions/zip/zipExtractFn.spec.js +52 -0
  544. package/parser/functions/zip/zipViewContentsFn.js +24 -0
  545. package/parser/functions/zip/zipViewContentsFn.spec.js +52 -0
  546. package/parser/functions/zipFn.js +21 -0
  547. package/parser/generic/arrayOfObjectAttrReq.js +47 -0
  548. package/parser/generic/arrayOfObjectAttrReq.spec.js +254 -0
  549. package/parser/generic/arrayOfStringLiterals.js +45 -0
  550. package/parser/generic/arrayOfStringLiterals.spec.js +56 -0
  551. package/parser/generic/arrayWithValues.js +35 -0
  552. package/parser/generic/arrayWithValues.spec.js +72 -0
  553. package/parser/generic/asVariable.js +23 -0
  554. package/parser/generic/asVariable.spec.js +37 -0
  555. package/parser/generic/assignableVariableAs.js +27 -0
  556. package/parser/generic/assignableVariableAs.spec.js +52 -0
  557. package/parser/generic/assignableVariableProperty.js +52 -0
  558. package/parser/generic/assignableVariableProperty.spec.js +52 -0
  559. package/parser/generic/booleanValue.js +22 -0
  560. package/parser/generic/bracketAccessor.js +53 -0
  561. package/parser/generic/castedValue.js +14 -0
  562. package/parser/generic/castedValue.spec.js +29 -0
  563. package/parser/generic/chainedIdentifier.js +48 -0
  564. package/parser/generic/chainedIdentifier.spec.js +89 -0
  565. package/parser/generic/completeAuthVariable.js +13 -0
  566. package/parser/generic/completeAuthVariable.spec.js +23 -0
  567. package/parser/generic/completeEnvVariable.js +79 -0
  568. package/parser/generic/completeEnvVariable.spec.js +94 -0
  569. package/parser/generic/completeErrorVariable.js +39 -0
  570. package/parser/generic/completeErrorVariable.spec.js +17 -0
  571. package/parser/generic/completeInputVariable.js +42 -0
  572. package/parser/generic/completeInputVariable.spec.js +53 -0
  573. package/parser/generic/enumValue.js +23 -0
  574. package/parser/generic/expressionFn.js +415 -0
  575. package/parser/generic/expressionFn.spec.js +588 -0
  576. package/parser/generic/filterFn.js +48 -0
  577. package/parser/generic/filterFn.spec.js +47 -0
  578. package/parser/generic/filterNames.js +381 -0
  579. package/parser/generic/functionAttrReq.js +279 -0
  580. package/parser/generic/functionAttrReq.spec.js +353 -0
  581. package/parser/generic/longFormVariable.js +46 -0
  582. package/parser/generic/longFormVariable.spec.js +25 -0
  583. package/parser/generic/minimalFnBody.js +24 -0
  584. package/parser/generic/minimalFnBody.spec.js +47 -0
  585. package/parser/generic/mockAttribute.js +21 -0
  586. package/parser/generic/mockAttribute.spec.js +57 -0
  587. package/parser/generic/multilineFilterFn.js +27 -0
  588. package/parser/generic/multilineFilterFn.spec.js +51 -0
  589. package/parser/generic/numberValue.js +27 -0
  590. package/parser/generic/objectAttrReq.js +243 -0
  591. package/parser/generic/objectAttrReq.spec.js +412 -0
  592. package/parser/generic/objectWithAttributes.js +74 -0
  593. package/parser/generic/objectWithAttributes.spec.js +147 -0
  594. package/parser/generic/optionalCommentBlock.js +32 -0
  595. package/parser/generic/pipedFilter.js +20 -0
  596. package/parser/generic/register.js +124 -0
  597. package/parser/generic/requiredValueFnBody.js +40 -0
  598. package/parser/generic/requiredValueFnBody.spec.js +56 -0
  599. package/parser/generic/shortFormVariable.js +17 -0
  600. package/parser/generic/shortFormVariable.spec.js +27 -0
  601. package/parser/generic/stringArray.js +33 -0
  602. package/parser/generic/stringArray.spec.js +55 -0
  603. package/parser/generic/tagsAttribute.js +14 -0
  604. package/parser/generic/tagsAttribute.spec.js +47 -0
  605. package/parser/generic/utils.js +14 -0
  606. package/parser/generic/valueExpressionForResponse.js +51 -0
  607. package/parser/generic/variableOnly.js +13 -0
  608. package/parser/generic/variableOnly.spec.js +47 -0
  609. package/parser/mcp_server_parser.js +130 -0
  610. package/parser/mcp_server_parser.spec.js +478 -0
  611. package/parser/mcp_server_trigger_parser.js +142 -0
  612. package/parser/mcp_server_trigger_parser.spec.js +396 -0
  613. package/parser/metadata/columnMetadataDefinition.js +32 -0
  614. package/parser/metadata/columnMetadataDefinition.spec.js +47 -0
  615. package/parser/metadata/enumColumnMetadataDefinition.js +46 -0
  616. package/parser/metadata/enumColumnMetadataDefinition.spec.js +59 -0
  617. package/parser/metadata/objectColumnMetadataDefinition.js +26 -0
  618. package/parser/metadata/register.js +22 -0
  619. package/parser/middleware_parser.js +137 -0
  620. package/parser/middleware_parser.spec.js +203 -0
  621. package/parser/parser.js +87 -0
  622. package/parser/query_parser.js +183 -0
  623. package/parser/query_parser.spec.js +141 -0
  624. package/parser/realtime_channel_parser.js +45 -0
  625. package/parser/realtime_channel_parser.spec.js +20 -0
  626. package/parser/realtime_trigger_parser.js +141 -0
  627. package/parser/realtime_trigger_parser.spec.js +469 -0
  628. package/parser/register.js +88 -0
  629. package/parser/table_parser.js +126 -0
  630. package/parser/table_parser.spec.js +138 -0
  631. package/parser/table_trigger_parser.js +144 -0
  632. package/parser/table_trigger_parser.spec.js +449 -0
  633. package/parser/task_parser.js +116 -0
  634. package/parser/task_parser.spec.js +83 -0
  635. package/parser/test_parser.js +39 -0
  636. package/parser/tests/agent/agent_parser.spec.js +52 -0
  637. package/parser/tests/agent/valid_sources/customer_servier_agent.xs +45 -0
  638. package/parser/tests/api_group/api_group_parser.spec.js +52 -0
  639. package/parser/tests/api_group/valid_sources/api_group_history.xs +4 -0
  640. package/parser/tests/api_group/valid_sources/basic_api_group.xs +3 -0
  641. package/parser/tests/api_group/valid_sources/complete_api_group.xs +7 -0
  642. package/parser/tests/api_group/valid_sources/protected_api_group.xs +7 -0
  643. package/parser/tests/function/function_parser.spec.js +52 -0
  644. package/parser/tests/function/valid_sources/all_controls.xs +68 -0
  645. package/parser/tests/function/valid_sources/all_query_return_types.xs +227 -0
  646. package/parser/tests/function/valid_sources/all_storage.xs +45 -0
  647. package/parser/tests/function/valid_sources/discord_poll_send_to_slack.xs +133 -0
  648. package/parser/tests/function/valid_sources/expression_in_response.xs +22 -0
  649. package/parser/tests/function/valid_sources/filter_by_value.xs +55 -0
  650. package/parser/tests/function/valid_sources/filter_query.xs +82 -0
  651. package/parser/tests/function/valid_sources/large_regex.xs +13 -0
  652. package/parser/tests/function/valid_sources/ledash_ends_with.xs +90 -0
  653. package/parser/tests/function/valid_sources/multiline_description.xs +28 -0
  654. package/parser/tests/function/valid_sources/multiline_expr.xs +41 -0
  655. package/parser/tests/function/valid_sources/set_theory_fn.xs +129 -0
  656. package/parser/tests/function/valid_sources/simple_unit_test.xs +33 -0
  657. package/parser/tests/function/valid_sources/valid_officer.xs +57 -0
  658. package/parser/tests/function/valid_sources/webflow.xs +18 -0
  659. package/parser/tests/query/query_parser.spec.js +54 -0
  660. package/parser/tests/query/valid_sources/all_basics.xs +51 -0
  661. package/parser/tests/query/valid_sources/all_cloud.xs +141 -0
  662. package/parser/tests/query/valid_sources/all_db.xs +102 -0
  663. package/parser/tests/query/valid_sources/all_external_db.xs +43 -0
  664. package/parser/tests/query/valid_sources/all_keywords.xs +65 -0
  665. package/parser/tests/query/valid_sources/all_math.xs +53 -0
  666. package/parser/tests/query/valid_sources/all_object.xs +25 -0
  667. package/parser/tests/query/valid_sources/all_redis.xs +106 -0
  668. package/parser/tests/query/valid_sources/all_security.xs +105 -0
  669. package/parser/tests/query/valid_sources/all_stream.xs +69 -0
  670. package/parser/tests/query/valid_sources/all_text.xs +54 -0
  671. package/parser/tests/query/valid_sources/all_util.xs +66 -0
  672. package/parser/tests/query/valid_sources/all_zip.xs +39 -0
  673. package/parser/tests/query/valid_sources/arrays.xs +33 -0
  674. package/parser/tests/query/valid_sources/disabled_response.xs +27 -0
  675. package/parser/tests/query/valid_sources/multiline_lambda_GET.xs +50 -0
  676. package/parser/tests/query/valid_sources/mutliline_query.xs +140 -0
  677. package/parser/tests/query/valid_sources/patch_expression_multiline.xs +27 -0
  678. package/parser/tests/query/valid_sources/query_cache.xs +34 -0
  679. package/parser/tests/query/valid_sources/query_example.xs +43 -0
  680. package/parser/tests/query/valid_sources/query_mini.xs +11 -0
  681. package/parser/tests/query/valid_sources/query_rich_inputs.xs +32 -0
  682. package/parser/tests/query/valid_sources/simple_unit_test.xs +33 -0
  683. package/parser/tests/query/valid_sources/test_with_slashes.xs +22 -0
  684. package/parser/tests/query/valid_sources/with_unit_test.xs +97 -0
  685. package/parser/tests/table/table_parser.spec.js +52 -0
  686. package/parser/tests/table/valid_sources/account.xs +31 -0
  687. package/parser/tests/table/valid_sources/all_basic_columns.xs +44 -0
  688. package/parser/tests/table/valid_sources/basic_table.xs +15 -0
  689. package/parser/tests/table/valid_sources/empty_object.xs +17 -0
  690. package/parser/tests/table/valid_sources/empty_table.xs +3 -0
  691. package/parser/tests/table/valid_sources/multiline_index.xs +33 -0
  692. package/parser/tests/table/valid_sources/relation.xs +44 -0
  693. package/parser/tests/table/valid_sources/rich_columns.xs +28 -0
  694. package/parser/tests/table/valid_sources/table_with_comments.xs +17 -0
  695. package/parser/tests/table/valid_sources/table_with_search_index.xs +31 -0
  696. package/parser/tests/table/valid_sources/view_table.xs +62 -0
  697. package/parser/tests/task/task_parser.spec.js +53 -0
  698. package/parser/tests/task/valid_sources/active_event.xs +11 -0
  699. package/parser/tests/task/valid_sources/all_events.xs +17 -0
  700. package/parser/tests/task/valid_sources/daily_sales_report.xs +56 -0
  701. package/parser/tests/task/valid_sources/inactive_event.xs +11 -0
  702. package/parser/tests/workflow_test/valid_sources/basic_workflow_test.xs +13 -0
  703. package/parser/tests/workflow_test/workflow_test_parser.spec.js +52 -0
  704. package/parser/tool_parser.js +121 -0
  705. package/parser/tool_parser.spec.js +102 -0
  706. package/parser/workflow_test_parser.js +73 -0
  707. package/parser/workflow_test_parser.spec.js +71 -0
  708. package/parser/workspace_parser.js +38 -0
  709. package/parser/workspace_parser.spec.js +142 -0
  710. package/parser/workspace_trigger_parser.js +118 -0
  711. package/parser/workspace_trigger_parser.spec.js +332 -0
  712. package/profile-parser.js +214 -0
  713. package/server.js +59 -0
  714. package/toTmLanguage.js +75 -0
  715. package/utils.js +55 -0
  716. package/utils.spec.js +277 -0
@@ -0,0 +1,27 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(npm test:*)",
5
+ "Bash(npm run lint)",
6
+ "Bash(npm run test:*)",
7
+ "Bash(npx eslint:*)",
8
+ "Bash(node:*)",
9
+ "Bash(npm install)",
10
+ "Bash(grep:*)",
11
+ "Bash(git -C /Users/justinalbrecht/git/xs-language-server log --all --pretty=format:\"%h %s\")",
12
+ "Bash(git -C /Users/justinalbrecht/git/xs-language-server log --all -S \"password\\\\|secret\\\\|api_key\\\\|token\" --oneline)",
13
+ "Bash(xargs file:*)",
14
+ "Bash(find:*)",
15
+ "Bash(git -C /Users/justinalbrecht/git/xs-language-server log -p --all -S \"webhook\\\\|Bearer\\\\|discord\\\\|slack\\\\|xano_insiders\" -- \"*.xs\" \"*.js\")",
16
+ "Bash(git -C /Users/justinalbrecht/git/xs-language-server ls-files:*)",
17
+ "Bash(git -C /Users/justinalbrecht/git/xs-language-server status)",
18
+ "Bash(git -C /Users/justinalbrecht/git/xs-language-server diff --stat)",
19
+ "Bash(git -C /Users/justinalbrecht/git/xs-language-server log --oneline -5)",
20
+ "Bash(git -C /Users/justinalbrecht/git/xs-language-server add README.md LICENSE package.json lexer/tests/query/valid_sources/basic_query.xs parser/functions/stream/streamFromRequestFn.js parser/functions/stream/streamFromRequestFn.spec.js parser/tests/function/valid_sources/discord_poll_send_to_slack.xs parser/tests/query/valid_sources/all_basics.xs)",
21
+ "Bash(git -C /Users/justinalbrecht/git/xs-language-server commit -m \"$\\(cat <<''EOF''\nPrepare package for public npm release as @xano/xanoscript-language-server\n\n- Rename package to @xano/xanoscript-language-server\n- Add MIT LICENSE file\n- Add npm metadata \\(description, repository, author, license, bugs, homepage\\)\n- Remove private flag to allow publishing\n- Sanitize test files: replace internal URLs, IDs, and env var names with placeholders\n- Simplify README maintainer section\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\nEOF\n\\)\")",
22
+ "Bash(git -C /Users/justinalbrecht/git/xs-language-server log -1 --oneline)"
23
+ ],
24
+ "deny": [],
25
+ "ask": []
26
+ }
27
+ }
@@ -0,0 +1,190 @@
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.
@@ -0,0 +1,31 @@
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
@@ -0,0 +1 @@
1
+ npm run lint && npm test
package/CLAUDE.md ADDED
@@ -0,0 +1,121 @@
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
+ - `tokens.js` - Main token registry
34
+ - `lexer.js` - Chevrotain lexer implementation
35
+ - Domain tokens: `api.js`, `db.js`, `cloud.js`, `function.js`, etc.
36
+ - `utils.js` - Token creation utilities (`createToken`, `createTokenByName`)
37
+
38
+ **Parser (`parser/`)**: Grammar rules and parsing logic
39
+ - `base_parser.js` - Core XanoBaseParser extending Chevrotain
40
+ - 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`
41
+ - `attributes/` - Field attributes (description, disabled, sensitive)
42
+ - `clauses/` - Language blocks (stack, input, response, security, auth, cache, history, index, schema, test)
43
+ - `definitions/` - Type and column definitions
44
+ - `functions/` - Built-in functions organized by domain (api, array, cloud, controls, db, debug, expect, math, object, redis, time, util, variable)
45
+ - `generic/` - Reusable parsing components
46
+
47
+ **Language Server (`server.js` + feature directories)**:
48
+ - `onCompletion/` - Auto-completion logic
49
+ - `onDidChangeContent/` - Live diagnostics and error reporting
50
+ - `onHover/` - Documentation and hover information
51
+ - `onSemanticCheck/` - Syntax highlighting token generation
52
+
53
+ ### XanoScript Object Types
54
+
55
+ Primary constructs parsed by dedicated parsers:
56
+ - **query** - API endpoints with HTTP verbs, input validation, processing logic, responses
57
+ - **function** - Reusable logic blocks with testing capabilities
58
+ - **task** - Scheduled operations with cron-like triggers
59
+ - **api_group** - Collections of related API endpoints
60
+ - **table** - Database schema definitions with column types
61
+ - **workflow_test** - Test definitions for workflows
62
+ - **table_trigger** - Database table trigger definitions
63
+
64
+ ## Adding New Features
65
+
66
+ ### New Object Type
67
+ 1. Create a new parser in `parser/` (e.g., `my_object_parser.js`)
68
+ 2. Follow existing parser patterns (see `query_parser.js`, `function_parser.js`)
69
+ 3. Register it in `server.js`
70
+
71
+ ### New Keyword/Function
72
+ 1. Add token definition in appropriate `lexer/` file
73
+ 2. Create function implementation in `parser/functions/[domain]/`
74
+ 3. Register in parent clause or parser
75
+ 4. Add comprehensive tests in corresponding `.spec.js` file
76
+
77
+ ### Token Creation Pattern
78
+ ```javascript
79
+ export const MyToken = createTokenByName("keyword", {
80
+ longer_alt: Identifier,
81
+ categories: [Identifier],
82
+ });
83
+ ```
84
+
85
+ ### Parser Rule Pattern
86
+ ```javascript
87
+ myRule = this.RULE("myRule", () => {
88
+ this.CONSUME(MyToken);
89
+ this.SUBRULE(this.otherRule);
90
+ });
91
+ ```
92
+
93
+ ## Testing Guidelines
94
+
95
+ - Tests use Mocha + Chai framework
96
+ - 171 test files with `.spec.js` naming convention
97
+ - Test structure mirrors source structure
98
+ - Real XanoScript examples in `valid_sources/` directories
99
+ - Tests are explicit and straightforward - avoid dynamic test generation
100
+ - CI requires all tests to pass
101
+
102
+ ### Test Pattern
103
+ ```javascript
104
+ function parse(inputText) {
105
+ const lexResult = lexDocument(inputText);
106
+ const parser = new Parser();
107
+ parser.input = lexResult.tokens;
108
+ parser.myRule();
109
+ return parser;
110
+ }
111
+ ```
112
+
113
+ ## Development Notes
114
+
115
+ - **Node.js 20+ required** for ES module support
116
+ - **No compilation step** - pure JavaScript ES modules
117
+ - Use `import`/`export`, not `require()`
118
+ - Follow existing code conventions when adding features
119
+ - Check neighboring files for patterns and conventions
120
+ - Never assume a library is available - check `package.json` first
121
+ - 3 low-severity npm audit warnings are known and acceptable
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Xano
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,55 @@
1
+ [![CI](https://github.com/xano-labs/xs-language-server/actions/workflows/ci.yml/badge.svg)](https://github.com/xano-labs/xs-language-server/actions/workflows/ci.yml)
2
+
3
+ # XanoScript Language Server
4
+
5
+ The language server is based on [Chevrotain](https://chevrotain.io/), a powerful parsing library for JavaScript.
6
+
7
+ Maintained by the [Xano](https://xano.com) team.
8
+
9
+ ## File structure
10
+
11
+ - `lexer/`: Contains the lexer implementation, including token definitions and the lexer itself.
12
+ - `parser/`: Contains the parser implementation, including grammar definitions and the main parser class.
13
+
14
+ To integrate the language server with 3rd party tools, we also have a `server.js` file that sets up the language server and handles communication with clients.
15
+
16
+ - `onCompletion/`: Contains the implementation for the completion feature, allowing the language server to provide suggestions for code completion.
17
+ - `onDidChangeContent/`: Runs a diagnostic analysis on the content of the xanoscript (allow the editor to show errors + error message)
18
+ - `onHover/`: Provides hover information for symbols in the xanoscript, such as type information and documentation.
19
+ - `onSemanticCheck/`: Provides the highlight syntax for Xanoscript to the editor.
20
+
21
+ ## How do I add a new object type?
22
+
23
+ Every new object requires a new parser in the `parser/` folder. Use one of our existing parser (`query_parser.js`, `function_parser.js`...) to create yours. Once created, you'll have to add it to `server.js`.
24
+
25
+ ## How do I add a new keyword/function ?
26
+
27
+ We have a hierarchy for the different statements Xanoscript uses.
28
+
29
+ 1. Parser: this is the top level, we have a Query parser, function parser, etc.
30
+ 2. Clause: this is the main blocks in a given object type, could be stack, response, input...
31
+ 3. functions: this would be a statement, like a `debug.log` or `db.query`
32
+ 4. `attributes`, `definitions` would come next as component you can use to define your functions
33
+ 5. `generic` is used by all the other statement, like a toolset for language.
34
+
35
+ ## Testing
36
+
37
+ The language server is heavily tested and should remain that way as it grows. Test should be easy to copy, paste, extends. Avoid dynamic test (like using a loop), your test should be straightforward, easy to read, easy to understand, trustworthy.
38
+
39
+ To run the tests:
40
+
41
+ ```sh
42
+ npm test
43
+ ```
44
+
45
+ To run a specific test
46
+
47
+ ```sh
48
+ npm test -- -g "my test name"
49
+ ```
50
+
51
+ ## CI-CD
52
+
53
+ On commit, the CI/CD pipeline will run all tests and linting checks to ensure code quality. If any tests fail, the commit will be rejected until the issues are resolved.
54
+
55
+ You'll find the configuration of the action in the `.github/workflows/ci.yml` file.
package/connection.js ADDED
@@ -0,0 +1,7 @@
1
+ import {
2
+ createConnection,
3
+ ProposedFeatures,
4
+ } from "vscode-languageserver/node.js";
5
+
6
+ // Create a connection to the VS Code client
7
+ export const connection = createConnection(ProposedFeatures.all);
package/documents.js ADDED
@@ -0,0 +1,5 @@
1
+ import { TextDocuments } from "vscode-languageserver/node.js";
2
+ import { TextDocument } from "vscode-languageserver-textdocument";
3
+
4
+ // Manage open text documents
5
+ export const documents = new TextDocuments(TextDocument);
@@ -0,0 +1,102 @@
1
+ # Embedded JavaScript/TypeScript Support
2
+
3
+ This folder contains the server-side (JavaScript) implementation for recognizing and handling embedded JavaScript/TypeScript code within XanoScript `api.lambda` statements.
4
+
5
+ ## Files
6
+
7
+ ### `embeddedContent.js`
8
+ Core extraction and mapping logic:
9
+ - `extractEmbeddedJS(text)` - Finds all `code = """..."""` blocks in XanoScript
10
+ - `mapToVirtualJS(offset, text)` - Maps cursor position to embedded JS region
11
+ - `mapFromVirtualJS(virtualOffset, region)` - Maps from JS position back to XanoScript
12
+ - `isInEmbeddedRegion(offset, text)` - Quick check if position is in JS
13
+
14
+ ### `embeddedDocuments.js`
15
+ Virtual document manager:
16
+ - `EmbeddedDocumentManager` class - Tracks virtual documents per file
17
+ - Singleton `embeddedDocuments` instance for global access
18
+
19
+ ### `jsLanguageService.js`
20
+ Language service coordinator:
21
+ - `JSLanguageService` class - Coordinates JS features
22
+ - Helper methods for checking regions and updating documents
23
+ - Singleton `jsLanguageService` instance
24
+
25
+ ## How It Works
26
+
27
+ When a user types in a `.xs` file with embedded JavaScript:
28
+
29
+ ```xanoscript
30
+ api.lambda {
31
+ code = """
32
+ console.log("hello");
33
+ const result = [1, 2, 3].map(x => x * 2);
34
+ """
35
+ timeout = 10
36
+ }
37
+ ```
38
+
39
+ 1. **Detection**: The regex pattern `/code\s*=\s*"""\s*\n([\s\S]*?)\n\s*"""/g` finds the JavaScript content
40
+ 2. **Extraction**: `extractEmbeddedJS()` returns regions with `{content, offset, end}`
41
+ 3. **Delegation**: When completion/hover is requested in a JS region:
42
+ - `onCompletion.js` and `onHover.js` call `mapToVirtualJS()`
43
+ - If inside JS, they return `null`
44
+ - This tells VS Code to use its own JavaScript language service
45
+ 4. **Virtual Documents**: The client-side (TypeScript) creates virtual documents that VS Code's JS service can process
46
+
47
+ ## Usage
48
+
49
+ ### In Language Server Files
50
+
51
+ ```javascript
52
+ import { mapToVirtualJS } from "../embedded/embeddedContent.js";
53
+
54
+ export function onCompletion(params, documents) {
55
+ const document = documents.get(params.textDocument.uri);
56
+ const text = document.getText();
57
+ const offset = document.offsetAt(params.position);
58
+
59
+ // Check if we're in embedded JS
60
+ const virtualPos = mapToVirtualJS(offset, text);
61
+ if (virtualPos) {
62
+ // Let VS Code's JS service handle it
63
+ return null;
64
+ }
65
+
66
+ // Otherwise, handle as regular XanoScript
67
+ return getXanoScriptCompletions(text, offset);
68
+ }
69
+ ```
70
+
71
+ ## Pattern Matching
72
+
73
+ The regex pattern is intentionally simple:
74
+ - `code\s*=\s*"""` - Matches `code = """` with flexible whitespace
75
+ - `\s*\n` - Optional whitespace before newline
76
+ - `([\s\S]*?)` - **Capture group**: Any characters (including newlines), non-greedy
77
+ - `\n\s*"""` - Newline and closing triple quotes
78
+
79
+ This works in any context (not just `api.lambda`), making it flexible for future extensions.
80
+
81
+ ## Client-Side vs Server-Side
82
+
83
+ - **Server-side** (this folder): JavaScript implementation used by language server
84
+ - **Client-side** (`src/tooling/js_embedding.ts`): TypeScript implementation used by VS Code extension
85
+ - Both implement the same extraction logic but in their respective environments
86
+
87
+ ## Testing
88
+
89
+ All modules are ES6 modules and can be tested independently:
90
+
91
+ ```bash
92
+ cd language-server
93
+ node -e "import('./embedded/embeddedContent.js').then(m => console.log(m.extractEmbeddedJS('code = \"\"\"\\nconsole.log()\\n\"\"\"')))"
94
+ ```
95
+
96
+ ## Future Enhancements
97
+
98
+ Potential additions:
99
+ - Support for SQL in `db.query { sql = """...""" }`
100
+ - Support for HTML/CSS in template literals
101
+ - Multiple embedded regions per line
102
+ - Nested language detection
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Extract embedded JavaScript from XanoScript documents
3
+ * Finds api.lambda { code = """...""" } blocks
4
+ */
5
+
6
+ /**
7
+ * Extract all embedded JavaScript regions from XanoScript text
8
+ * @param {string} text - The full XanoScript document text
9
+ * @returns {Array<{content: string, offset: number, end: number}>} Array of JS regions
10
+ */
11
+ export function extractEmbeddedJS(text) {
12
+ const regions = [];
13
+
14
+ // Pattern matches: code = """..."""
15
+ // We use a simpler pattern that works regardless of context (api.lambda, etc.)
16
+ const pattern = /code\s*=\s*"""\s*\n([\s\S]*?)\n\s*"""/g;
17
+
18
+ let match;
19
+ while ((match = pattern.exec(text)) !== null) {
20
+ const content = match[1]; // The captured JavaScript content
21
+ const offset = match.index + match[0].indexOf(match[1]); // Start of JS content
22
+ const end = offset + content.length;
23
+
24
+ regions.push({
25
+ content,
26
+ offset,
27
+ end
28
+ });
29
+ }
30
+
31
+ return regions;
32
+ }
33
+
34
+ /**
35
+ * Check if a cursor position is within an embedded JavaScript region
36
+ * @param {number} offset - Cursor offset in the document
37
+ * @param {string} text - The full XanoScript document text
38
+ * @returns {{region: object, jsOffset: number} | null} The region and offset within JS, or null
39
+ */
40
+ export function mapToVirtualJS(offset, text) {
41
+ const regions = extractEmbeddedJS(text);
42
+
43
+ for (const region of regions) {
44
+ if (offset >= region.offset && offset <= region.end) {
45
+ const jsOffset = offset - region.offset;
46
+ return {
47
+ region,
48
+ jsOffset
49
+ };
50
+ }
51
+ }
52
+
53
+ return null;
54
+ }
55
+
56
+ /**
57
+ * Map a position from virtual JavaScript document back to XanoScript document
58
+ * @param {number} virtualOffset - Offset in the virtual JS document
59
+ * @param {object} region - The region object from extractEmbeddedJS
60
+ * @returns {number} Offset in the original XanoScript document
61
+ */
62
+ export function mapFromVirtualJS(virtualOffset, region) {
63
+ return region.offset + virtualOffset;
64
+ }
65
+
66
+ /**
67
+ * Check if a position is inside an embedded JavaScript region
68
+ * @param {number} offset - Cursor offset in the document
69
+ * @param {string} text - The full XanoScript document text
70
+ * @returns {boolean}
71
+ */
72
+ export function isInEmbeddedRegion(offset, text) {
73
+ return mapToVirtualJS(offset, text) !== null;
74
+ }