@xano/xanoscript-language-server 11.12.1 → 11.12.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lexer/tokens.js +22 -3
- package/package.json +25 -1
- package/.claude/memory/feedback_no_git.md +0 -11
- package/.claude/settings.local.json +0 -21
- package/.github/copilot-instructions.md +0 -190
- package/.github/workflows/ci.yml +0 -31
- package/.husky/pre-commit +0 -1
- package/CLAUDE.md +0 -256
- package/eslint.config.js +0 -24
- package/lexer/comment.spec.js +0 -77
- package/lexer/multiline.spec.js +0 -179
- package/lexer/tests/query/query_lexer.spec.js +0 -36
- package/lexer/tests/query/valid_sources/basic_query.xs +0 -44
- package/lexer/tests/query/valid_sources/db_query.xs +0 -77
- package/lexer/tests/query/valid_sources/empty_query.xs +0 -5
- package/lexer/tests/query/valid_sources/header_query.xs +0 -15
- package/lexer/tests/table/basic_table.xs +0 -17
- package/lexer/tests/table/empty_table.xs +0 -3
- package/lexer/tests/table/table_lexer.spec.js +0 -324
- package/lexer/utils.spec.js +0 -61
- package/onCompletion/contentAssist.spec.js +0 -275
- package/onDefinition/onDefinition.spec.js +0 -313
- package/onHover/FilterMessageProvider.spec.js +0 -85
- package/onHover/FunctionMessageProvider.spec.js +0 -128
- package/onHover/InputFilterMessageProvider.spec.js +0 -329
- package/onHover/QueryFilterMessageProvider.spec.js +0 -164
- package/onHover/onHoverDocument.spec.js +0 -660
- package/parser/addon_parser.spec.js +0 -88
- package/parser/agent_parser.spec.js +0 -599
- package/parser/agent_trigger_parser.spec.js +0 -525
- package/parser/api_group_parser.spec.js +0 -137
- package/parser/attributes/columnDefaultValueAttribute.spec.js +0 -49
- package/parser/attributes/descriptionFieldAttribute.spec.js +0 -39
- package/parser/attributes/disabledFieldAttribute.spec.js +0 -34
- package/parser/attributes/docsFieldAttribute.spec.js +0 -44
- package/parser/attributes/guidFieldAttribute.spec.js +0 -93
- package/parser/attributes/inputFilterFn.spec.js +0 -39
- package/parser/attributes/sensitiveFieldAttribute.spec.js +0 -39
- package/parser/attributes/valueFieldAttribute.spec.js +0 -54
- package/parser/attributes/valuesFieldAttribute.spec.js +0 -44
- package/parser/attributes/visibilityFieldAttribute.spec.js +0 -44
- package/parser/branch_parser.spec.js +0 -34
- package/parser/clauses/agentClause.spec.js +0 -34
- package/parser/clauses/authClause.spec.js +0 -39
- package/parser/clauses/cacheClause.spec.js +0 -103
- package/parser/clauses/canonicalClause.spec.js +0 -34
- package/parser/clauses/channelClause.spec.js +0 -34
- package/parser/clauses/dbTableClause.spec.js +0 -34
- package/parser/clauses/historyClause.spec.js +0 -53
- package/parser/clauses/indexClause.spec.js +0 -47
- package/parser/clauses/inputClause.spec.js +0 -96
- package/parser/clauses/mcpServerClause.spec.js +0 -34
- package/parser/clauses/middlewareClause.spec.js +0 -161
- package/parser/clauses/nakedStackFn.spec.js +0 -73
- package/parser/clauses/responseClause.spec.js +0 -47
- package/parser/clauses/scheduleClause.spec.js +0 -71
- package/parser/clauses/schemaClause.spec.js +0 -102
- package/parser/clauses/testClause.spec.js +0 -69
- package/parser/clauses/viewClause.spec.js +0 -163
- package/parser/definitions/arraySlice.spec.js +0 -49
- package/parser/definitions/columnDefinition.spec.js +0 -199
- package/parser/definitions/dbLinkColumnDefinition.spec.js +0 -45
- package/parser/definitions/enumColumnDefinition.spec.js +0 -108
- package/parser/definitions/filterDefinition.spec.js +0 -43
- package/parser/definitions/objectColumnDefinition.spec.js +0 -118
- package/parser/function_parser.spec.js +0 -131
- package/parser/functions/actionCallFn.spec.js +0 -51
- package/parser/functions/addonCallFn.spec.js +0 -41
- package/parser/functions/ai/aiAgentRunFn.spec.js +0 -94
- package/parser/functions/ai/aiExternalMcpServerDetailsFn.spec.js +0 -85
- package/parser/functions/ai/aiExternalMcpToolListFn.spec.js +0 -85
- package/parser/functions/ai/aiExternalMcpToolRunFn.spec.js +0 -101
- package/parser/functions/aiFn.spec.js +0 -51
- package/parser/functions/api/apiCallFn.spec.js +0 -62
- package/parser/functions/api/apiLambdaFn.spec.js +0 -63
- package/parser/functions/api/apiRealtimeEventFn.spec.js +0 -82
- package/parser/functions/api/apiRequestFn.spec.js +0 -113
- package/parser/functions/api/apiStreamFn.spec.js +0 -44
- package/parser/functions/api/webflowRequestFn.spec.js +0 -114
- package/parser/functions/array/arrayDifferenceFn.spec.js +0 -34
- package/parser/functions/array/arrayFindFn.spec.js +0 -44
- package/parser/functions/array/arrayGroupByFn.spec.js +0 -41
- package/parser/functions/array/arrayIntersectionFn.spec.js +0 -22
- package/parser/functions/array/arrayMapFn.spec.js +0 -37
- package/parser/functions/array/arrayNoValueAs.spec.js +0 -56
- package/parser/functions/array/arrayPartitionFn.spec.js +0 -29
- package/parser/functions/array/arrayUnionFn.spec.js +0 -22
- package/parser/functions/array/arrayValueIfAs.spec.js +0 -54
- package/parser/functions/array/arrayValueOnly.spec.js +0 -61
- package/parser/functions/array/valueAttrOnly.spec.js +0 -61
- package/parser/functions/cloud/cloudAlgoliaRequestFn.spec.js +0 -30
- package/parser/functions/cloud/cloudAwsS3Fn.spec.js +0 -21
- package/parser/functions/cloud/cloudDeleteFileFn.spec.js +0 -25
- package/parser/functions/cloud/cloudGetFileInfoFn.spec.js +0 -25
- package/parser/functions/cloud/cloudListDirectoryFn.spec.js +0 -26
- package/parser/functions/cloud/cloudReadFileFn.spec.js +0 -25
- package/parser/functions/cloud/cloudSearchDocumentFn.spec.js +0 -28
- package/parser/functions/cloud/cloudSearchQueryFn.spec.js +0 -32
- package/parser/functions/cloud/cloudSearchRequestFn.spec.js +0 -32
- package/parser/functions/cloud/cloudSignUrlFn.spec.js +0 -26
- package/parser/functions/cloud/cloudStorageFn.spec.js +0 -21
- package/parser/functions/cloud/cloudUploadFileFn.spec.js +0 -29
- package/parser/functions/controls/awaitFn.spec.js +0 -48
- package/parser/functions/controls/conditionalFn.spec.js +0 -188
- package/parser/functions/controls/forEachFn.spec.js +0 -109
- package/parser/functions/controls/forFn.spec.js +0 -85
- package/parser/functions/controls/functionRunFn.spec.js +0 -77
- package/parser/functions/controls/groupFn.spec.js +0 -63
- package/parser/functions/controls/preconditionFn.spec.js +0 -107
- package/parser/functions/controls/returnFn.spec.js +0 -44
- package/parser/functions/controls/switchFn.spec.js +0 -118
- package/parser/functions/controls/throwFn.spec.js +0 -56
- package/parser/functions/controls/tryCatchFn.spec.js +0 -193
- package/parser/functions/controls/whileFn.spec.js +0 -94
- package/parser/functions/db/dbAddFn.spec.js +0 -72
- package/parser/functions/db/dbAddOrEditFn.spec.js +0 -97
- package/parser/functions/db/dbBulkAddFn.spec.js +0 -94
- package/parser/functions/db/dbBulkDeleteFn.spec.js +0 -28
- package/parser/functions/db/dbBulkPatchFn.spec.js +0 -42
- package/parser/functions/db/dbBulkUpdateFn.spec.js +0 -42
- package/parser/functions/db/dbDelFn.spec.js +0 -67
- package/parser/functions/db/dbDirectQueryFn.spec.js +0 -104
- package/parser/functions/db/dbEditFn.spec.js +0 -122
- package/parser/functions/db/dbExternalDirectQueryFn.spec.js +0 -103
- package/parser/functions/db/dbGetFn.spec.js +0 -117
- package/parser/functions/db/dbHasFn.spec.js +0 -62
- package/parser/functions/db/dbPatchFn.spec.js +0 -88
- package/parser/functions/db/dbQueryFn.spec.js +0 -380
- package/parser/functions/db/dbSchemaFn.spec.js +0 -42
- package/parser/functions/db/dbSetDatasourceFn.spec.js +0 -44
- package/parser/functions/db/dbTransactionFn.spec.js +0 -63
- package/parser/functions/db/dbTruncateFn.spec.js +0 -42
- package/parser/functions/debug/debugLogFn.spec.js +0 -44
- package/parser/functions/debug/debugStopFn.spec.js +0 -44
- package/parser/functions/expect/unitExpectToBeWithinFn.spec.js +0 -63
- package/parser/functions/expect/unitExpectToThrowFn.spec.js +0 -40
- package/parser/functions/expect/unitExpectWithArgumentsFn.spec.js +0 -355
- package/parser/functions/expect/unitExpectWithoutArgumentsFn.spec.js +0 -69
- package/parser/functions/expect/workflowExpectToBeWithinFn.spec.js +0 -70
- package/parser/functions/expect/workflowExpectToThrowFn.spec.js +0 -56
- package/parser/functions/expect/workflowExpectWithArgumentsFn.spec.js +0 -308
- package/parser/functions/expect/workflowExpectWithoutArgumentsFn.spec.js +0 -87
- package/parser/functions/math/allMathFn.spec.js +0 -100
- package/parser/functions/middlewareCallFn.spec.js +0 -44
- package/parser/functions/object/objectEntriesFn.spec.js +0 -44
- package/parser/functions/object/objectKeysFn.spec.js +0 -44
- package/parser/functions/object/objectValuesFn.spec.js +0 -44
- package/parser/functions/redis/redisCountFn.spec.js +0 -58
- package/parser/functions/redis/redisDecrFn.spec.js +0 -47
- package/parser/functions/redis/redisDelFn.spec.js +0 -58
- package/parser/functions/redis/redisGetFn.spec.js +0 -67
- package/parser/functions/redis/redisHasFn.spec.js +0 -58
- package/parser/functions/redis/redisIncrFn.spec.js +0 -74
- package/parser/functions/redis/redisKeysFn.spec.js +0 -67
- package/parser/functions/redis/redisPopFn.spec.js +0 -75
- package/parser/functions/redis/redisPushFn.spec.js +0 -71
- package/parser/functions/redis/redisRangeFn.spec.js +0 -80
- package/parser/functions/redis/redisRateLimitFn.spec.js +0 -87
- package/parser/functions/redis/redisRemoveFn.spec.js +0 -65
- package/parser/functions/redis/redisSetFn.spec.js +0 -89
- package/parser/functions/redis/redisShiftFn.spec.js +0 -75
- package/parser/functions/redis/redisUnshiftFn.spec.js +0 -73
- package/parser/functions/schema/schemaFn.spec.js +0 -92
- package/parser/functions/schema/schemaParseArrayFn.spec.js +0 -134
- package/parser/functions/schema/schemaParseAttributeFn.spec.js +0 -285
- package/parser/functions/schema/schemaParseConstantFn.spec.js +0 -122
- package/parser/functions/schema/schemaParseEnum.spec.js +0 -47
- package/parser/functions/schema/schemaParseImmutableFn.spec.js +0 -99
- package/parser/functions/schema/schemaParseObjectFn.spec.js +0 -223
- package/parser/functions/schema/utils.spec.js +0 -27
- package/parser/functions/security/securityCheckPasswordFn.spec.js +0 -22
- package/parser/functions/security/securityCreateAuthTokenFn.spec.js +0 -51
- package/parser/functions/security/securityCreateCurveKeyFn.spec.js +0 -22
- package/parser/functions/security/securityCreatePasswordFn.spec.js +0 -26
- package/parser/functions/security/securityCreateRsaKeyFn.spec.js +0 -22
- package/parser/functions/security/securityCreateSecretKeyFn.spec.js +0 -22
- package/parser/functions/security/securityCreateUuidFn.spec.js +0 -27
- package/parser/functions/security/securityDecryptFn.spec.js +0 -24
- package/parser/functions/security/securityEncryptFn.spec.js +0 -24
- package/parser/functions/security/securityJweDecodeFn.spec.js +0 -26
- package/parser/functions/security/securityJweDecodeLegacyFn.spec.js +0 -26
- package/parser/functions/security/securityJweEncodeFn.spec.js +0 -26
- package/parser/functions/security/securityJweEncodeLegacyFn.spec.js +0 -25
- package/parser/functions/security/securityJwsDecodeFn.spec.js +0 -25
- package/parser/functions/security/securityJwsEncodeFn.spec.js +0 -25
- package/parser/functions/security/securityRandomBytesFn.spec.js +0 -21
- package/parser/functions/security/securityRandomNumberFn.spec.js +0 -22
- package/parser/functions/storage/storageCreateAttachmentFn.spec.js +0 -87
- package/parser/functions/storage/storageCreateAudioFn.spec.js +0 -98
- package/parser/functions/storage/storageCreateFileResourceFn.spec.js +0 -72
- package/parser/functions/storage/storageCreateImageFn.spec.js +0 -98
- package/parser/functions/storage/storageCreateVideoFn.spec.js +0 -99
- package/parser/functions/storage/storageDeleteFileFn.spec.js +0 -67
- package/parser/functions/storage/storageReadFileResourceFn.spec.js +0 -60
- package/parser/functions/storage/storageSignPrivateUrlFn.spec.js +0 -72
- package/parser/functions/stream/streamFromCsvFn.spec.js +0 -69
- package/parser/functions/stream/streamFromJsonlFn.spec.js +0 -47
- package/parser/functions/stream/streamFromRequestFn.spec.js +0 -103
- package/parser/functions/text/allTextWithReturnValueFn.spec.js +0 -100
- package/parser/functions/text/allTextWithoutReturnValueFn.spec.js +0 -122
- package/parser/functions/toolCallFn.spec.js +0 -28
- package/parser/functions/triggerCallFn.spec.js +0 -51
- package/parser/functions/unitExpectFn.spec.js +0 -21
- package/parser/functions/util/utilGeoDistanceFn.spec.js +0 -79
- package/parser/functions/util/utilGetAllInputFn.spec.js +0 -33
- package/parser/functions/util/utilGetEnvFn.spec.js +0 -33
- package/parser/functions/util/utilGetRawInputFn.spec.js +0 -62
- package/parser/functions/util/utilGetVarsFn.spec.js +0 -33
- package/parser/functions/util/utilIpLookupFn.spec.js +0 -37
- package/parser/functions/util/utilPostProcessFn.spec.js +0 -63
- package/parser/functions/util/utilSendEmailFn.spec.js +0 -62
- package/parser/functions/util/utilSetHeaderFn.spec.js +0 -48
- package/parser/functions/util/utilSleepFn.spec.js +0 -44
- package/parser/functions/util/utilTemplateFn.spec.js +0 -78
- package/parser/functions/varFn.spec.js +0 -332
- package/parser/functions/workflowExpectFn.spec.js +0 -32
- package/parser/functions/zip/zipAddToArchiveFn.spec.js +0 -78
- package/parser/functions/zip/zipCreateArchiveFn.spec.js +0 -53
- package/parser/functions/zip/zipDeleteFromArchiveFn.spec.js +0 -69
- package/parser/functions/zip/zipExtractFn.spec.js +0 -52
- package/parser/functions/zip/zipViewContentsFn.spec.js +0 -52
- package/parser/generic/arrayWithValues.spec.js +0 -72
- package/parser/generic/asVariable.spec.js +0 -117
- package/parser/generic/assignableVariableAs.spec.js +0 -126
- package/parser/generic/assignableVariableProperty.spec.js +0 -138
- package/parser/generic/castedValue.spec.js +0 -29
- package/parser/generic/chainedIdentifier.spec.js +0 -89
- package/parser/generic/completeAuthVariable.spec.js +0 -23
- package/parser/generic/completeEnvVariable.spec.js +0 -99
- package/parser/generic/completeErrorVariable.spec.js +0 -17
- package/parser/generic/completeInputVariable.spec.js +0 -53
- package/parser/generic/expressionFn.spec.js +0 -605
- package/parser/generic/filterFn.spec.js +0 -47
- package/parser/generic/functionAttrReq.spec.js +0 -353
- package/parser/generic/longFormVariable.spec.js +0 -25
- package/parser/generic/minimalFnBody.spec.js +0 -47
- package/parser/generic/mockAttribute.spec.js +0 -57
- package/parser/generic/multilineFilterFn.spec.js +0 -51
- package/parser/generic/objectWithAttributes.spec.js +0 -147
- package/parser/generic/requiredValueFnBody.spec.js +0 -56
- package/parser/generic/shortFormVariable.spec.js +0 -27
- package/parser/generic/stringArray.spec.js +0 -55
- package/parser/generic/tagsAttribute.spec.js +0 -47
- package/parser/generic/variableOnly.spec.js +0 -47
- package/parser/mcp_server_parser.spec.js +0 -478
- package/parser/mcp_server_trigger_parser.spec.js +0 -396
- package/parser/metadata/columnMetadataDefinition.spec.js +0 -47
- package/parser/metadata/enumColumnMetadataDefinition.spec.js +0 -81
- package/parser/middleware_parser.spec.js +0 -230
- package/parser/multidoc.spec.js +0 -946
- package/parser/query_parser.spec.js +0 -202
- package/parser/realtime_channel_parser.spec.js +0 -20
- package/parser/realtime_trigger_parser.spec.js +0 -469
- package/parser/run_parser.spec.js +0 -100
- package/parser/table_parser.spec.js +0 -176
- package/parser/table_trigger_parser.spec.js +0 -478
- package/parser/task_parser.spec.js +0 -94
- package/parser/tests/agent/agent_parser.spec.js +0 -52
- package/parser/tests/agent/valid_sources/customer_servier_agent.xs +0 -45
- package/parser/tests/api_group/api_group_parser.spec.js +0 -52
- package/parser/tests/api_group/valid_sources/api_group_history.xs +0 -4
- package/parser/tests/api_group/valid_sources/basic_api_group.xs +0 -3
- package/parser/tests/api_group/valid_sources/complete_api_group.xs +0 -7
- package/parser/tests/api_group/valid_sources/protected_api_group.xs +0 -7
- package/parser/tests/function/function_parser.spec.js +0 -52
- package/parser/tests/function/valid_sources/all_controls.xs +0 -68
- package/parser/tests/function/valid_sources/all_query_return_types.xs +0 -227
- package/parser/tests/function/valid_sources/all_storage.xs +0 -45
- package/parser/tests/function/valid_sources/discord_poll_send_to_slack.xs +0 -133
- package/parser/tests/function/valid_sources/expression_in_response.xs +0 -22
- package/parser/tests/function/valid_sources/filter_by_value.xs +0 -55
- package/parser/tests/function/valid_sources/filter_query.xs +0 -82
- package/parser/tests/function/valid_sources/large_regex.xs +0 -13
- package/parser/tests/function/valid_sources/ledash_ends_with.xs +0 -90
- package/parser/tests/function/valid_sources/multiline_description.xs +0 -28
- package/parser/tests/function/valid_sources/multiline_expr.xs +0 -41
- package/parser/tests/function/valid_sources/set_theory_fn.xs +0 -129
- package/parser/tests/function/valid_sources/simple_unit_test.xs +0 -33
- package/parser/tests/function/valid_sources/valid_officer.xs +0 -57
- package/parser/tests/function/valid_sources/webflow.xs +0 -18
- package/parser/tests/multidoc/multidoc_parser.spec.js +0 -55
- package/parser/tests/multidoc/valid_sources/function_stack.xs +0 -130603
- package/parser/tests/query/query_parser.spec.js +0 -54
- package/parser/tests/query/valid_sources/all_basics.xs +0 -51
- package/parser/tests/query/valid_sources/all_cloud.xs +0 -141
- package/parser/tests/query/valid_sources/all_db.xs +0 -102
- package/parser/tests/query/valid_sources/all_external_db.xs +0 -43
- package/parser/tests/query/valid_sources/all_keywords.xs +0 -65
- package/parser/tests/query/valid_sources/all_math.xs +0 -53
- package/parser/tests/query/valid_sources/all_object.xs +0 -25
- package/parser/tests/query/valid_sources/all_redis.xs +0 -106
- package/parser/tests/query/valid_sources/all_security.xs +0 -105
- package/parser/tests/query/valid_sources/all_stream.xs +0 -69
- package/parser/tests/query/valid_sources/all_text.xs +0 -54
- package/parser/tests/query/valid_sources/all_util.xs +0 -66
- package/parser/tests/query/valid_sources/all_zip.xs +0 -39
- package/parser/tests/query/valid_sources/arrays.xs +0 -33
- package/parser/tests/query/valid_sources/disabled_response.xs +0 -27
- package/parser/tests/query/valid_sources/multiline_lambda_GET.xs +0 -50
- package/parser/tests/query/valid_sources/mutliline_query.xs +0 -140
- package/parser/tests/query/valid_sources/patch_expression_multiline.xs +0 -27
- package/parser/tests/query/valid_sources/query_cache.xs +0 -34
- package/parser/tests/query/valid_sources/query_example.xs +0 -43
- package/parser/tests/query/valid_sources/query_mini.xs +0 -11
- package/parser/tests/query/valid_sources/query_rich_inputs.xs +0 -32
- package/parser/tests/query/valid_sources/simple_unit_test.xs +0 -33
- package/parser/tests/query/valid_sources/test_with_slashes.xs +0 -22
- package/parser/tests/query/valid_sources/with_unit_test.xs +0 -97
- package/parser/tests/table/table_parser.spec.js +0 -52
- package/parser/tests/table/valid_sources/account.xs +0 -31
- package/parser/tests/table/valid_sources/all_basic_columns.xs +0 -44
- package/parser/tests/table/valid_sources/basic_table.xs +0 -15
- package/parser/tests/table/valid_sources/empty_object.xs +0 -17
- package/parser/tests/table/valid_sources/empty_table.xs +0 -3
- package/parser/tests/table/valid_sources/multiline_index.xs +0 -33
- package/parser/tests/table/valid_sources/relation.xs +0 -44
- package/parser/tests/table/valid_sources/rich_columns.xs +0 -31
- package/parser/tests/table/valid_sources/table_with_comments.xs +0 -17
- package/parser/tests/table/valid_sources/table_with_search_index.xs +0 -31
- package/parser/tests/table/valid_sources/view_table.xs +0 -62
- package/parser/tests/task/task_parser.spec.js +0 -53
- package/parser/tests/task/valid_sources/active_event.xs +0 -11
- package/parser/tests/task/valid_sources/all_events.xs +0 -17
- package/parser/tests/task/valid_sources/create_leak.xs +0 -165
- package/parser/tests/task/valid_sources/daily_sales_report.xs +0 -56
- package/parser/tests/task/valid_sources/inactive_event.xs +0 -11
- package/parser/tests/variable_test/coverage_check.xs +0 -293
- package/parser/tests/workflow_test/valid_sources/basic_workflow_test.xs +0 -13
- package/parser/tests/workflow_test/workflow_test_parser.spec.js +0 -52
- package/parser/tool_parser.spec.js +0 -115
- package/parser/variableValidator.spec.js +0 -179
- package/parser/workflow_test_parser.spec.js +0 -136
- package/parser/workspace_parser.spec.js +0 -142
- package/parser/workspace_trigger_parser.spec.js +0 -332
- package/toTmLanguage.js +0 -75
- package/utils.spec.js +0 -369
- package/workspace/crossFileValidator.spec.js +0 -654
- package/workspace/referenceTracking.spec.js +0 -420
- package/workspace/workspaceIndex.spec.js +0 -189
package/lexer/tokens.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Lexer } from "chevrotain";
|
|
1
|
+
import { createToken as chevrotainCreateToken, Lexer } from "chevrotain";
|
|
2
2
|
import { Identifier } from "./identifier.js";
|
|
3
3
|
import {
|
|
4
4
|
createTokenByName,
|
|
@@ -150,10 +150,29 @@ export const NullToken = createTokenByName("null", {
|
|
|
150
150
|
});
|
|
151
151
|
|
|
152
152
|
// regular expression (regexp) pattern
|
|
153
|
-
|
|
153
|
+
// A regexp literal only appears after a colon (e.g., filter:pattern:/[^abc]*/)
|
|
154
|
+
const regexpPattern = /\/(?:[^/\n\\ ]|\\.)(?:[^/\n\\]|\\.)*\//y;
|
|
155
|
+
function matchRegExp(text, startOffset, tokens) {
|
|
156
|
+
if (
|
|
157
|
+
tokens.length === 0 ||
|
|
158
|
+
tokens[tokens.length - 1].tokenType.name !== "ColonToken"
|
|
159
|
+
) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
regexpPattern.lastIndex = startOffset;
|
|
163
|
+
const result = regexpPattern.exec(text);
|
|
164
|
+
if (result) {
|
|
165
|
+
return [result[0]];
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export const RegExpToken = chevrotainCreateToken({
|
|
154
171
|
name: "RegExpToken",
|
|
155
172
|
label: "regexp",
|
|
156
|
-
pattern:
|
|
173
|
+
pattern: { exec: matchRegExp },
|
|
174
|
+
line_breaks: false,
|
|
175
|
+
start_chars_hint: ["/"],
|
|
157
176
|
});
|
|
158
177
|
|
|
159
178
|
export const WhiteSpace = createToken({
|
package/package.json
CHANGED
|
@@ -1,9 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xano/xanoscript-language-server",
|
|
3
|
-
"version": "11.12.
|
|
3
|
+
"version": "11.12.3",
|
|
4
4
|
"description": "Language Server Protocol implementation for XanoScript",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "server.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"server.js",
|
|
9
|
+
"connection.js",
|
|
10
|
+
"documents.js",
|
|
11
|
+
"utils.js",
|
|
12
|
+
"language-server-worker.js",
|
|
13
|
+
"logic-assistant-script.js",
|
|
14
|
+
"profile-parser.js",
|
|
15
|
+
"cache/",
|
|
16
|
+
"embedded/",
|
|
17
|
+
"lexer/**/*.js",
|
|
18
|
+
"onCheckError/",
|
|
19
|
+
"onCompletion/contentAssist.js",
|
|
20
|
+
"onCompletion/onCompletion.js",
|
|
21
|
+
"onDefinition/onDefinition.js",
|
|
22
|
+
"onDidChangeContent/",
|
|
23
|
+
"onHover/",
|
|
24
|
+
"onSemanticCheck/",
|
|
25
|
+
"parser/**/*.js",
|
|
26
|
+
"workspace/",
|
|
27
|
+
"!**/*.spec.js",
|
|
28
|
+
"!**/tests/",
|
|
29
|
+
"!**/valid_sources/"
|
|
30
|
+
],
|
|
7
31
|
"repository": {
|
|
8
32
|
"type": "git",
|
|
9
33
|
"url": "git+https://github.com/xano-labs/xs-language-server.git"
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: no-git-interactions
|
|
3
|
-
description: User does not want Claude to interact with git (no commits, no staging, no git commands)
|
|
4
|
-
type: feedback
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
Do not interact with git — no commits, no staging, no git commands. Focus purely on implementation and testing.
|
|
8
|
-
|
|
9
|
-
**Why:** User manages their own git workflow.
|
|
10
|
-
|
|
11
|
-
**How to apply:** Skip all git-related steps in plans. When dispatching subagents, explicitly tell them not to run any git commands. Remove commit steps from task instructions.
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"Bash(npm test:*)",
|
|
5
|
-
"Bash(git checkout:*)",
|
|
6
|
-
"Bash(ls:*)",
|
|
7
|
-
"Bash(npm run lint:*)",
|
|
8
|
-
"Bash(grep:*)",
|
|
9
|
-
"Bash(find:*)",
|
|
10
|
-
"Read(//tmp/**)",
|
|
11
|
-
"Bash(git stash:*)",
|
|
12
|
-
"Bash(do)",
|
|
13
|
-
"Bash(if ! grep -q \"guidFieldAttribute\" \"$f\")",
|
|
14
|
-
"Bash(then)",
|
|
15
|
-
"Bash(echo:*)",
|
|
16
|
-
"Bash(fi)",
|
|
17
|
-
"Bash(done)",
|
|
18
|
-
"Bash(npx eslint:*)"
|
|
19
|
-
]
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
# XanoScript Language Server - Copilot Instructions
|
|
2
|
-
|
|
3
|
-
## Repository Overview
|
|
4
|
-
|
|
5
|
-
This repository implements a Language Server Protocol (LSP) server for **XanoScript**, a domain-specific language used by Xano for defining API queries, functions, scheduled tasks, and data schemas. The language server provides VS Code with features like auto-completion, syntax highlighting, hover documentation, and real-time error checking.
|
|
6
|
-
|
|
7
|
-
**Key Facts:**
|
|
8
|
-
|
|
9
|
-
- **Size:** ~540 files, 35MB, 457 JavaScript files, 171 test files
|
|
10
|
-
- **Language:** JavaScript ES modules (Node.js 20+)
|
|
11
|
-
- **Framework:** Chevrotain parser generator + VS Code Language Server Protocol
|
|
12
|
-
- **Testing:** Mocha + Chai (1041 tests, comprehensive coverage)
|
|
13
|
-
- **Architecture:** Lexer → Parser → Language Server Features
|
|
14
|
-
|
|
15
|
-
## Build Instructions
|
|
16
|
-
|
|
17
|
-
### Dependencies and Setup
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
npm install # Install dependencies (~2s, always run before any other commands)
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
### Core Commands
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
npm run lint # ESLint validation (required for CI, ~1s)
|
|
27
|
-
npm test # Run all tests (1041 tests, ~45s, required for CI)
|
|
28
|
-
npm test -- -g "test name" # Run specific tests
|
|
29
|
-
npm run tm # Generate TextMate language definition (optional tool)
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Validation Sequence
|
|
33
|
-
|
|
34
|
-
Always run in this order for reliable builds:
|
|
35
|
-
|
|
36
|
-
1. `npm install` (always required first)
|
|
37
|
-
2. `npm run lint`
|
|
38
|
-
3. `npm test`
|
|
39
|
-
|
|
40
|
-
**Important:** Tests take ~45 seconds to complete. Set adequate timeouts (60+ seconds) for test commands. Clean installs work reliably and are fast after initial package download.
|
|
41
|
-
|
|
42
|
-
### Build Validation
|
|
43
|
-
|
|
44
|
-
- **No compilation step required** - pure JavaScript ES modules
|
|
45
|
-
- **Node.js 20+ required** (as specified in CI)
|
|
46
|
-
- **ES modules** - uses `import`/`export`, requires Node.js with proper module support
|
|
47
|
-
- **No build artifacts** - all source files are directly executed
|
|
48
|
-
|
|
49
|
-
### Common Issues & Workarounds
|
|
50
|
-
|
|
51
|
-
- **Test timeouts:** Use 60+ second timeouts for `npm test`
|
|
52
|
-
- **ES module errors:** Ensure Node.js 20+ with ES module support
|
|
53
|
-
- **Dependency conflicts:** Run `rm -rf node_modules && npm install` for clean state
|
|
54
|
-
- **3 low-severity npm audit warnings** are known and acceptable
|
|
55
|
-
|
|
56
|
-
## Project Layout & Architecture
|
|
57
|
-
|
|
58
|
-
### Core Directories
|
|
59
|
-
|
|
60
|
-
- **`lexer/`** - Token definitions for XanoScript language elements
|
|
61
|
-
|
|
62
|
-
- `tokens.js` - Main token registry and export
|
|
63
|
-
- `lexer.js` - Chevrotain lexer implementation
|
|
64
|
-
- Domain-specific tokens: `api.js`, `db.js`, `cloud.js`, `function.js`, etc.
|
|
65
|
-
- `utils.js` - Token creation utilities (`createToken`, `createTokenByName`)
|
|
66
|
-
|
|
67
|
-
- **`parser/`** - Grammar rules and parsing logic
|
|
68
|
-
|
|
69
|
-
- `base_parser.js` - Core XanoBaseParser extending Chevrotain
|
|
70
|
-
- `query_parser.js`, `function_parser.js`, `task_parser.js` - Main parsers
|
|
71
|
-
- `attributes/` - Field attributes (description, disabled, sensitive, etc.)
|
|
72
|
-
- `clauses/` - Language blocks (stack, input, response, security)
|
|
73
|
-
- `definitions/` - Type and column definitions
|
|
74
|
-
- `functions/` - Built-in function implementations organized by domain
|
|
75
|
-
- `generic/` - Reusable parsing components
|
|
76
|
-
|
|
77
|
-
- **Language Server Features**
|
|
78
|
-
- `server.js` - Main LSP server setup and capability registration
|
|
79
|
-
- `onCompletion/` - Auto-completion logic and content assist
|
|
80
|
-
- `onDidChangeContent/` - Live diagnostics and error reporting
|
|
81
|
-
- `onHover/` - Documentation and hover information providers
|
|
82
|
-
- `onSemanticCheck/` - Syntax highlighting token generation
|
|
83
|
-
|
|
84
|
-
### Configuration Files
|
|
85
|
-
|
|
86
|
-
- **`package.json`** - Dependencies, scripts, ES module configuration
|
|
87
|
-
- **`eslint.config.js`** - ESLint configuration (ES modules format)
|
|
88
|
-
- **`.github/workflows/ci.yml`** - GitHub Actions CI pipeline
|
|
89
|
-
- **`.gitignore`** - Standard Node.js exclusions
|
|
90
|
-
|
|
91
|
-
### XanoScript Language Structure
|
|
92
|
-
|
|
93
|
-
XanoScript defines these primary constructs:
|
|
94
|
-
|
|
95
|
-
- **`query`** - API endpoints with HTTP verbs, input validation, processing logic, responses
|
|
96
|
-
- **`function`** - Reusable logic blocks with testing capabilities
|
|
97
|
-
- **`task`** - Scheduled operations with cron-like triggers
|
|
98
|
-
- **`api_group`** - Collections of related API endpoints
|
|
99
|
-
- **`table`** - Database schema definitions with column types
|
|
100
|
-
|
|
101
|
-
**Core Language Patterns:**
|
|
102
|
-
|
|
103
|
-
```xs
|
|
104
|
-
query my_endpoint verb=GET {
|
|
105
|
-
input { text name filters=trim }
|
|
106
|
-
stack {
|
|
107
|
-
var $result { value = $input.name|upper }
|
|
108
|
-
db.add 123 { data = {name: $result} }
|
|
109
|
-
}
|
|
110
|
-
response = $result
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### Critical Development Patterns
|
|
115
|
-
|
|
116
|
-
**Token Creation** (in `lexer/` files):
|
|
117
|
-
|
|
118
|
-
```javascript
|
|
119
|
-
export const MyToken = createTokenByName("keyword", {
|
|
120
|
-
longer_alt: Identifier,
|
|
121
|
-
categories: [Identifier],
|
|
122
|
-
});
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
**Parser Rules** (in `parser/` files):
|
|
126
|
-
|
|
127
|
-
```javascript
|
|
128
|
-
myRule = this.RULE("myRule", () => {
|
|
129
|
-
this.CONSUME(MyToken);
|
|
130
|
-
this.SUBRULE(this.otherRule);
|
|
131
|
-
});
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
**Testing Pattern:**
|
|
135
|
-
|
|
136
|
-
```javascript
|
|
137
|
-
function parse(inputText) {
|
|
138
|
-
const lexResult = lexDocument(inputText);
|
|
139
|
-
const parser = new Parser();
|
|
140
|
-
parser.input = lexResult.tokens;
|
|
141
|
-
parser.myRule();
|
|
142
|
-
return parser;
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### Dependencies & Runtime
|
|
147
|
-
|
|
148
|
-
- **`chevrotain`** - Parser generator and runtime
|
|
149
|
-
- **`vscode-languageserver`** - LSP implementation
|
|
150
|
-
- **`lodash-es`** - Utility functions (ES module version)
|
|
151
|
-
- **`mocha`/`chai`** - Testing framework
|
|
152
|
-
- **Runtime:** Node.js 20+ (ES modules, required for CI compatibility)
|
|
153
|
-
|
|
154
|
-
### Testing Strategy
|
|
155
|
-
|
|
156
|
-
- **171 test files** using `.spec.js` naming convention
|
|
157
|
-
- **Test organization:** Mirror source structure (`lexer/` tests, `parser/` tests)
|
|
158
|
-
- **Example test files:** `lexer/tests/query/valid_sources/`, `parser/tests/function/valid_sources/`
|
|
159
|
-
- **Test data:** Real XanoScript files in `valid_sources/` directories
|
|
160
|
-
- **CI Integration:** All tests must pass for merge approval
|
|
161
|
-
|
|
162
|
-
### CI/CD Pipeline
|
|
163
|
-
|
|
164
|
-
**GitHub Actions** (`.github/workflows/ci.yml`):
|
|
165
|
-
|
|
166
|
-
1. Ubuntu latest, Node.js 20, npm cache enabled
|
|
167
|
-
2. `npm install`
|
|
168
|
-
3. `npm run lint`
|
|
169
|
-
4. `npm test`
|
|
170
|
-
|
|
171
|
-
**Pre-commit validation:** Lint and test failures block commits. Always run locally before pushing.
|
|
172
|
-
|
|
173
|
-
### Key Files Reference
|
|
174
|
-
|
|
175
|
-
- **Root:** `README.md`, `package.json`, `server.js` (main entry)
|
|
176
|
-
- **Core Logic:** `lexer/tokens.js`, `parser/base_parser.js`
|
|
177
|
-
- **Examples:** `lexer/tests/*/valid_sources/*.xs`, `parser/tests/*/valid_sources/*.xs`
|
|
178
|
-
- **Documentation:** `onHover/functions.md` (function documentation)
|
|
179
|
-
|
|
180
|
-
### Agent Guidelines
|
|
181
|
-
|
|
182
|
-
1. **Always run `npm install` before any build/test commands**
|
|
183
|
-
2. **Use 60+ second timeouts for `npm test`** (1041 tests take time)
|
|
184
|
-
3. **Follow existing patterns** - check similar files in same directory for conventions
|
|
185
|
-
4. **Test incrementally** - use `npm test -- -g "specific test"` during development
|
|
186
|
-
5. **Validate ES module syntax** - use `import`/`export`, not `require()`
|
|
187
|
-
6. **Check CI compatibility** - ensure changes work with Node.js 20
|
|
188
|
-
7. **Trust these instructions** - comprehensive testing validates all commands work correctly
|
|
189
|
-
|
|
190
|
-
This language server is production-ready with extensive testing. Focus on understanding the domain-specific language patterns and lexer/parser architecture when making changes.
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- main
|
|
7
|
-
pull_request:
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
xanoscript-language:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
|
|
13
|
-
steps:
|
|
14
|
-
- uses: actions/checkout@v4
|
|
15
|
-
- name: Use Node.js
|
|
16
|
-
uses: actions/setup-node@v4
|
|
17
|
-
with:
|
|
18
|
-
node-version: 20
|
|
19
|
-
cache: "npm"
|
|
20
|
-
|
|
21
|
-
- name: Install language dependencies
|
|
22
|
-
run: |
|
|
23
|
-
npm install
|
|
24
|
-
|
|
25
|
-
- name: Lint language server
|
|
26
|
-
run: |
|
|
27
|
-
npm run lint
|
|
28
|
-
|
|
29
|
-
- name: Test language server
|
|
30
|
-
run: |
|
|
31
|
-
npm test
|
package/.husky/pre-commit
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
npm run lint && npm test
|
package/CLAUDE.md
DELETED
|
@@ -1,256 +0,0 @@
|
|
|
1
|
-
# CLAUDE.md
|
|
2
|
-
|
|
3
|
-
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
-
|
|
5
|
-
## Commands
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
# Install dependencies (always run first, takes ~2s)
|
|
9
|
-
npm install
|
|
10
|
-
|
|
11
|
-
# Run tests (1041 tests, ~45s - required for CI)
|
|
12
|
-
npm test
|
|
13
|
-
|
|
14
|
-
# Run specific test
|
|
15
|
-
npm test -- -g "test name"
|
|
16
|
-
|
|
17
|
-
# Lint code (required for CI, ~1s)
|
|
18
|
-
npm run lint
|
|
19
|
-
|
|
20
|
-
# Generate TextMate language definition (optional)
|
|
21
|
-
npm run tm
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
**Important:** Tests take ~45 seconds. Set adequate timeouts (60+ seconds) for test commands.
|
|
25
|
-
|
|
26
|
-
## Architecture Overview
|
|
27
|
-
|
|
28
|
-
This is a Language Server Protocol (LSP) implementation for XanoScript, built on Chevrotain parser generator. The architecture follows: **Lexer → Parser → Language Server Features**.
|
|
29
|
-
|
|
30
|
-
### Core Components
|
|
31
|
-
|
|
32
|
-
**Lexer (`lexer/`)**: Token definitions and lexical analysis
|
|
33
|
-
|
|
34
|
-
- `tokens.js` - Main token registry
|
|
35
|
-
- `lexer.js` - Chevrotain lexer implementation
|
|
36
|
-
- Domain tokens: `api.js`, `db.js`, `cloud.js`, `function.js`, etc.
|
|
37
|
-
- `utils.js` - Token creation utilities (`createToken`, `createTokenByName`)
|
|
38
|
-
|
|
39
|
-
**Parser (`parser/`)**: Grammar rules and parsing logic
|
|
40
|
-
|
|
41
|
-
- `base_parser.js` - Core XanoBaseParser extending Chevrotain
|
|
42
|
-
- Main parsers: `query_parser.js`, `function_parser.js`, `task_parser.js`, `api_group_parser.js`, `table_parser.js`, `workflow_test_parser.js`, `table_trigger_parser.js`
|
|
43
|
-
- `attributes/` - Field attributes (description, disabled, sensitive)
|
|
44
|
-
- `clauses/` - Language blocks (stack, input, response, security, auth, cache, history, index, schema, test)
|
|
45
|
-
- `definitions/` - Type and column definitions
|
|
46
|
-
- `functions/` - Built-in functions organized by domain (api, array, cloud, controls, db, debug, expect, math, object, redis, time, util, variable)
|
|
47
|
-
- `generic/` - Reusable parsing components
|
|
48
|
-
|
|
49
|
-
**Language Server (`server.js` + feature directories)**:
|
|
50
|
-
|
|
51
|
-
- `onCompletion/` - Auto-completion logic
|
|
52
|
-
- `onDidChangeContent/` - Live diagnostics and error reporting
|
|
53
|
-
- `onHover/` - Documentation and hover information
|
|
54
|
-
- `onSemanticCheck/` - Syntax highlighting token generation
|
|
55
|
-
|
|
56
|
-
### XanoScript Object Types
|
|
57
|
-
|
|
58
|
-
Primary constructs parsed by dedicated parsers:
|
|
59
|
-
|
|
60
|
-
- **query** - API endpoints with HTTP verbs, input validation, processing logic, responses
|
|
61
|
-
- **function** - Reusable logic blocks with testing capabilities
|
|
62
|
-
- **task** - Scheduled operations with cron-like triggers
|
|
63
|
-
- **api_group** - Collections of related API endpoints
|
|
64
|
-
- **table** - Database schema definitions with column types
|
|
65
|
-
- **workflow_test** - Test definitions for workflows
|
|
66
|
-
- **table_trigger** - Database table trigger definitions
|
|
67
|
-
|
|
68
|
-
## Adding New Features
|
|
69
|
-
|
|
70
|
-
### New Top-Level Parser (e.g., `run.job`, `run.service`)
|
|
71
|
-
|
|
72
|
-
Follow this step-by-step process:
|
|
73
|
-
|
|
74
|
-
**1. Create lexer tokens (`lexer/my_feature.js`)**
|
|
75
|
-
|
|
76
|
-
```javascript
|
|
77
|
-
import { Identifier } from "./identifier.js";
|
|
78
|
-
import { createTokenByName } from "./utils.js";
|
|
79
|
-
|
|
80
|
-
export const MyToken = createTokenByName("my_keyword", {
|
|
81
|
-
longer_alt: Identifier,
|
|
82
|
-
categories: [Identifier],
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
export const MyFeatureTokens = [MyToken];
|
|
86
|
-
|
|
87
|
-
export function mapTokenToType(token) {
|
|
88
|
-
switch (token) {
|
|
89
|
-
case MyToken.name:
|
|
90
|
-
return "keyword";
|
|
91
|
-
default:
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
**2. Register tokens in `lexer/tokens.js`**
|
|
98
|
-
|
|
99
|
-
- Import tokens and mapper at the top
|
|
100
|
-
- Add `...MyFeatureTokens` to `allTokens` array
|
|
101
|
-
- Add `mapMyFeatureTokenToType` to `tokenMappers` array
|
|
102
|
-
|
|
103
|
-
**3. Create parser (`parser/my_feature_parser.js`)**
|
|
104
|
-
|
|
105
|
-
```javascript
|
|
106
|
-
import { StringLiteral } from "../lexer/literal.js";
|
|
107
|
-
import { MyToken } from "../lexer/my_feature.js";
|
|
108
|
-
import { Identifier, NewlineToken } from "../lexer/tokens.js";
|
|
109
|
-
|
|
110
|
-
export function myFeatureDeclaration($) {
|
|
111
|
-
return () => {
|
|
112
|
-
$.sectionStack.push("myFeatureDeclaration");
|
|
113
|
-
$.SUBRULE($.optionalCommentBlockFn);
|
|
114
|
-
|
|
115
|
-
const parent = $.CONSUME(MyToken);
|
|
116
|
-
$.OR([
|
|
117
|
-
{ ALT: () => $.CONSUME(StringLiteral) },
|
|
118
|
-
{ ALT: () => $.CONSUME(Identifier) },
|
|
119
|
-
]);
|
|
120
|
-
|
|
121
|
-
// Use schemaParseAttributeFn for body with declarative schema
|
|
122
|
-
$.SUBRULE($.schemaParseAttributeFn, {
|
|
123
|
-
ARGS: [
|
|
124
|
-
parent,
|
|
125
|
-
{
|
|
126
|
-
required_attr: "[string]",
|
|
127
|
-
"optional_attr?": "[boolean]",
|
|
128
|
-
"nested?": {
|
|
129
|
-
name: "[string]",
|
|
130
|
-
"value?": { "[string]": "[constant]" },
|
|
131
|
-
},
|
|
132
|
-
"array_of_strings?": ["[string]"],
|
|
133
|
-
},
|
|
134
|
-
],
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
$.MANY2(() => $.CONSUME2(NewlineToken));
|
|
138
|
-
$.sectionStack.pop();
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
**4. Register parser in `parser/register.js`**
|
|
144
|
-
|
|
145
|
-
```javascript
|
|
146
|
-
import { myFeatureDeclaration } from "./my_feature_parser.js";
|
|
147
|
-
// In register function:
|
|
148
|
-
$.myFeatureDeclaration = $.RULE(
|
|
149
|
-
"myFeatureDeclaration",
|
|
150
|
-
myFeatureDeclaration($)
|
|
151
|
-
);
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
**5. Add scheme detection in `utils.js`**
|
|
155
|
-
|
|
156
|
-
```javascript
|
|
157
|
-
const schemeByFirstWord = {
|
|
158
|
-
// ... existing entries
|
|
159
|
-
my_feature: "my_feature",
|
|
160
|
-
};
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
**6. Route scheme in `parser/parser.js`**
|
|
164
|
-
|
|
165
|
-
```javascript
|
|
166
|
-
case "my_feature":
|
|
167
|
-
parser.myFeatureDeclaration();
|
|
168
|
-
return parser;
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
**7. Write tests (`parser/my_feature_parser.spec.js`)**
|
|
172
|
-
|
|
173
|
-
```javascript
|
|
174
|
-
import { expect } from "chai";
|
|
175
|
-
import { describe, it } from "mocha";
|
|
176
|
-
import { xanoscriptParser } from "./parser.js";
|
|
177
|
-
|
|
178
|
-
describe("my_feature", () => {
|
|
179
|
-
it("should parse a basic my_feature", () => {
|
|
180
|
-
const parser = xanoscriptParser(`my_feature "name" {
|
|
181
|
-
required_attr = "value"
|
|
182
|
-
}`);
|
|
183
|
-
expect(parser.errors).to.be.empty;
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### Schema Definition Types (for `schemaParseAttributeFn`)
|
|
189
|
-
|
|
190
|
-
| Schema | Description | Example |
|
|
191
|
-
| ------------------------------ | ---------------------------------- | ------------------------- |
|
|
192
|
-
| `"[string]"` | String literal | `"hello"` |
|
|
193
|
-
| `"[number]"` | Number literal | `123` |
|
|
194
|
-
| `"[boolean]"` | Boolean value | `true` / `false` |
|
|
195
|
-
| `"[constant]"` | Value expression (no variables) | `"text"`, `123`, `{a: 1}` |
|
|
196
|
-
| `"[expression]"` | Any expression including variables | `$var`, `$input.name` |
|
|
197
|
-
| `["[string]"]` | Array of strings | `["a", "b"]` |
|
|
198
|
-
| `{ "[string]": "[constant]" }` | Object with string keys | `{key: "value"}` |
|
|
199
|
-
| `"attr?"` | Optional attribute | May be omitted |
|
|
200
|
-
| `"!attr"` | Can be disabled | `!attr = value` |
|
|
201
|
-
|
|
202
|
-
### New Keyword/Function
|
|
203
|
-
|
|
204
|
-
1. Add token definition in appropriate `lexer/` file
|
|
205
|
-
2. Create function implementation in `parser/functions/[domain]/`
|
|
206
|
-
3. Register in parent clause or parser
|
|
207
|
-
4. Add comprehensive tests in corresponding `.spec.js` file
|
|
208
|
-
|
|
209
|
-
### Token Creation Pattern
|
|
210
|
-
|
|
211
|
-
```javascript
|
|
212
|
-
export const MyToken = createTokenByName("keyword", {
|
|
213
|
-
longer_alt: Identifier,
|
|
214
|
-
categories: [Identifier],
|
|
215
|
-
});
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### Parser Rule Pattern
|
|
219
|
-
|
|
220
|
-
```javascript
|
|
221
|
-
myRule = this.RULE("myRule", () => {
|
|
222
|
-
this.CONSUME(MyToken);
|
|
223
|
-
this.SUBRULE(this.otherRule);
|
|
224
|
-
});
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
## Testing Guidelines
|
|
228
|
-
|
|
229
|
-
- Tests use Mocha + Chai framework
|
|
230
|
-
- 171 test files with `.spec.js` naming convention
|
|
231
|
-
- Test structure mirrors source structure
|
|
232
|
-
- Real XanoScript examples in `valid_sources/` directories
|
|
233
|
-
- Tests are explicit and straightforward - avoid dynamic test generation
|
|
234
|
-
- CI requires all tests to pass
|
|
235
|
-
|
|
236
|
-
### Test Pattern
|
|
237
|
-
|
|
238
|
-
```javascript
|
|
239
|
-
function parse(inputText) {
|
|
240
|
-
const lexResult = lexDocument(inputText);
|
|
241
|
-
const parser = new Parser();
|
|
242
|
-
parser.input = lexResult.tokens;
|
|
243
|
-
parser.myRule();
|
|
244
|
-
return parser;
|
|
245
|
-
}
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
## Development Notes
|
|
249
|
-
|
|
250
|
-
- **Node.js 20+ required** for ES module support
|
|
251
|
-
- **No compilation step** - pure JavaScript ES modules
|
|
252
|
-
- Use `import`/`export`, not `require()`
|
|
253
|
-
- Follow existing code conventions when adding features
|
|
254
|
-
- Check neighboring files for patterns and conventions
|
|
255
|
-
- Never assume a library is available - check `package.json` first
|
|
256
|
-
- 3 low-severity npm audit warnings are known and acceptable
|
package/eslint.config.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import pluginJs from "@eslint/js";
|
|
2
|
-
import simpleImportSort from "eslint-plugin-simple-import-sort";
|
|
3
|
-
import unusedImports from "eslint-plugin-unused-imports";
|
|
4
|
-
import globals from "globals";
|
|
5
|
-
|
|
6
|
-
/** @type {import('eslint').Linter.Config[]} */
|
|
7
|
-
export default [
|
|
8
|
-
{
|
|
9
|
-
languageOptions: { globals: globals.browser },
|
|
10
|
-
plugins: {
|
|
11
|
-
"simple-import-sort": simpleImportSort,
|
|
12
|
-
"unused-imports": unusedImports,
|
|
13
|
-
},
|
|
14
|
-
rules: {
|
|
15
|
-
"simple-import-sort/imports": ["error",
|
|
16
|
-
{
|
|
17
|
-
"groups": [["^\\u0000", "^node:", "^@?\\w", "^", "^\\."]]
|
|
18
|
-
}
|
|
19
|
-
],
|
|
20
|
-
"unused-imports/no-unused-imports": "error",
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
pluginJs.configs.recommended,
|
|
24
|
-
];
|
package/lexer/comment.spec.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { expect } from "chai";
|
|
2
|
-
import { describe, it } from "mocha";
|
|
3
|
-
import { CommentToken, CommentTokens } from "./comment.js";
|
|
4
|
-
import { lexDocument } from "./lexer.js";
|
|
5
|
-
|
|
6
|
-
describe("Comment Lexer", () => {
|
|
7
|
-
describe("CommentToken", () => {
|
|
8
|
-
it("should match a simple comment", () => {
|
|
9
|
-
const input = "// This is a comment";
|
|
10
|
-
const result = lexDocument(input);
|
|
11
|
-
|
|
12
|
-
expect(result.errors).to.be.empty;
|
|
13
|
-
expect(result.tokens).to.have.length(1);
|
|
14
|
-
expect(result.tokens[0].tokenType).to.equal(CommentToken);
|
|
15
|
-
expect(result.tokens[0].image).to.equal("// This is a comment");
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it("should match comment with special characters", () => {
|
|
19
|
-
const input = "// TODO: Fix this bug @user123!";
|
|
20
|
-
const result = lexDocument(input);
|
|
21
|
-
|
|
22
|
-
expect(result.errors).to.be.empty;
|
|
23
|
-
expect(result.tokens).to.have.length(1);
|
|
24
|
-
expect(result.tokens[0].tokenType).to.equal(CommentToken);
|
|
25
|
-
expect(result.tokens[0].image).to.equal(
|
|
26
|
-
"// TODO: Fix this bug @user123!"
|
|
27
|
-
);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it("should match empty comment", () => {
|
|
31
|
-
const input = "//";
|
|
32
|
-
const result = lexDocument(input);
|
|
33
|
-
|
|
34
|
-
expect(result.errors).to.be.empty;
|
|
35
|
-
expect(result.tokens).to.have.length(1);
|
|
36
|
-
expect(result.tokens[0].tokenType).to.equal(CommentToken);
|
|
37
|
-
expect(result.tokens[0].image).to.equal("//");
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it("should NOT match // in the middle of a line", () => {
|
|
41
|
-
const input = "some code // comment";
|
|
42
|
-
const result = lexDocument(input);
|
|
43
|
-
|
|
44
|
-
// Comments are only allowed on their own line (with optional leading whitespace)
|
|
45
|
-
// So // in the middle of a line should be tokenized as division operators
|
|
46
|
-
expect(result.errors).to.be.empty;
|
|
47
|
-
const commentTokens = result.tokens.filter(
|
|
48
|
-
(token) => token.tokenType === CommentToken
|
|
49
|
-
);
|
|
50
|
-
expect(commentTokens).to.have.length(0); // No comment token should be found
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("should handle multiple lines with comments", () => {
|
|
54
|
-
const input = `// First comment
|
|
55
|
-
// Second comment
|
|
56
|
-
some code
|
|
57
|
-
// Third comment`;
|
|
58
|
-
const result = lexDocument(input);
|
|
59
|
-
|
|
60
|
-
expect(result.errors).to.be.empty;
|
|
61
|
-
const commentTokens = result.tokens.filter(
|
|
62
|
-
(token) => token.tokenType === CommentToken
|
|
63
|
-
);
|
|
64
|
-
expect(commentTokens).to.have.length(3);
|
|
65
|
-
expect(commentTokens[0].image).to.equal("// First comment");
|
|
66
|
-
expect(commentTokens[1].image).to.equal("// Second comment");
|
|
67
|
-
expect(commentTokens[2].image).to.equal("// Third comment");
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
describe("CommentTokens export", () => {
|
|
72
|
-
it("should export CommentTokens array", () => {
|
|
73
|
-
expect(CommentTokens).to.be.an("array");
|
|
74
|
-
expect(CommentTokens).to.include(CommentToken);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
});
|