@xano/xanoscript-language-server 11.12.2 → 12.0.0
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/onCheckError/onCheckError.js +35 -28
- 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/regexp.spec.js +0 -84
- 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 -87
- 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/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
|
@@ -1,329 +0,0 @@
|
|
|
1
|
-
import { expect } from "chai";
|
|
2
|
-
import { beforeEach, describe, it } from "mocha";
|
|
3
|
-
import { InputFilterMessageProvider } from "./InputFilterMessageProvider.js";
|
|
4
|
-
|
|
5
|
-
const testInputFiltersMd = `
|
|
6
|
-
# trim
|
|
7
|
-
Removes excess whitespace from the beginning and end of the entry.
|
|
8
|
-
|
|
9
|
-
# min
|
|
10
|
-
Enforces a minimum value or length for the entry.
|
|
11
|
-
|
|
12
|
-
# max
|
|
13
|
-
Enforces a maximum value or length for the entry.
|
|
14
|
-
|
|
15
|
-
# lower
|
|
16
|
-
Converts all characters to lowercase.
|
|
17
|
-
|
|
18
|
-
# upper
|
|
19
|
-
Converts all characters to uppercase.
|
|
20
|
-
`;
|
|
21
|
-
|
|
22
|
-
describe("InputFilterMessageProvider", () => {
|
|
23
|
-
let provider;
|
|
24
|
-
|
|
25
|
-
beforeEach(() => {
|
|
26
|
-
provider = new InputFilterMessageProvider(testInputFiltersMd);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
describe("parseFilters", () => {
|
|
30
|
-
it("should parse filter documentation correctly", () => {
|
|
31
|
-
expect(provider.__filterDoc["trim"]).to.equal(
|
|
32
|
-
"Removes excess whitespace from the beginning and end of the entry."
|
|
33
|
-
);
|
|
34
|
-
expect(provider.__filterDoc["min"]).to.equal(
|
|
35
|
-
"Enforces a minimum value or length for the entry."
|
|
36
|
-
);
|
|
37
|
-
expect(provider.__filterDoc["max"]).to.equal(
|
|
38
|
-
"Enforces a maximum value or length for the entry."
|
|
39
|
-
);
|
|
40
|
-
expect(provider.__filterDoc["lower"]).to.equal(
|
|
41
|
-
"Converts all characters to lowercase."
|
|
42
|
-
);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it("should have all expected filters", () => {
|
|
46
|
-
const filterNames = Object.keys(provider.__filterDoc);
|
|
47
|
-
expect(filterNames).to.include.members([
|
|
48
|
-
"trim",
|
|
49
|
-
"min",
|
|
50
|
-
"max",
|
|
51
|
-
"lower",
|
|
52
|
-
"upper",
|
|
53
|
-
]);
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
describe("findFilter", () => {
|
|
58
|
-
it("should find existing filters", () => {
|
|
59
|
-
const mockTokens = [{ tokenType: { name: "Identifier" }, image: "trim" }];
|
|
60
|
-
|
|
61
|
-
const result = provider.findFilter(0, mockTokens);
|
|
62
|
-
expect(result).to.equal("trim");
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it("should return null for non-existent filters", () => {
|
|
66
|
-
const mockTokens = [
|
|
67
|
-
{ tokenType: { name: "Identifier" }, image: "nonexistent" },
|
|
68
|
-
];
|
|
69
|
-
|
|
70
|
-
const result = provider.findFilter(0, mockTokens);
|
|
71
|
-
expect(result).to.be.null;
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it("should return null for non-identifier tokens", () => {
|
|
75
|
-
const mockTokens = [
|
|
76
|
-
{ tokenType: { name: "StringLiteral" }, image: "trim" },
|
|
77
|
-
];
|
|
78
|
-
|
|
79
|
-
const result = provider.findFilter(0, mockTokens);
|
|
80
|
-
expect(result).to.be.null;
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
describe("isMatch", () => {
|
|
85
|
-
it("should return false for index 0", () => {
|
|
86
|
-
const tokens = [{ image: "trim" }];
|
|
87
|
-
expect(provider.isMatch(0, tokens)).to.be.false;
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it("should return false when not after = or |", () => {
|
|
91
|
-
const tokens = [{ image: "something" }, { image: "trim" }];
|
|
92
|
-
expect(provider.isMatch(1, tokens)).to.be.false;
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it("should return true for filter after filters=", () => {
|
|
96
|
-
const tokens = [
|
|
97
|
-
{ image: "filters" },
|
|
98
|
-
{ image: "=" },
|
|
99
|
-
{ tokenType: { name: "Identifier" }, image: "trim" },
|
|
100
|
-
];
|
|
101
|
-
expect(provider.isMatch(2, tokens)).to.be.true;
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it("should return true for filter after pipe in filters context", () => {
|
|
105
|
-
const tokens = [
|
|
106
|
-
{ image: "filters" },
|
|
107
|
-
{ image: "=" },
|
|
108
|
-
{ tokenType: { name: "Identifier" }, image: "trim" },
|
|
109
|
-
{ image: "|" },
|
|
110
|
-
{ tokenType: { name: "Identifier" }, image: "upper" },
|
|
111
|
-
];
|
|
112
|
-
expect(provider.isMatch(4, tokens)).to.be.true;
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
it("should return false for filter after = without filters", () => {
|
|
116
|
-
const tokens = [
|
|
117
|
-
{ image: "value" },
|
|
118
|
-
{ image: "=" },
|
|
119
|
-
{ tokenType: { name: "Identifier" }, image: "trim" },
|
|
120
|
-
];
|
|
121
|
-
expect(provider.isMatch(2, tokens)).to.be.false;
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it("should return false for unknown filter", () => {
|
|
125
|
-
const tokens = [
|
|
126
|
-
{ image: "filters" },
|
|
127
|
-
{ image: "=" },
|
|
128
|
-
{ tokenType: { name: "Identifier" }, image: "unknown_filter" },
|
|
129
|
-
];
|
|
130
|
-
expect(provider.isMatch(2, tokens)).to.be.false;
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it("should stop searching at boundary tokens", () => {
|
|
134
|
-
const tokens = [
|
|
135
|
-
{ image: "filters" },
|
|
136
|
-
{ image: "=" },
|
|
137
|
-
{ image: "something" },
|
|
138
|
-
{ image: "{" },
|
|
139
|
-
{ image: "other" },
|
|
140
|
-
{ image: "=" },
|
|
141
|
-
{ tokenType: { name: "Identifier" }, image: "trim" },
|
|
142
|
-
];
|
|
143
|
-
expect(provider.isMatch(6, tokens)).to.be.false;
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
it("should handle complex filter chain", () => {
|
|
147
|
-
const tokens = [
|
|
148
|
-
{ image: "text" },
|
|
149
|
-
{ image: "name" },
|
|
150
|
-
{ image: "filters" },
|
|
151
|
-
{ image: "=" },
|
|
152
|
-
{
|
|
153
|
-
tokenType: { name: "trim token", LONGER_ALT: { name: "Identifier" } },
|
|
154
|
-
image: "trim",
|
|
155
|
-
},
|
|
156
|
-
{ image: "|" },
|
|
157
|
-
{ tokenType: { name: "Identifier" }, image: "upper" },
|
|
158
|
-
{ image: "|" },
|
|
159
|
-
{ tokenType: { name: "Identifier" }, image: "lower" },
|
|
160
|
-
];
|
|
161
|
-
expect(provider.isMatch(4, tokens)).to.be.true; // trim
|
|
162
|
-
expect(provider.isMatch(6, tokens)).to.be.true; // upper
|
|
163
|
-
expect(provider.isMatch(8, tokens)).to.be.true; // lower
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
describe("render", () => {
|
|
168
|
-
it("should return filter documentation when filter exists", () => {
|
|
169
|
-
const mockTokens = [{ tokenType: { name: "Identifier" }, image: "trim" }];
|
|
170
|
-
|
|
171
|
-
const result = provider.render(0, mockTokens);
|
|
172
|
-
expect(result).to.equal(
|
|
173
|
-
"Removes excess whitespace from the beginning and end of the entry."
|
|
174
|
-
);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it("should return undefined when filter doesn't exist", () => {
|
|
178
|
-
const mockTokens = [
|
|
179
|
-
{ tokenType: { name: "Identifier" }, image: "nonexistent" },
|
|
180
|
-
];
|
|
181
|
-
|
|
182
|
-
const result = provider.render(0, mockTokens);
|
|
183
|
-
expect(result).to.be.undefined;
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
describe("integration with real parser", () => {
|
|
188
|
-
it("should work with actual XanoScript parsing", async () => {
|
|
189
|
-
// Import the actual parser functions
|
|
190
|
-
const { lexDocument } = await import("../lexer/lexer.js");
|
|
191
|
-
const { xanoscriptParser } = await import("../parser/parser.js");
|
|
192
|
-
const { getSchemeFromContent } = await import("../utils.js");
|
|
193
|
-
|
|
194
|
-
const code = `table users {
|
|
195
|
-
text name filters=trim
|
|
196
|
-
email address filters=lower|trim
|
|
197
|
-
}`;
|
|
198
|
-
|
|
199
|
-
// Get the proper scheme
|
|
200
|
-
const scheme = getSchemeFromContent(code);
|
|
201
|
-
// console.log("Detected scheme:", scheme);
|
|
202
|
-
|
|
203
|
-
// Tokenize the document
|
|
204
|
-
const lexResult = lexDocument(code);
|
|
205
|
-
expect(lexResult.errors).to.have.length(0);
|
|
206
|
-
|
|
207
|
-
// Parse the XanoScript with the correct scheme
|
|
208
|
-
const parser = xanoscriptParser(code, scheme);
|
|
209
|
-
const tokens = lexResult.tokens;
|
|
210
|
-
|
|
211
|
-
// Find the token for "trim" after filters=
|
|
212
|
-
let trimTokenIndex = -1;
|
|
213
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
214
|
-
if (
|
|
215
|
-
tokens[i].image === "trim" &&
|
|
216
|
-
i > 0 &&
|
|
217
|
-
tokens[i - 1].image === "="
|
|
218
|
-
) {
|
|
219
|
-
trimTokenIndex = i;
|
|
220
|
-
break;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
expect(trimTokenIndex).to.be.greaterThan(-1);
|
|
225
|
-
|
|
226
|
-
// Test that the provider matches
|
|
227
|
-
// console.log("Parser sectionStack:", parser.sectionStack);
|
|
228
|
-
// console.log(
|
|
229
|
-
// "Token at index",
|
|
230
|
-
// trimTokenIndex,
|
|
231
|
-
// ":",
|
|
232
|
-
// tokens[trimTokenIndex]
|
|
233
|
-
// );
|
|
234
|
-
// console.log("Previous token:", tokens[trimTokenIndex - 1]);
|
|
235
|
-
|
|
236
|
-
const matches = provider.isMatch(trimTokenIndex, tokens, parser);
|
|
237
|
-
// console.log("Provider matches:", matches);
|
|
238
|
-
|
|
239
|
-
expect(matches).to.be.true;
|
|
240
|
-
|
|
241
|
-
// Test that it renders the correct documentation
|
|
242
|
-
const result = provider.render(trimTokenIndex, tokens, parser);
|
|
243
|
-
expect(result).to.equal(
|
|
244
|
-
"Removes excess whitespace from the beginning and end of the entry."
|
|
245
|
-
);
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
it("should NOT match filters in pipe expressions", async () => {
|
|
249
|
-
// Import the actual parser functions
|
|
250
|
-
const { lexDocument } = await import("../lexer/lexer.js");
|
|
251
|
-
const { xanoscriptParser } = await import("../parser/parser.js");
|
|
252
|
-
|
|
253
|
-
const code = `query test verb=GET {
|
|
254
|
-
stack {
|
|
255
|
-
var $result { value = $input.name|trim }
|
|
256
|
-
}
|
|
257
|
-
}`;
|
|
258
|
-
|
|
259
|
-
// Tokenize the document
|
|
260
|
-
const lexResult = lexDocument(code);
|
|
261
|
-
expect(lexResult.errors).to.have.length(0);
|
|
262
|
-
|
|
263
|
-
// Parse the XanoScript to ensure no syntax errors
|
|
264
|
-
xanoscriptParser("query", code);
|
|
265
|
-
const tokens = lexResult.tokens;
|
|
266
|
-
|
|
267
|
-
// Find the token for "trim" after |
|
|
268
|
-
let trimTokenIndex = -1;
|
|
269
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
270
|
-
if (
|
|
271
|
-
tokens[i].image === "trim" &&
|
|
272
|
-
i > 0 &&
|
|
273
|
-
tokens[i - 1].image === "|"
|
|
274
|
-
) {
|
|
275
|
-
trimTokenIndex = i;
|
|
276
|
-
break;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
expect(trimTokenIndex).to.be.greaterThan(-1);
|
|
281
|
-
|
|
282
|
-
// Test that the InputFilterMessageProvider does NOT match pipe expressions without filters= context
|
|
283
|
-
const matches = provider.isMatch(trimTokenIndex, tokens);
|
|
284
|
-
expect(matches).to.be.false;
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
it("should work with actual XanoScript parsing for input filters", async () => {
|
|
288
|
-
// Import the actual parser functions
|
|
289
|
-
const { lexDocument } = await import("../lexer/lexer.js");
|
|
290
|
-
const { xanoscriptParser } = await import("../parser/parser.js");
|
|
291
|
-
|
|
292
|
-
const code = `table users {
|
|
293
|
-
text name filters=trim|upper
|
|
294
|
-
}`;
|
|
295
|
-
|
|
296
|
-
// Tokenize the document
|
|
297
|
-
const lexResult = lexDocument(code);
|
|
298
|
-
expect(lexResult.errors).to.have.length(0);
|
|
299
|
-
|
|
300
|
-
// Parse the XanoScript to ensure no syntax errors
|
|
301
|
-
xanoscriptParser("table", code);
|
|
302
|
-
const tokens = lexResult.tokens;
|
|
303
|
-
|
|
304
|
-
// Find the token for "trim" after filters=
|
|
305
|
-
let trimTokenIndex = -1;
|
|
306
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
307
|
-
if (
|
|
308
|
-
tokens[i].image === "trim" &&
|
|
309
|
-
i > 0 &&
|
|
310
|
-
tokens[i - 1].image === "="
|
|
311
|
-
) {
|
|
312
|
-
trimTokenIndex = i;
|
|
313
|
-
break;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
expect(trimTokenIndex).to.be.greaterThan(-1);
|
|
318
|
-
|
|
319
|
-
// Test that the InputFilterMessageProvider matches input filters
|
|
320
|
-
const matches = provider.isMatch(trimTokenIndex, tokens);
|
|
321
|
-
expect(matches).to.be.true;
|
|
322
|
-
|
|
323
|
-
// Test the render method
|
|
324
|
-
const result = provider.render(trimTokenIndex, tokens);
|
|
325
|
-
expect(result).to.not.be.undefined;
|
|
326
|
-
expect(result).to.include("whitespace");
|
|
327
|
-
});
|
|
328
|
-
});
|
|
329
|
-
});
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { expect } from "chai";
|
|
2
|
-
import { beforeEach, describe, it } from "mocha";
|
|
3
|
-
import { lexDocument } from "../lexer/lexer.js";
|
|
4
|
-
import { QueryFilterMessageProvider } from "./queryFilterMessageProvider.js";
|
|
5
|
-
|
|
6
|
-
const testQueryFiltersMd = `
|
|
7
|
-
# inner_product
|
|
8
|
-
Provides the inner product between two vectors.
|
|
9
|
-
|
|
10
|
-
\`\`\`xs
|
|
11
|
-
db.embedding.vector|inner_product:$input.query_vector
|
|
12
|
-
\`\`\`
|
|
13
|
-
|
|
14
|
-
Calculates the dot product between two numeric arrays.
|
|
15
|
-
|
|
16
|
-
# cosine_distance
|
|
17
|
-
Provides the cosine distance between two vectors.
|
|
18
|
-
|
|
19
|
-
\`\`\`xs
|
|
20
|
-
db.embedding.vector|cosine_distance:$input.query_vector
|
|
21
|
-
\`\`\`
|
|
22
|
-
|
|
23
|
-
Calculates the cosine distance (1 - cosine similarity) between two numeric arrays.
|
|
24
|
-
|
|
25
|
-
# distance
|
|
26
|
-
Provides the distance in meters between two geometries.
|
|
27
|
-
|
|
28
|
-
\`\`\`xs
|
|
29
|
-
db.location.geometry|distance:$input.target_geometry
|
|
30
|
-
\`\`\`
|
|
31
|
-
|
|
32
|
-
Returns the distance between two geometric objects in meters.
|
|
33
|
-
`;
|
|
34
|
-
|
|
35
|
-
describe("QueryFilterMessageProvider", () => {
|
|
36
|
-
let provider;
|
|
37
|
-
|
|
38
|
-
beforeEach(() => {
|
|
39
|
-
provider = new QueryFilterMessageProvider(testQueryFiltersMd);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
describe("parseFilters", () => {
|
|
43
|
-
it("should parse filter documentation correctly", () => {
|
|
44
|
-
expect(provider.__filterDoc["inner_product"]).to.equal(
|
|
45
|
-
"Provides the inner product between two vectors.\n\n```xs\ndb.embedding.vector|inner_product:$input.query_vector\n```\n\nCalculates the dot product between two numeric arrays."
|
|
46
|
-
);
|
|
47
|
-
expect(provider.__filterDoc["cosine_distance"]).to.equal(
|
|
48
|
-
"Provides the cosine distance between two vectors.\n\n```xs\ndb.embedding.vector|cosine_distance:$input.query_vector\n```\n\nCalculates the cosine distance (1 - cosine similarity) between two numeric arrays."
|
|
49
|
-
);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it("should have all expected filters", () => {
|
|
53
|
-
const filterNames = Object.keys(provider.__filterDoc);
|
|
54
|
-
expect(filterNames).to.include.members([
|
|
55
|
-
"inner_product",
|
|
56
|
-
"cosine_distance",
|
|
57
|
-
"distance",
|
|
58
|
-
]);
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
describe("findFilter", () => {
|
|
63
|
-
it("should find existing filters", () => {
|
|
64
|
-
const tokens = lexDocument("inner_product").tokens;
|
|
65
|
-
const result = provider.findFilter(0, tokens);
|
|
66
|
-
expect(result).to.equal("inner_product");
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it("should return null for non-existent filters", () => {
|
|
70
|
-
const tokens = lexDocument("nonexistent_filter").tokens;
|
|
71
|
-
const result = provider.findFilter(0, tokens);
|
|
72
|
-
expect(result).to.be.null;
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it("should return null for non-identifier tokens", () => {
|
|
76
|
-
const tokens = lexDocument("=").tokens;
|
|
77
|
-
const result = provider.findFilter(0, tokens);
|
|
78
|
-
expect(result).to.be.null;
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
describe("isMatch", () => {
|
|
83
|
-
it("should match filters in search context after pipe", () => {
|
|
84
|
-
const code =
|
|
85
|
-
"query books { where = $db.embedding.vector|inner_product:$input.query_vector }";
|
|
86
|
-
const tokens = lexDocument(code).tokens;
|
|
87
|
-
|
|
88
|
-
// Find the index of 'inner_product' token
|
|
89
|
-
const innerProductIndex = tokens.findIndex(
|
|
90
|
-
(token) => token.image === "inner_product"
|
|
91
|
-
);
|
|
92
|
-
expect(innerProductIndex).to.be.greaterThan(-1);
|
|
93
|
-
|
|
94
|
-
const result = provider.isMatch(innerProductIndex, tokens);
|
|
95
|
-
expect(result).to.be.true;
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it("should not match filters outside search context", () => {
|
|
99
|
-
const code =
|
|
100
|
-
"query books { stack { var $result { value = inner_product } } }";
|
|
101
|
-
const tokens = lexDocument(code).tokens;
|
|
102
|
-
|
|
103
|
-
// Find the index of 'inner_product' token
|
|
104
|
-
const innerProductIndex = tokens.findIndex(
|
|
105
|
-
(token) => token.image === "inner_product"
|
|
106
|
-
);
|
|
107
|
-
expect(innerProductIndex).to.be.greaterThan(-1);
|
|
108
|
-
|
|
109
|
-
const result = provider.isMatch(innerProductIndex, tokens);
|
|
110
|
-
expect(result).to.be.false;
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it("should not match when there's no pipe before the token", () => {
|
|
114
|
-
const code = "query books { where = $db.embedding.vector inner_product }";
|
|
115
|
-
const tokens = lexDocument(code).tokens;
|
|
116
|
-
|
|
117
|
-
// Find the index of 'inner_product' token
|
|
118
|
-
const innerProductIndex = tokens.findIndex(
|
|
119
|
-
(token) => token.image === "inner_product"
|
|
120
|
-
);
|
|
121
|
-
expect(innerProductIndex).to.be.greaterThan(-1);
|
|
122
|
-
|
|
123
|
-
const result = provider.isMatch(innerProductIndex, tokens);
|
|
124
|
-
expect(result).to.be.false;
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
it("should not match at index 0", () => {
|
|
128
|
-
const tokens = lexDocument("inner_product").tokens;
|
|
129
|
-
const result = provider.isMatch(0, tokens);
|
|
130
|
-
expect(result).to.be.false;
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
it("should handle complex search expressions", () => {
|
|
134
|
-
const code =
|
|
135
|
-
"query books { where = $db.embedding.vector|cosine_distance:$input.query_vector } as $matched_books";
|
|
136
|
-
const tokens = lexDocument(code).tokens;
|
|
137
|
-
|
|
138
|
-
// Find the index of 'cosine_distance' token
|
|
139
|
-
const cosineDistanceIndex = tokens.findIndex(
|
|
140
|
-
(token) => token.image === "cosine_distance"
|
|
141
|
-
);
|
|
142
|
-
expect(cosineDistanceIndex).to.be.greaterThan(-1);
|
|
143
|
-
|
|
144
|
-
const result = provider.isMatch(cosineDistanceIndex, tokens);
|
|
145
|
-
expect(result).to.be.true;
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
describe("render", () => {
|
|
150
|
-
it("should render documentation for existing filters", () => {
|
|
151
|
-
const tokens = lexDocument("inner_product").tokens;
|
|
152
|
-
const result = provider.render(0, tokens);
|
|
153
|
-
expect(result).to.include(
|
|
154
|
-
"Provides the inner product between two vectors"
|
|
155
|
-
);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it("should return undefined for non-matching tokens", () => {
|
|
159
|
-
const tokens = lexDocument("nonexistent_filter").tokens;
|
|
160
|
-
const result = provider.render(0, tokens);
|
|
161
|
-
expect(result).to.be.undefined;
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
});
|