@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.
- package/.claude/settings.local.json +27 -0
- package/.github/copilot-instructions.md +190 -0
- package/.github/workflows/ci.yml +31 -0
- package/.husky/pre-commit +1 -0
- package/CLAUDE.md +121 -0
- package/LICENSE +21 -0
- package/README.md +55 -0
- package/connection.js +7 -0
- package/documents.js +5 -0
- package/embedded/README.md +102 -0
- package/embedded/embeddedContent.js +74 -0
- package/embedded/embeddedDocuments.js +57 -0
- package/embedded/jsLanguageService.js +74 -0
- package/eslint.config.js +24 -0
- package/language-server-worker.js +52 -0
- package/lexer/action.js +31 -0
- package/lexer/addon.js +31 -0
- package/lexer/agent.js +37 -0
- package/lexer/agent_trigger.js +42 -0
- package/lexer/ai.js +82 -0
- package/lexer/api.js +81 -0
- package/lexer/api_group.js +58 -0
- package/lexer/arrays.js +161 -0
- package/lexer/branch.js +31 -0
- package/lexer/cast.js +105 -0
- package/lexer/cloud.js +159 -0
- package/lexer/columns.js +234 -0
- package/lexer/comment.js +61 -0
- package/lexer/comment.spec.js +77 -0
- package/lexer/control.js +634 -0
- package/lexer/db.js +190 -0
- package/lexer/debug.js +37 -0
- package/lexer/expect.js +157 -0
- package/lexer/function.js +36 -0
- package/lexer/identifier.js +6 -0
- package/lexer/lexer.js +26 -0
- package/lexer/literal.js +77 -0
- package/lexer/math.js +97 -0
- package/lexer/mcp_server.js +51 -0
- package/lexer/mcp_server_trigger.js +42 -0
- package/lexer/middleware.js +42 -0
- package/lexer/multiline.js +24 -0
- package/lexer/multiline.spec.js +179 -0
- package/lexer/object.js +44 -0
- package/lexer/query.js +99 -0
- package/lexer/realtime_trigger.js +50 -0
- package/lexer/redis.js +145 -0
- package/lexer/security.js +161 -0
- package/lexer/storage.js +99 -0
- package/lexer/stream.js +49 -0
- package/lexer/table.js +38 -0
- package/lexer/table_trigger.js +50 -0
- package/lexer/task.js +83 -0
- package/lexer/tests/query/query_lexer.spec.js +36 -0
- package/lexer/tests/query/valid_sources/basic_query.xs +44 -0
- package/lexer/tests/query/valid_sources/db_query.xs +77 -0
- package/lexer/tests/query/valid_sources/empty_query.xs +5 -0
- package/lexer/tests/query/valid_sources/header_query.xs +15 -0
- package/lexer/tests/table/basic_table.xs +17 -0
- package/lexer/tests/table/empty_table.xs +3 -0
- package/lexer/tests/table/table_lexer.spec.js +324 -0
- package/lexer/text.js +114 -0
- package/lexer/tokens.js +526 -0
- package/lexer/tool.js +39 -0
- package/lexer/util.js +113 -0
- package/lexer/utils.js +56 -0
- package/lexer/utils.spec.js +61 -0
- package/lexer/var.js +30 -0
- package/lexer/variables.js +217 -0
- package/lexer/workflow_test.js +42 -0
- package/lexer/workspace.js +23 -0
- package/lexer/workspace_trigger.js +42 -0
- package/lexer/zip.js +63 -0
- package/logic-assistant-script.js +8 -0
- package/onCheckError/onCheckError.js +43 -0
- package/onCompletion/contentAssist.js +183 -0
- package/onCompletion/contentAssist.spec.js +275 -0
- package/onCompletion/onCompletion.js +38 -0
- package/onDidChangeContent/onDidChangeContent.js +128 -0
- package/onHover/FilterMessageProvider.js +102 -0
- package/onHover/FilterMessageProvider.spec.js +85 -0
- package/onHover/FunctionMessageProvider.js +122 -0
- package/onHover/FunctionMessageProvider.spec.js +128 -0
- package/onHover/HoverMessageProvider.js +31 -0
- package/onHover/InputFilterMessageProvider.js +140 -0
- package/onHover/InputFilterMessageProvider.spec.js +329 -0
- package/onHover/InputVariableMessageProvider.js +55 -0
- package/onHover/QueryFilterMessageProvider.spec.js +164 -0
- package/onHover/filters.md +2852 -0
- package/onHover/functions.md +2617 -0
- package/onHover/inputFilters.md +271 -0
- package/onHover/onHover.js +40 -0
- package/onHover/onHoverDocument.js +64 -0
- package/onHover/onHoverDocument.spec.js +486 -0
- package/onHover/queryFilterMessageProvider.js +122 -0
- package/onHover/queryFilters.md +489 -0
- package/onSemanticCheck/highlight.js +45 -0
- package/onSemanticCheck/onSemanticCheck.js +25 -0
- package/onSemanticCheck/tokens.js +40 -0
- package/package.json +48 -0
- package/parser/addon_parser.js +90 -0
- package/parser/addon_parser.spec.js +88 -0
- package/parser/agent_parser.js +281 -0
- package/parser/agent_parser.spec.js +599 -0
- package/parser/agent_trigger_parser.js +138 -0
- package/parser/agent_trigger_parser.spec.js +525 -0
- package/parser/api_group_parser.js +143 -0
- package/parser/api_group_parser.spec.js +127 -0
- package/parser/attributes/columnDefaultValueAttribute.js +33 -0
- package/parser/attributes/columnDefaultValueAttribute.spec.js +49 -0
- package/parser/attributes/descriptionFieldAttribute.js +24 -0
- package/parser/attributes/descriptionFieldAttribute.spec.js +39 -0
- package/parser/attributes/disabledFieldAttribute.js +19 -0
- package/parser/attributes/disabledFieldAttribute.spec.js +34 -0
- package/parser/attributes/docsFieldAttribute.js +24 -0
- package/parser/attributes/docsFieldAttribute.spec.js +39 -0
- package/parser/attributes/inputFilterFn.js +71 -0
- package/parser/attributes/inputFilterFn.spec.js +39 -0
- package/parser/attributes/register.js +41 -0
- package/parser/attributes/sensitiveFieldAttribute.js +17 -0
- package/parser/attributes/sensitiveFieldAttribute.spec.js +39 -0
- package/parser/attributes/valueFieldAttribute.js +17 -0
- package/parser/attributes/valueFieldAttribute.spec.js +54 -0
- package/parser/attributes/valuesFieldAttribute.js +18 -0
- package/parser/attributes/valuesFieldAttribute.spec.js +44 -0
- package/parser/base_parser.js +249 -0
- package/parser/branch_parser.js +49 -0
- package/parser/branch_parser.spec.js +34 -0
- package/parser/clauses/agentClause.js +23 -0
- package/parser/clauses/agentClause.spec.js +34 -0
- package/parser/clauses/authClause.js +17 -0
- package/parser/clauses/authClause.spec.js +39 -0
- package/parser/clauses/cacheClause.js +32 -0
- package/parser/clauses/cacheClause.spec.js +103 -0
- package/parser/clauses/canonicalClause.js +23 -0
- package/parser/clauses/canonicalClause.spec.js +34 -0
- package/parser/clauses/channelClause.js +23 -0
- package/parser/clauses/channelClause.spec.js +34 -0
- package/parser/clauses/dbTableClause.js +23 -0
- package/parser/clauses/dbTableClause.spec.js +34 -0
- package/parser/clauses/flexibleStringClause.js +43 -0
- package/parser/clauses/historyClause.js +19 -0
- package/parser/clauses/historyClause.spec.js +53 -0
- package/parser/clauses/indexClause.js +36 -0
- package/parser/clauses/indexClause.spec.js +47 -0
- package/parser/clauses/inputClause.js +35 -0
- package/parser/clauses/inputClause.spec.js +79 -0
- package/parser/clauses/mcpServerClause.js +23 -0
- package/parser/clauses/mcpServerClause.spec.js +34 -0
- package/parser/clauses/middlewareClause.js +39 -0
- package/parser/clauses/middlewareClause.spec.js +161 -0
- package/parser/clauses/nakedStackFn.js +69 -0
- package/parser/clauses/nakedStackFn.spec.js +63 -0
- package/parser/clauses/outputClause.js +33 -0
- package/parser/clauses/register.js +50 -0
- package/parser/clauses/responseClause.js +17 -0
- package/parser/clauses/responseClause.spec.js +42 -0
- package/parser/clauses/scheduleClause.js +37 -0
- package/parser/clauses/scheduleClause.spec.js +71 -0
- package/parser/clauses/schemaClause.js +66 -0
- package/parser/clauses/schemaClause.spec.js +66 -0
- package/parser/clauses/stackClause.js +16 -0
- package/parser/clauses/testClause.js +73 -0
- package/parser/clauses/testClause.spec.js +78 -0
- package/parser/clauses/viewClause.js +49 -0
- package/parser/clauses/viewClause.spec.js +154 -0
- package/parser/definitions/arraySlice.js +70 -0
- package/parser/definitions/arraySlice.spec.js +49 -0
- package/parser/definitions/columnDefinition.js +139 -0
- package/parser/definitions/columnDefinition.spec.js +199 -0
- package/parser/definitions/dbLinkColumnDefinition.js +24 -0
- package/parser/definitions/dbLinkColumnDefinition.spec.js +45 -0
- package/parser/definitions/enumColumnDefinition.js +55 -0
- package/parser/definitions/enumColumnDefinition.spec.js +108 -0
- package/parser/definitions/filterDefinition.js +23 -0
- package/parser/definitions/filterDefinition.spec.js +43 -0
- package/parser/definitions/objectColumnDefinition.js +52 -0
- package/parser/definitions/objectColumnDefinition.spec.js +118 -0
- package/parser/definitions/register.js +28 -0
- package/parser/function_parser.js +123 -0
- package/parser/function_parser.spec.js +83 -0
- package/parser/functions/actionCallFn.js +41 -0
- package/parser/functions/actionCallFn.spec.js +51 -0
- package/parser/functions/addonCallFn.js +39 -0
- package/parser/functions/addonCallFn.spec.js +41 -0
- package/parser/functions/ai/aiAgentRunFn.js +40 -0
- package/parser/functions/ai/aiAgentRunFn.spec.js +94 -0
- package/parser/functions/ai/aiExternalMcpServerDetailsFn.js +28 -0
- package/parser/functions/ai/aiExternalMcpServerDetailsFn.spec.js +85 -0
- package/parser/functions/ai/aiExternalMcpToolListFn.js +28 -0
- package/parser/functions/ai/aiExternalMcpToolListFn.spec.js +85 -0
- package/parser/functions/ai/aiExternalMcpToolRunFn.js +30 -0
- package/parser/functions/ai/aiExternalMcpToolRunFn.spec.js +101 -0
- package/parser/functions/ai/register.js +24 -0
- package/parser/functions/aiFn.js +61 -0
- package/parser/functions/aiFn.spec.js +51 -0
- package/parser/functions/api/apiCallFn.js +49 -0
- package/parser/functions/api/apiCallFn.spec.js +60 -0
- package/parser/functions/api/apiLambdaFn.js +19 -0
- package/parser/functions/api/apiLambdaFn.spec.js +63 -0
- package/parser/functions/api/apiRealtimeEventFn.js +25 -0
- package/parser/functions/api/apiRealtimeEventFn.spec.js +82 -0
- package/parser/functions/api/apiRequestFn.js +47 -0
- package/parser/functions/api/apiRequestFn.spec.js +113 -0
- package/parser/functions/api/apiStreamFn.js +22 -0
- package/parser/functions/api/apiStreamFn.spec.js +44 -0
- package/parser/functions/api/register.js +19 -0
- package/parser/functions/api/webflowRequestFn.js +47 -0
- package/parser/functions/api/webflowRequestFn.spec.js +114 -0
- package/parser/functions/apiFn.js +24 -0
- package/parser/functions/array/arrayDifferenceFn.js +37 -0
- package/parser/functions/array/arrayDifferenceFn.spec.js +34 -0
- package/parser/functions/array/arrayEveryFn.js +13 -0
- package/parser/functions/array/arrayFilterCountFn.js +14 -0
- package/parser/functions/array/arrayFilterFn.js +14 -0
- package/parser/functions/array/arrayFindFn.js +14 -0
- package/parser/functions/array/arrayFindFn.spec.js +44 -0
- package/parser/functions/array/arrayFindIndexFn.js +14 -0
- package/parser/functions/array/arrayGroupByFn.js +36 -0
- package/parser/functions/array/arrayGroupByFn.spec.js +41 -0
- package/parser/functions/array/arrayHasFn.js +14 -0
- package/parser/functions/array/arrayIntersectionFn.js +37 -0
- package/parser/functions/array/arrayIntersectionFn.spec.js +22 -0
- package/parser/functions/array/arrayMapFn.js +36 -0
- package/parser/functions/array/arrayMapFn.spec.js +37 -0
- package/parser/functions/array/arrayMergeFn.js +17 -0
- package/parser/functions/array/arrayNoValueAs.js +31 -0
- package/parser/functions/array/arrayNoValueAs.spec.js +56 -0
- package/parser/functions/array/arrayPartitionFn.js +19 -0
- package/parser/functions/array/arrayPartitionFn.spec.js +29 -0
- package/parser/functions/array/arrayPopFn.js +17 -0
- package/parser/functions/array/arrayPushFn.js +14 -0
- package/parser/functions/array/arrayShiftFn.js +15 -0
- package/parser/functions/array/arrayUnionFn.js +37 -0
- package/parser/functions/array/arrayUnionFn.spec.js +22 -0
- package/parser/functions/array/arrayUnshiftFn.js +14 -0
- package/parser/functions/array/arrayValueIfAs.js +51 -0
- package/parser/functions/array/arrayValueIfAs.spec.js +54 -0
- package/parser/functions/array/arrayValueOnly.js +40 -0
- package/parser/functions/array/arrayValueOnly.spec.js +61 -0
- package/parser/functions/array/register.js +49 -0
- package/parser/functions/array/valueAttrOnly.js +47 -0
- package/parser/functions/array/valueAttrOnly.spec.js +61 -0
- package/parser/functions/arrayFn.js +33 -0
- package/parser/functions/cloud/cloudAlgoliaFn.js +18 -0
- package/parser/functions/cloud/cloudAlgoliaRequestFn.js +26 -0
- package/parser/functions/cloud/cloudAlgoliaRequestFn.spec.js +30 -0
- package/parser/functions/cloud/cloudAwsFn.js +19 -0
- package/parser/functions/cloud/cloudAwsOpenSearchFn.js +19 -0
- package/parser/functions/cloud/cloudAwsS3Fn.js +22 -0
- package/parser/functions/cloud/cloudAwsS3Fn.spec.js +21 -0
- package/parser/functions/cloud/cloudAzureFn.js +18 -0
- package/parser/functions/cloud/cloudDeleteFileFn.js +23 -0
- package/parser/functions/cloud/cloudDeleteFileFn.spec.js +25 -0
- package/parser/functions/cloud/cloudElasticSearchFn.js +19 -0
- package/parser/functions/cloud/cloudGetFileInfoFn.js +24 -0
- package/parser/functions/cloud/cloudGetFileInfoFn.spec.js +25 -0
- package/parser/functions/cloud/cloudGoogleFn.js +18 -0
- package/parser/functions/cloud/cloudListDirectoryFn.js +24 -0
- package/parser/functions/cloud/cloudListDirectoryFn.spec.js +26 -0
- package/parser/functions/cloud/cloudReadFileFn.js +24 -0
- package/parser/functions/cloud/cloudReadFileFn.spec.js +25 -0
- package/parser/functions/cloud/cloudSearchDocumentFn.js +24 -0
- package/parser/functions/cloud/cloudSearchDocumentFn.spec.js +28 -0
- package/parser/functions/cloud/cloudSearchQueryFn.js +24 -0
- package/parser/functions/cloud/cloudSearchQueryFn.spec.js +32 -0
- package/parser/functions/cloud/cloudSearchRequestFn.js +24 -0
- package/parser/functions/cloud/cloudSearchRequestFn.spec.js +32 -0
- package/parser/functions/cloud/cloudSignUrlFn.js +24 -0
- package/parser/functions/cloud/cloudSignUrlFn.spec.js +26 -0
- package/parser/functions/cloud/cloudStorageFn.js +23 -0
- package/parser/functions/cloud/cloudStorageFn.spec.js +21 -0
- package/parser/functions/cloud/cloudUploadFileFn.js +24 -0
- package/parser/functions/cloud/cloudUploadFileFn.spec.js +29 -0
- package/parser/functions/cloud/register.js +61 -0
- package/parser/functions/cloudFn.js +21 -0
- package/parser/functions/controlFn.js +34 -0
- package/parser/functions/controls/awaitFn.js +21 -0
- package/parser/functions/controls/awaitFn.spec.js +48 -0
- package/parser/functions/controls/conditionalElifFn.js +19 -0
- package/parser/functions/controls/conditionalElseFn.js +13 -0
- package/parser/functions/controls/conditionalFn.js +62 -0
- package/parser/functions/controls/conditionalFn.spec.js +167 -0
- package/parser/functions/controls/conditionalIfFn.js +19 -0
- package/parser/functions/controls/forEachFn.js +70 -0
- package/parser/functions/controls/forEachFn.spec.js +101 -0
- package/parser/functions/controls/forFn.js +55 -0
- package/parser/functions/controls/forFn.spec.js +85 -0
- package/parser/functions/controls/functionCallFn.js +38 -0
- package/parser/functions/controls/functionRunFn.js +40 -0
- package/parser/functions/controls/functionRunFn.spec.js +77 -0
- package/parser/functions/controls/groupFn.js +42 -0
- package/parser/functions/controls/groupFn.spec.js +63 -0
- package/parser/functions/controls/preconditionFn.js +40 -0
- package/parser/functions/controls/preconditionFn.spec.js +97 -0
- package/parser/functions/controls/register.js +45 -0
- package/parser/functions/controls/returnFn.js +21 -0
- package/parser/functions/controls/returnFn.spec.js +44 -0
- package/parser/functions/controls/switchCaseFn.js +22 -0
- package/parser/functions/controls/switchDefaultFn.js +13 -0
- package/parser/functions/controls/switchFn.js +50 -0
- package/parser/functions/controls/switchFn.spec.js +104 -0
- package/parser/functions/controls/taskCallFn.js +31 -0
- package/parser/functions/controls/throwFn.js +21 -0
- package/parser/functions/controls/throwFn.spec.js +56 -0
- package/parser/functions/controls/tryCatchFn.js +67 -0
- package/parser/functions/controls/tryCatchFn.spec.js +180 -0
- package/parser/functions/controls/whileFn.js +52 -0
- package/parser/functions/controls/whileFn.spec.js +94 -0
- package/parser/functions/db/dbAddFn.js +38 -0
- package/parser/functions/db/dbAddFn.spec.js +72 -0
- package/parser/functions/db/dbAddOrEditFn.js +39 -0
- package/parser/functions/db/dbAddOrEditFn.spec.js +97 -0
- package/parser/functions/db/dbAddonAttr.js +17 -0
- package/parser/functions/db/dbBulkAddFn.js +54 -0
- package/parser/functions/db/dbBulkAddFn.spec.js +94 -0
- package/parser/functions/db/dbBulkDeleteFn.js +35 -0
- package/parser/functions/db/dbBulkDeleteFn.spec.js +28 -0
- package/parser/functions/db/dbBulkFn.js +20 -0
- package/parser/functions/db/dbBulkPatchFn.js +35 -0
- package/parser/functions/db/dbBulkPatchFn.spec.js +42 -0
- package/parser/functions/db/dbBulkUpdateFn.js +35 -0
- package/parser/functions/db/dbBulkUpdateFn.spec.js +42 -0
- package/parser/functions/db/dbDelFn.js +34 -0
- package/parser/functions/db/dbDelFn.spec.js +62 -0
- package/parser/functions/db/dbDirectQueryFn.js +37 -0
- package/parser/functions/db/dbDirectQueryFn.spec.js +104 -0
- package/parser/functions/db/dbEditFn.js +40 -0
- package/parser/functions/db/dbEditFn.spec.js +122 -0
- package/parser/functions/db/dbExternalDirectQueryFn.js +29 -0
- package/parser/functions/db/dbExternalDirectQueryFn.spec.js +103 -0
- package/parser/functions/db/dbExternalFn.js +29 -0
- package/parser/functions/db/dbGetFn.js +40 -0
- package/parser/functions/db/dbGetFn.spec.js +117 -0
- package/parser/functions/db/dbHasFn.js +34 -0
- package/parser/functions/db/dbHasFn.spec.js +62 -0
- package/parser/functions/db/dbPatchFn.js +39 -0
- package/parser/functions/db/dbPatchFn.spec.js +88 -0
- package/parser/functions/db/dbQueryFn.js +73 -0
- package/parser/functions/db/dbQueryFn.spec.js +333 -0
- package/parser/functions/db/dbSchemaFn.js +25 -0
- package/parser/functions/db/dbSchemaFn.spec.js +42 -0
- package/parser/functions/db/dbSetDatasourceFn.js +18 -0
- package/parser/functions/db/dbSetDatasourceFn.spec.js +44 -0
- package/parser/functions/db/dbTransactionFn.js +43 -0
- package/parser/functions/db/dbTransactionFn.spec.js +63 -0
- package/parser/functions/db/dbTruncateFn.js +33 -0
- package/parser/functions/db/dbTruncateFn.spec.js +42 -0
- package/parser/functions/db/register.js +52 -0
- package/parser/functions/db/schema.js +8 -0
- package/parser/functions/dbFn.js +31 -0
- package/parser/functions/debug/debugLogFn.js +21 -0
- package/parser/functions/debug/debugLogFn.spec.js +44 -0
- package/parser/functions/debug/debugStopFn.js +21 -0
- package/parser/functions/debug/debugStopFn.spec.js +44 -0
- package/parser/functions/debug/register.js +11 -0
- package/parser/functions/debugFn.js +18 -0
- package/parser/functions/expect/register.js +44 -0
- package/parser/functions/expect/unitExpectToBeWithinFn.js +28 -0
- package/parser/functions/expect/unitExpectToBeWithinFn.spec.js +61 -0
- package/parser/functions/expect/unitExpectToThrowFn.js +15 -0
- package/parser/functions/expect/unitExpectToThrowFn.spec.js +40 -0
- package/parser/functions/expect/unitExpectWithArgumentsFn.js +49 -0
- package/parser/functions/expect/unitExpectWithArgumentsFn.spec.js +341 -0
- package/parser/functions/expect/unitExpectWithoutArgumentsFn.js +42 -0
- package/parser/functions/expect/unitExpectWithoutArgumentsFn.spec.js +69 -0
- package/parser/functions/expect/workflowExpectToBeWithinFn.js +22 -0
- package/parser/functions/expect/workflowExpectToBeWithinFn.spec.js +70 -0
- package/parser/functions/expect/workflowExpectToThrowFn.js +21 -0
- package/parser/functions/expect/workflowExpectToThrowFn.spec.js +56 -0
- package/parser/functions/expect/workflowExpectWithArgumentsFn.js +40 -0
- package/parser/functions/expect/workflowExpectWithArgumentsFn.spec.js +301 -0
- package/parser/functions/expect/workflowExpectWithoutArgumentsFn.js +39 -0
- package/parser/functions/expect/workflowExpectWithoutArgumentsFn.spec.js +87 -0
- package/parser/functions/math/allMathFn.js +64 -0
- package/parser/functions/math/allMathFn.spec.js +100 -0
- package/parser/functions/math/register.js +9 -0
- package/parser/functions/mathFn.js +15 -0
- package/parser/functions/middlewareCallFn.js +43 -0
- package/parser/functions/middlewareCallFn.spec.js +44 -0
- package/parser/functions/object/objectEntriesFn.js +22 -0
- package/parser/functions/object/objectEntriesFn.spec.js +44 -0
- package/parser/functions/object/objectKeysFn.js +22 -0
- package/parser/functions/object/objectKeysFn.spec.js +44 -0
- package/parser/functions/object/objectValuesFn.js +22 -0
- package/parser/functions/object/objectValuesFn.spec.js +44 -0
- package/parser/functions/object/register.js +13 -0
- package/parser/functions/objectFn.js +22 -0
- package/parser/functions/redis/redisCountFn.js +26 -0
- package/parser/functions/redis/redisCountFn.spec.js +58 -0
- package/parser/functions/redis/redisDecrFn.js +28 -0
- package/parser/functions/redis/redisDecrFn.spec.js +47 -0
- package/parser/functions/redis/redisDelFn.js +25 -0
- package/parser/functions/redis/redisDelFn.spec.js +58 -0
- package/parser/functions/redis/redisGetFn.js +26 -0
- package/parser/functions/redis/redisGetFn.spec.js +67 -0
- package/parser/functions/redis/redisHasFn.js +26 -0
- package/parser/functions/redis/redisHasFn.spec.js +58 -0
- package/parser/functions/redis/redisIncrFn.js +28 -0
- package/parser/functions/redis/redisIncrFn.spec.js +74 -0
- package/parser/functions/redis/redisKeysFn.js +26 -0
- package/parser/functions/redis/redisKeysFn.spec.js +67 -0
- package/parser/functions/redis/redisPopFn.js +26 -0
- package/parser/functions/redis/redisPopFn.spec.js +67 -0
- package/parser/functions/redis/redisPushFn.js +28 -0
- package/parser/functions/redis/redisPushFn.spec.js +71 -0
- package/parser/functions/redis/redisRangeFn.js +30 -0
- package/parser/functions/redis/redisRangeFn.spec.js +80 -0
- package/parser/functions/redis/redisRateLimitFn.js +32 -0
- package/parser/functions/redis/redisRateLimitFn.spec.js +87 -0
- package/parser/functions/redis/redisRemoveFn.js +29 -0
- package/parser/functions/redis/redisRemoveFn.spec.js +65 -0
- package/parser/functions/redis/redisSetFn.js +29 -0
- package/parser/functions/redis/redisSetFn.spec.js +89 -0
- package/parser/functions/redis/redisShiftFn.js +26 -0
- package/parser/functions/redis/redisShiftFn.spec.js +67 -0
- package/parser/functions/redis/redisUnshiftFn.js +28 -0
- package/parser/functions/redis/redisUnshiftFn.spec.js +73 -0
- package/parser/functions/redis/register.js +37 -0
- package/parser/functions/redisFn.js +31 -0
- package/parser/functions/register.js +91 -0
- package/parser/functions/schema/register.js +30 -0
- package/parser/functions/schema/schemaFn.js +173 -0
- package/parser/functions/schema/schemaFn.spec.js +92 -0
- package/parser/functions/schema/schemaParseArrayFn.js +47 -0
- package/parser/functions/schema/schemaParseArrayFn.spec.js +134 -0
- package/parser/functions/schema/schemaParseAttributeFn.js +194 -0
- package/parser/functions/schema/schemaParseAttributeFn.spec.js +281 -0
- package/parser/functions/schema/schemaParseConstantFn.js +136 -0
- package/parser/functions/schema/schemaParseConstantFn.spec.js +122 -0
- package/parser/functions/schema/schemaParseEnum.js +52 -0
- package/parser/functions/schema/schemaParseEnum.spec.js +47 -0
- package/parser/functions/schema/schemaParseImmutableFn.js +134 -0
- package/parser/functions/schema/schemaParseImmutableFn.spec.js +99 -0
- package/parser/functions/schema/schemaParseObjectFn.js +171 -0
- package/parser/functions/schema/schemaParseObjectFn.spec.js +223 -0
- package/parser/functions/schema/utils.js +136 -0
- package/parser/functions/schema/utils.spec.js +27 -0
- package/parser/functions/security/register.js +64 -0
- package/parser/functions/security/securityCheckPasswordFn.js +24 -0
- package/parser/functions/security/securityCheckPasswordFn.spec.js +22 -0
- package/parser/functions/security/securityCreateAuthTokenFn.js +24 -0
- package/parser/functions/security/securityCreateAuthTokenFn.spec.js +24 -0
- package/parser/functions/security/securityCreateCurveKeyFn.js +19 -0
- package/parser/functions/security/securityCreateCurveKeyFn.spec.js +22 -0
- package/parser/functions/security/securityCreatePasswordFn.js +26 -0
- package/parser/functions/security/securityCreatePasswordFn.spec.js +26 -0
- package/parser/functions/security/securityCreateRsaKeyFn.js +19 -0
- package/parser/functions/security/securityCreateRsaKeyFn.spec.js +22 -0
- package/parser/functions/security/securityCreateSecretKeyFn.js +24 -0
- package/parser/functions/security/securityCreateSecretKeyFn.spec.js +22 -0
- package/parser/functions/security/securityCreateUuidFn.js +26 -0
- package/parser/functions/security/securityCreateUuidFn.spec.js +27 -0
- package/parser/functions/security/securityDecryptFn.js +24 -0
- package/parser/functions/security/securityDecryptFn.spec.js +24 -0
- package/parser/functions/security/securityEncryptFn.js +24 -0
- package/parser/functions/security/securityEncryptFn.spec.js +24 -0
- package/parser/functions/security/securityJweDecodeFn.js +24 -0
- package/parser/functions/security/securityJweDecodeFn.spec.js +26 -0
- package/parser/functions/security/securityJweEncodeFn.js +24 -0
- package/parser/functions/security/securityJweEncodeFn.spec.js +26 -0
- package/parser/functions/security/securityJwsDecodeFn.js +24 -0
- package/parser/functions/security/securityJwsDecodeFn.spec.js +25 -0
- package/parser/functions/security/securityJwsEncodeFn.js +24 -0
- package/parser/functions/security/securityJwsEncodeFn.spec.js +25 -0
- package/parser/functions/security/securityRandomBytesFn.js +24 -0
- package/parser/functions/security/securityRandomBytesFn.spec.js +21 -0
- package/parser/functions/security/securityRandomNumberFn.js +24 -0
- package/parser/functions/security/securityRandomNumberFn.spec.js +22 -0
- package/parser/functions/securityFn.js +30 -0
- package/parser/functions/storage/register.js +44 -0
- package/parser/functions/storage/storageCreateAttachmentFn.js +25 -0
- package/parser/functions/storage/storageCreateAttachmentFn.spec.js +87 -0
- package/parser/functions/storage/storageCreateAudioFn.js +29 -0
- package/parser/functions/storage/storageCreateAudioFn.spec.js +98 -0
- package/parser/functions/storage/storageCreateFileResourceFn.js +19 -0
- package/parser/functions/storage/storageCreateFileResourceFn.spec.js +72 -0
- package/parser/functions/storage/storageCreateImageFn.js +25 -0
- package/parser/functions/storage/storageCreateImageFn.spec.js +98 -0
- package/parser/functions/storage/storageCreateVideoFn.js +29 -0
- package/parser/functions/storage/storageCreateVideoFn.spec.js +99 -0
- package/parser/functions/storage/storageDeleteFileFn.js +17 -0
- package/parser/functions/storage/storageDeleteFileFn.spec.js +67 -0
- package/parser/functions/storage/storageReadFileResourceFn.js +19 -0
- package/parser/functions/storage/storageReadFileResourceFn.spec.js +60 -0
- package/parser/functions/storage/storageSignPrivateUrlFn.js +19 -0
- package/parser/functions/storage/storageSignPrivateUrlFn.spec.js +72 -0
- package/parser/functions/storageFn.js +24 -0
- package/parser/functions/stream/register.js +13 -0
- package/parser/functions/stream/streamFromCsvFn.js +20 -0
- package/parser/functions/stream/streamFromCsvFn.spec.js +69 -0
- package/parser/functions/stream/streamFromJsonlFn.js +21 -0
- package/parser/functions/stream/streamFromJsonlFn.spec.js +47 -0
- package/parser/functions/stream/streamFromRequestFn.js +50 -0
- package/parser/functions/stream/streamFromRequestFn.spec.js +103 -0
- package/parser/functions/streamFn.js +19 -0
- package/parser/functions/text/allTextWithReturnValueFn.js +36 -0
- package/parser/functions/text/allTextWithReturnValueFn.spec.js +100 -0
- package/parser/functions/text/allTextWithoutReturnValueFn.js +34 -0
- package/parser/functions/text/allTextWithoutReturnValueFn.spec.js +122 -0
- package/parser/functions/text/register.js +17 -0
- package/parser/functions/textFn.js +33 -0
- package/parser/functions/toolCallFn.js +40 -0
- package/parser/functions/toolCallFn.spec.js +28 -0
- package/parser/functions/unitExpectFn.js +20 -0
- package/parser/functions/unitExpectFn.spec.js +21 -0
- package/parser/functions/util/register.js +29 -0
- package/parser/functions/util/utilGeoDistanceFn.js +30 -0
- package/parser/functions/util/utilGeoDistanceFn.spec.js +79 -0
- package/parser/functions/util/utilGetAllInputFn.js +20 -0
- package/parser/functions/util/utilGetAllInputFn.spec.js +33 -0
- package/parser/functions/util/utilGetEnvFn.js +20 -0
- package/parser/functions/util/utilGetEnvFn.spec.js +33 -0
- package/parser/functions/util/utilGetRawInputFn.js +25 -0
- package/parser/functions/util/utilGetRawInputFn.spec.js +55 -0
- package/parser/functions/util/utilGetVarsFn.js +20 -0
- package/parser/functions/util/utilGetVarsFn.spec.js +33 -0
- package/parser/functions/util/utilIpLookupFn.js +22 -0
- package/parser/functions/util/utilIpLookupFn.spec.js +37 -0
- package/parser/functions/util/utilPostProcessFn.js +43 -0
- package/parser/functions/util/utilPostProcessFn.spec.js +63 -0
- package/parser/functions/util/utilSendEmailFn.js +108 -0
- package/parser/functions/util/utilSendEmailFn.spec.js +62 -0
- package/parser/functions/util/utilSetHeaderFn.js +22 -0
- package/parser/functions/util/utilSetHeaderFn.spec.js +48 -0
- package/parser/functions/util/utilSleepFn.js +19 -0
- package/parser/functions/util/utilSleepFn.spec.js +44 -0
- package/parser/functions/util/utilTemplateFn.js +19 -0
- package/parser/functions/util/utilTemplateFn.spec.js +78 -0
- package/parser/functions/utilFn.js +39 -0
- package/parser/functions/varFn.js +51 -0
- package/parser/functions/varFn.spec.js +173 -0
- package/parser/functions/webflowFn.js +19 -0
- package/parser/functions/workflowExpectFn.js +20 -0
- package/parser/functions/zip/register.js +20 -0
- package/parser/functions/zip/zipAddToArchiveFn.js +31 -0
- package/parser/functions/zip/zipAddToArchiveFn.spec.js +78 -0
- package/parser/functions/zip/zipCreateArchiveFn.js +29 -0
- package/parser/functions/zip/zipCreateArchiveFn.spec.js +53 -0
- package/parser/functions/zip/zipDeleteFromArchiveFn.js +23 -0
- package/parser/functions/zip/zipDeleteFromArchiveFn.spec.js +69 -0
- package/parser/functions/zip/zipExtractFn.js +23 -0
- package/parser/functions/zip/zipExtractFn.spec.js +52 -0
- package/parser/functions/zip/zipViewContentsFn.js +24 -0
- package/parser/functions/zip/zipViewContentsFn.spec.js +52 -0
- package/parser/functions/zipFn.js +21 -0
- package/parser/generic/arrayOfObjectAttrReq.js +47 -0
- package/parser/generic/arrayOfObjectAttrReq.spec.js +254 -0
- package/parser/generic/arrayOfStringLiterals.js +45 -0
- package/parser/generic/arrayOfStringLiterals.spec.js +56 -0
- package/parser/generic/arrayWithValues.js +35 -0
- package/parser/generic/arrayWithValues.spec.js +72 -0
- package/parser/generic/asVariable.js +23 -0
- package/parser/generic/asVariable.spec.js +37 -0
- package/parser/generic/assignableVariableAs.js +27 -0
- package/parser/generic/assignableVariableAs.spec.js +52 -0
- package/parser/generic/assignableVariableProperty.js +52 -0
- package/parser/generic/assignableVariableProperty.spec.js +52 -0
- package/parser/generic/booleanValue.js +22 -0
- package/parser/generic/bracketAccessor.js +53 -0
- package/parser/generic/castedValue.js +14 -0
- package/parser/generic/castedValue.spec.js +29 -0
- package/parser/generic/chainedIdentifier.js +48 -0
- package/parser/generic/chainedIdentifier.spec.js +89 -0
- package/parser/generic/completeAuthVariable.js +13 -0
- package/parser/generic/completeAuthVariable.spec.js +23 -0
- package/parser/generic/completeEnvVariable.js +79 -0
- package/parser/generic/completeEnvVariable.spec.js +94 -0
- package/parser/generic/completeErrorVariable.js +39 -0
- package/parser/generic/completeErrorVariable.spec.js +17 -0
- package/parser/generic/completeInputVariable.js +42 -0
- package/parser/generic/completeInputVariable.spec.js +53 -0
- package/parser/generic/enumValue.js +23 -0
- package/parser/generic/expressionFn.js +415 -0
- package/parser/generic/expressionFn.spec.js +588 -0
- package/parser/generic/filterFn.js +48 -0
- package/parser/generic/filterFn.spec.js +47 -0
- package/parser/generic/filterNames.js +381 -0
- package/parser/generic/functionAttrReq.js +279 -0
- package/parser/generic/functionAttrReq.spec.js +353 -0
- package/parser/generic/longFormVariable.js +46 -0
- package/parser/generic/longFormVariable.spec.js +25 -0
- package/parser/generic/minimalFnBody.js +24 -0
- package/parser/generic/minimalFnBody.spec.js +47 -0
- package/parser/generic/mockAttribute.js +21 -0
- package/parser/generic/mockAttribute.spec.js +57 -0
- package/parser/generic/multilineFilterFn.js +27 -0
- package/parser/generic/multilineFilterFn.spec.js +51 -0
- package/parser/generic/numberValue.js +27 -0
- package/parser/generic/objectAttrReq.js +243 -0
- package/parser/generic/objectAttrReq.spec.js +412 -0
- package/parser/generic/objectWithAttributes.js +74 -0
- package/parser/generic/objectWithAttributes.spec.js +147 -0
- package/parser/generic/optionalCommentBlock.js +32 -0
- package/parser/generic/pipedFilter.js +20 -0
- package/parser/generic/register.js +124 -0
- package/parser/generic/requiredValueFnBody.js +40 -0
- package/parser/generic/requiredValueFnBody.spec.js +56 -0
- package/parser/generic/shortFormVariable.js +17 -0
- package/parser/generic/shortFormVariable.spec.js +27 -0
- package/parser/generic/stringArray.js +33 -0
- package/parser/generic/stringArray.spec.js +55 -0
- package/parser/generic/tagsAttribute.js +14 -0
- package/parser/generic/tagsAttribute.spec.js +47 -0
- package/parser/generic/utils.js +14 -0
- package/parser/generic/valueExpressionForResponse.js +51 -0
- package/parser/generic/variableOnly.js +13 -0
- package/parser/generic/variableOnly.spec.js +47 -0
- package/parser/mcp_server_parser.js +130 -0
- package/parser/mcp_server_parser.spec.js +478 -0
- package/parser/mcp_server_trigger_parser.js +142 -0
- package/parser/mcp_server_trigger_parser.spec.js +396 -0
- package/parser/metadata/columnMetadataDefinition.js +32 -0
- package/parser/metadata/columnMetadataDefinition.spec.js +47 -0
- package/parser/metadata/enumColumnMetadataDefinition.js +46 -0
- package/parser/metadata/enumColumnMetadataDefinition.spec.js +59 -0
- package/parser/metadata/objectColumnMetadataDefinition.js +26 -0
- package/parser/metadata/register.js +22 -0
- package/parser/middleware_parser.js +137 -0
- package/parser/middleware_parser.spec.js +203 -0
- package/parser/parser.js +87 -0
- package/parser/query_parser.js +183 -0
- package/parser/query_parser.spec.js +141 -0
- package/parser/realtime_channel_parser.js +45 -0
- package/parser/realtime_channel_parser.spec.js +20 -0
- package/parser/realtime_trigger_parser.js +141 -0
- package/parser/realtime_trigger_parser.spec.js +469 -0
- package/parser/register.js +88 -0
- package/parser/table_parser.js +126 -0
- package/parser/table_parser.spec.js +138 -0
- package/parser/table_trigger_parser.js +144 -0
- package/parser/table_trigger_parser.spec.js +449 -0
- package/parser/task_parser.js +116 -0
- package/parser/task_parser.spec.js +83 -0
- package/parser/test_parser.js +39 -0
- package/parser/tests/agent/agent_parser.spec.js +52 -0
- package/parser/tests/agent/valid_sources/customer_servier_agent.xs +45 -0
- package/parser/tests/api_group/api_group_parser.spec.js +52 -0
- package/parser/tests/api_group/valid_sources/api_group_history.xs +4 -0
- package/parser/tests/api_group/valid_sources/basic_api_group.xs +3 -0
- package/parser/tests/api_group/valid_sources/complete_api_group.xs +7 -0
- package/parser/tests/api_group/valid_sources/protected_api_group.xs +7 -0
- package/parser/tests/function/function_parser.spec.js +52 -0
- package/parser/tests/function/valid_sources/all_controls.xs +68 -0
- package/parser/tests/function/valid_sources/all_query_return_types.xs +227 -0
- package/parser/tests/function/valid_sources/all_storage.xs +45 -0
- package/parser/tests/function/valid_sources/discord_poll_send_to_slack.xs +133 -0
- package/parser/tests/function/valid_sources/expression_in_response.xs +22 -0
- package/parser/tests/function/valid_sources/filter_by_value.xs +55 -0
- package/parser/tests/function/valid_sources/filter_query.xs +82 -0
- package/parser/tests/function/valid_sources/large_regex.xs +13 -0
- package/parser/tests/function/valid_sources/ledash_ends_with.xs +90 -0
- package/parser/tests/function/valid_sources/multiline_description.xs +28 -0
- package/parser/tests/function/valid_sources/multiline_expr.xs +41 -0
- package/parser/tests/function/valid_sources/set_theory_fn.xs +129 -0
- package/parser/tests/function/valid_sources/simple_unit_test.xs +33 -0
- package/parser/tests/function/valid_sources/valid_officer.xs +57 -0
- package/parser/tests/function/valid_sources/webflow.xs +18 -0
- package/parser/tests/query/query_parser.spec.js +54 -0
- package/parser/tests/query/valid_sources/all_basics.xs +51 -0
- package/parser/tests/query/valid_sources/all_cloud.xs +141 -0
- package/parser/tests/query/valid_sources/all_db.xs +102 -0
- package/parser/tests/query/valid_sources/all_external_db.xs +43 -0
- package/parser/tests/query/valid_sources/all_keywords.xs +65 -0
- package/parser/tests/query/valid_sources/all_math.xs +53 -0
- package/parser/tests/query/valid_sources/all_object.xs +25 -0
- package/parser/tests/query/valid_sources/all_redis.xs +106 -0
- package/parser/tests/query/valid_sources/all_security.xs +105 -0
- package/parser/tests/query/valid_sources/all_stream.xs +69 -0
- package/parser/tests/query/valid_sources/all_text.xs +54 -0
- package/parser/tests/query/valid_sources/all_util.xs +66 -0
- package/parser/tests/query/valid_sources/all_zip.xs +39 -0
- package/parser/tests/query/valid_sources/arrays.xs +33 -0
- package/parser/tests/query/valid_sources/disabled_response.xs +27 -0
- package/parser/tests/query/valid_sources/multiline_lambda_GET.xs +50 -0
- package/parser/tests/query/valid_sources/mutliline_query.xs +140 -0
- package/parser/tests/query/valid_sources/patch_expression_multiline.xs +27 -0
- package/parser/tests/query/valid_sources/query_cache.xs +34 -0
- package/parser/tests/query/valid_sources/query_example.xs +43 -0
- package/parser/tests/query/valid_sources/query_mini.xs +11 -0
- package/parser/tests/query/valid_sources/query_rich_inputs.xs +32 -0
- package/parser/tests/query/valid_sources/simple_unit_test.xs +33 -0
- package/parser/tests/query/valid_sources/test_with_slashes.xs +22 -0
- package/parser/tests/query/valid_sources/with_unit_test.xs +97 -0
- package/parser/tests/table/table_parser.spec.js +52 -0
- package/parser/tests/table/valid_sources/account.xs +31 -0
- package/parser/tests/table/valid_sources/all_basic_columns.xs +44 -0
- package/parser/tests/table/valid_sources/basic_table.xs +15 -0
- package/parser/tests/table/valid_sources/empty_object.xs +17 -0
- package/parser/tests/table/valid_sources/empty_table.xs +3 -0
- package/parser/tests/table/valid_sources/multiline_index.xs +33 -0
- package/parser/tests/table/valid_sources/relation.xs +44 -0
- package/parser/tests/table/valid_sources/rich_columns.xs +28 -0
- package/parser/tests/table/valid_sources/table_with_comments.xs +17 -0
- package/parser/tests/table/valid_sources/table_with_search_index.xs +31 -0
- package/parser/tests/table/valid_sources/view_table.xs +62 -0
- package/parser/tests/task/task_parser.spec.js +53 -0
- package/parser/tests/task/valid_sources/active_event.xs +11 -0
- package/parser/tests/task/valid_sources/all_events.xs +17 -0
- package/parser/tests/task/valid_sources/daily_sales_report.xs +56 -0
- package/parser/tests/task/valid_sources/inactive_event.xs +11 -0
- package/parser/tests/workflow_test/valid_sources/basic_workflow_test.xs +13 -0
- package/parser/tests/workflow_test/workflow_test_parser.spec.js +52 -0
- package/parser/tool_parser.js +121 -0
- package/parser/tool_parser.spec.js +102 -0
- package/parser/workflow_test_parser.js +73 -0
- package/parser/workflow_test_parser.spec.js +71 -0
- package/parser/workspace_parser.js +38 -0
- package/parser/workspace_parser.spec.js +142 -0
- package/parser/workspace_trigger_parser.js +118 -0
- package/parser/workspace_trigger_parser.spec.js +332 -0
- package/profile-parser.js +214 -0
- package/server.js +59 -0
- package/toTmLanguage.js +75 -0
- package/utils.js +55 -0
- 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
|
+
[](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
package/documents.js
ADDED
|
@@ -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
|
+
}
|