@witchcraft/expressit 0.2.2 → 0.3.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/README.md +1 -2
- package/dist/Lexer.d.ts +99 -94
- package/dist/Lexer.d.ts.map +1 -1
- package/dist/Lexer.js +211 -559
- package/dist/Parser.d.ts +26 -26
- package/dist/Parser.d.ts.map +1 -1
- package/dist/Parser.js +2 -1
- package/dist/ast/builders/condition.d.ts +1 -1
- package/dist/ast/builders/condition.d.ts.map +1 -1
- package/dist/ast/builders/condition.js +1 -0
- package/dist/ast/builders/delim.d.ts +2 -2
- package/dist/ast/builders/delim.d.ts.map +1 -1
- package/dist/ast/builders/error.d.ts +2 -2
- package/dist/ast/builders/error.d.ts.map +1 -1
- package/dist/ast/builders/expression.d.ts +2 -2
- package/dist/ast/builders/expression.d.ts.map +1 -1
- package/dist/ast/builders/expression.js +2 -6
- package/dist/ast/builders/group.d.ts +1 -1
- package/dist/ast/builders/group.d.ts.map +1 -1
- package/dist/ast/builders/group.js +1 -3
- package/dist/ast/builders/pos.d.ts +2 -2
- package/dist/ast/builders/pos.d.ts.map +1 -1
- package/dist/ast/builders/token.d.ts +2 -2
- package/dist/ast/builders/token.d.ts.map +1 -1
- package/dist/ast/builders/type.d.ts +2 -2
- package/dist/ast/builders/type.d.ts.map +1 -1
- package/dist/ast/builders/variable.d.ts +3 -3
- package/dist/ast/builders/variable.d.ts.map +1 -1
- package/dist/ast/createConditionNode.d.ts +1 -1
- package/dist/ast/createConditionNode.d.ts.map +1 -1
- package/dist/ast/createGroupNode.d.ts +1 -1
- package/dist/ast/createGroupNode.d.ts.map +1 -1
- package/dist/ast/createToken.d.ts +2 -2
- package/dist/ast/createToken.d.ts.map +1 -1
- package/dist/ast/createToken.js +2 -2
- package/dist/ast/error.d.ts +2 -2
- package/dist/ast/error.d.ts.map +1 -1
- package/dist/ast/error.js +1 -0
- package/dist/ast/handlers.d.ts +23 -23
- package/dist/ast/handlers.d.ts.map +1 -1
- package/dist/ast/handlers.js +1 -1
- package/dist/examples/ParserWithSqlSupport.d.ts +5 -5
- package/dist/examples/ParserWithSqlSupport.d.ts.map +1 -1
- package/dist/examples/ParserWithSqlSupport.js +2 -0
- package/dist/index.js +2 -2
- package/dist/internal/ExpressitError.d.ts +2 -2
- package/dist/internal/ExpressitError.d.ts.map +1 -1
- package/dist/internal/checkParserOpts.js +11 -11
- package/dist/package.json.js +2 -60
- package/dist/types/ast.d.ts +60 -58
- package/dist/types/ast.d.ts.map +1 -1
- package/dist/types/ast.js +26 -27
- package/dist/types/autocomplete.d.ts +23 -21
- package/dist/types/autocomplete.d.ts.map +1 -1
- package/dist/types/autocomplete.js +24 -21
- package/dist/types/errors.d.ts +12 -10
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +8 -7
- package/dist/types/index.js +2 -2
- package/dist/types/parser.d.ts +3 -3
- package/dist/types/parser.d.ts.map +1 -1
- package/dist/utils/getCursorInfo.js +2 -0
- package/dist/utils/getOppositeDelimiter.d.ts +2 -2
- package/dist/utils/getOppositeDelimiter.d.ts.map +1 -1
- package/dist/utils/isDelimiter.d.ts +2 -2
- package/dist/utils/isDelimiter.d.ts.map +1 -1
- package/dist/utils/isParen.d.ts +2 -2
- package/dist/utils/isParen.d.ts.map +1 -1
- package/dist/utils/isQuote.d.ts +2 -2
- package/dist/utils/isQuote.d.ts.map +1 -1
- package/package.json +13 -13
- package/src/Lexer.ts +98 -88
- package/src/Parser.ts +61 -61
- package/src/ast/builders/condition.ts +3 -3
- package/src/ast/builders/delim.ts +4 -4
- package/src/ast/builders/error.ts +3 -3
- package/src/ast/builders/expression.ts +4 -8
- package/src/ast/builders/group.ts +2 -4
- package/src/ast/builders/pos.ts +3 -3
- package/src/ast/builders/token.ts +2 -2
- package/src/ast/builders/type.ts +2 -2
- package/src/ast/builders/variable.ts +5 -5
- package/src/ast/createConditionNode.ts +2 -2
- package/src/ast/createGroupNode.ts +4 -4
- package/src/ast/createToken.ts +6 -6
- package/src/ast/error.ts +2 -2
- package/src/ast/handlers.ts +20 -20
- package/src/examples/ParserWithSqlSupport.ts +11 -5
- package/src/internal/ExpressitError.ts +3 -3
- package/src/internal/checkParserOpts.ts +11 -11
- package/src/types/ast.ts +101 -96
- package/src/types/autocomplete.ts +26 -22
- package/src/types/errors.ts +18 -13
- package/src/types/parser.ts +3 -3
- package/src/utils/getOppositeDelimiter.ts +2 -2
- package/src/utils/getSurroundingErrors.ts +4 -4
- package/src/utils/isDelimiter.ts +3 -3
- package/src/utils/isParen.ts +2 -2
- package/src/utils/isQuote.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../src/types/autocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAG9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,MAAM,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,qFAAqF;IACrF,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,sGAAsG;IACtG,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,4BAA4B;IAC5B,KAAK,EAAE;QACN,gCAAgC;QAChC,IAAI,CAAC,EAAE,UAAU,CAAA;QACjB,gCAAgC;QAChC,IAAI,CAAC,EAAE,UAAU,CAAA;KACjB,CAAA;IACD,+GAA+G;IAC/G,UAAU,EAAE;QACX,uGAAuG;QACvG,IAAI,EAAE,OAAO,CAAA;QACb,yGAAyG;QACzG,IAAI,EAAE,OAAO,CAAA;KACb,CAAA;CACD,CAAA;AAED,
|
|
1
|
+
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../src/types/autocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAGnD,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAG9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AACH,MAAM,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,EAAE,CAAC,EAAE,UAAU,CAAA;IACf,qFAAqF;IACrF,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,sGAAsG;IACtG,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,4BAA4B;IAC5B,KAAK,EAAE;QACN,gCAAgC;QAChC,IAAI,CAAC,EAAE,UAAU,CAAA;QACjB,gCAAgC;QAChC,IAAI,CAAC,EAAE,UAAU,CAAA;KACjB,CAAA;IACD,+GAA+G;IAC/G,UAAU,EAAE;QACX,uGAAuG;QACvG,IAAI,EAAE,OAAO,CAAA;QACb,yGAAyG;QACzG,IAAI,EAAE,OAAO,CAAA;KACb,CAAA;CACD,CAAA;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;CAqB1B,CAAA;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,eAAe,CAAC,CAAA;AAE7D;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,cAAc,CAAA;IACpB,gEAAgE;IAChE,KAAK,EAAE,QAAQ,CAAA;IACf,yBAAyB;IACzB,UAAU,EAAE,UAAU,CAAA;IACtB,yEAAyE;IACzE,QAAQ,EAAE;QACT;;;;WAIG;QACH,UAAU,EAAE;YACX,KAAK,EAAE,OAAO,CAAA;YACd,MAAM,EAAE,OAAO,CAAA;SACf,CAAA;QACD;;;;;;WAMG;QACH,KAAK,EAAE,OAAO,CAAA;QACd,6OAA6O;QAC7O,MAAM,EAAE,MAAM,GAAG,KAAK,CAAA;KACtB,CAAA;IACD;;OAEG;IACH,OAAO,EAAE,OAAO,CAAA;CAChB,CAAA;AAGD,MAAM,MAAM,UAAU,GAAG;IACxB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACb,CAAA"}
|
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
1
|
+
import "@alanscodelog/utils";
|
|
2
|
+
import { enumFromArray } from "@alanscodelog/utils/enumFromArray.js";
|
|
3
|
+
const SUGGESTION_TYPE = enumFromArray([
|
|
4
|
+
"VARIABLE",
|
|
5
|
+
"ARRAY_VALUE",
|
|
6
|
+
"VALUE",
|
|
7
|
+
"PREFIX",
|
|
8
|
+
"BOOLEAN_WORD_OP",
|
|
9
|
+
"BOOLEAN_SYMBOL_OP",
|
|
10
|
+
"BACKTICK",
|
|
11
|
+
"DOUBLEQUOTE",
|
|
12
|
+
"SINGLEQUOTE",
|
|
13
|
+
"PARENL",
|
|
14
|
+
"PARENR",
|
|
15
|
+
"PROPERTY",
|
|
16
|
+
"EXPANDED_PROPERTY_OPERATOR",
|
|
17
|
+
"CUSTOM_PROPERTY_OPERATOR",
|
|
18
|
+
"PROPERTY_SEP",
|
|
19
|
+
"BRAKCETR",
|
|
20
|
+
"REGEX",
|
|
21
|
+
"REGEX_FLAGS"
|
|
22
|
+
/** This is not an oversight, I haven't figured out a fast way to detect left bracket errors. */
|
|
23
|
+
// BRAKCETL = "BRAKCETL",
|
|
24
|
+
]);
|
|
22
25
|
export {
|
|
23
26
|
SUGGESTION_TYPE
|
|
24
27
|
};
|
package/dist/types/errors.d.ts
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
|
+
import { type EnumLike } from "@alanscodelog/utils";
|
|
1
2
|
import type { ParserOptions } from "./parser.js";
|
|
2
|
-
export declare
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
export type
|
|
8
|
-
export type
|
|
9
|
-
|
|
3
|
+
export declare const PARSER_ERROR: {
|
|
4
|
+
POSITION_ERROR: "PARSER.POSITION_ERROR";
|
|
5
|
+
CONFLICTING_OPTIONS_ERROR: "PARSER.CONFLICTING_OPTIONS_ERROR";
|
|
6
|
+
OPTION_REQUIRED_ERROR: "PARSER.OPTION_REQUIRED_ERROR";
|
|
7
|
+
};
|
|
8
|
+
export type ParserError = EnumLike<typeof PARSER_ERROR>;
|
|
9
|
+
export type ErrorInfo<T extends ParserError> = T extends ParserError ? ErrorCodesInfo[T] : never;
|
|
10
|
+
export type ErrorCodesInfo = {
|
|
11
|
+
[PARSER_ERROR.POSITION_ERROR]: {
|
|
10
12
|
start?: number;
|
|
11
13
|
end?: number;
|
|
12
14
|
};
|
|
13
|
-
[
|
|
15
|
+
[PARSER_ERROR.CONFLICTING_OPTIONS_ERROR]: {
|
|
14
16
|
prohibited: string[];
|
|
15
17
|
invalid: string;
|
|
16
18
|
};
|
|
17
|
-
[
|
|
19
|
+
[PARSER_ERROR.OPTION_REQUIRED_ERROR]: {
|
|
18
20
|
options?: (keyof ParserOptions)[];
|
|
19
21
|
requires: keyof ParserOptions;
|
|
20
22
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAGnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,eAAO,MAAM,YAAY;;;;CAIZ,CAAA;AAEb,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAAA;AAGvD,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,WAAW,IAC1C,CAAC,SAAS,WAAW,GACnB,cAAc,CAAC,CAAC,CAAC,GACjB,KAAK,CAAA;AAGR,MAAM,MAAM,cAAc,GAAG;IAC5B,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,GAAG,CAAC,EAAE,MAAM,CAAA;KACZ,CAAA;IACD,CAAC,YAAY,CAAC,yBAAyB,CAAC,EAAE;QACzC,UAAU,EAAE,MAAM,EAAE,CAAA;QACpB,OAAO,EAAE,MAAM,CAAA;KACf,CAAA;IACD,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE;QACrC,OAAO,CAAC,EAAE,CAAC,MAAM,aAAa,CAAC,EAAE,CAAA;QACjC,QAAQ,EAAE,MAAM,aAAa,CAAA;KAC7B,CAAA;CACD,CAAA"}
|
package/dist/types/errors.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import "@alanscodelog/utils";
|
|
2
|
+
import { enumFromArray } from "@alanscodelog/utils/enumFromArray.js";
|
|
3
|
+
const PARSER_ERROR = enumFromArray([
|
|
4
|
+
"POSITION_ERROR",
|
|
5
|
+
"CONFLICTING_OPTIONS_ERROR",
|
|
6
|
+
"OPTION_REQUIRED_ERROR"
|
|
7
|
+
], "PARSER.");
|
|
7
8
|
export {
|
|
8
|
-
|
|
9
|
+
PARSER_ERROR
|
|
9
10
|
};
|
package/dist/types/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { AST_TYPE, TOKEN_TYPE } from "./ast.js";
|
|
2
2
|
import { SUGGESTION_TYPE } from "./autocomplete.js";
|
|
3
|
-
import {
|
|
3
|
+
import { PARSER_ERROR } from "./errors.js";
|
|
4
4
|
export {
|
|
5
5
|
AST_TYPE,
|
|
6
|
-
|
|
6
|
+
PARSER_ERROR,
|
|
7
7
|
SUGGESTION_TYPE,
|
|
8
8
|
TOKEN_TYPE
|
|
9
9
|
};
|
package/dist/types/parser.d.ts
CHANGED
|
@@ -415,9 +415,9 @@ export type ValueQuery = {
|
|
|
415
415
|
/** {@link ParserOptions}["valueValidator"] */
|
|
416
416
|
export type ValidationQuery = Omit<ValueQuery, "value" | "operator" | "prefix" | "regexFlags" | "property"> & {
|
|
417
417
|
value?: VariableNode | ArrayNode;
|
|
418
|
-
operator?: ValidToken<TOKEN_TYPE.VALUE | TOKEN_TYPE.OP_CUSTOM>;
|
|
419
|
-
prefix?: ValidToken<TOKEN_TYPE.VALUE>;
|
|
420
|
-
regexFlags?: ValidToken<TOKEN_TYPE.VALUE>;
|
|
418
|
+
operator?: ValidToken<typeof TOKEN_TYPE.VALUE | typeof TOKEN_TYPE.OP_CUSTOM>;
|
|
419
|
+
prefix?: ValidToken<typeof TOKEN_TYPE.VALUE>;
|
|
420
|
+
regexFlags?: ValidToken<typeof TOKEN_TYPE.VALUE>;
|
|
421
421
|
property: VariableNode[];
|
|
422
422
|
/** The property as would be passed to the {@link ParserOptions}["valueComparer"] function (i.e. joined as a string using the {@link ParseOptions}["prefixApplier"] ) */
|
|
423
423
|
propertyName?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/types/parser.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/types/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { isArray } from "@alanscodelog/utils/isArray.js";
|
|
2
2
|
import { unreachable } from "@alanscodelog/utils/unreachable.js";
|
|
3
3
|
import { extractTokens } from "./extractTokens.js";
|
|
4
|
+
import "../types/ast.js";
|
|
5
|
+
import "../types/autocomplete.js";
|
|
4
6
|
function getCursorInfo(input, ast, index) {
|
|
5
7
|
const tokens = isArray(ast) ? ast : extractTokens(ast);
|
|
6
8
|
if (input.length < index || index < 0) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { generateParentsMap } from "./generateParentsMap.js";
|
|
2
|
-
import { type AnyToken, type
|
|
2
|
+
import { type AnyToken, type TokenDelimiter } from "../types/ast.js";
|
|
3
3
|
/**
|
|
4
4
|
* Given a delimiter token, returns it's opposite pair, or undefined if the type passed was not a delimiter token (so you can pass any type without checking).
|
|
5
5
|
*/
|
|
6
|
-
export declare function getOppositeDelimiter(token: AnyToken, parentsMap: ReturnType<typeof generateParentsMap>): AnyToken<
|
|
6
|
+
export declare function getOppositeDelimiter(token: AnyToken, parentsMap: ReturnType<typeof generateParentsMap>): AnyToken<TokenDelimiter> | undefined;
|
|
7
7
|
//# sourceMappingURL=getOppositeDelimiter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getOppositeDelimiter.d.ts","sourceRoot":"","sources":["../../src/utils/getOppositeDelimiter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAMjE,OAAO,EAAE,KAAK,QAAQ,EAAiE,KAAK,
|
|
1
|
+
{"version":3,"file":"getOppositeDelimiter.d.ts","sourceRoot":"","sources":["../../src/utils/getOppositeDelimiter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAMjE,OAAO,EAAE,KAAK,QAAQ,EAAiE,KAAK,cAAc,EAAqB,MAAM,iBAAiB,CAAA;AAEtJ;;GAEG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,QAAQ,EACf,UAAU,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,GAC/C,QAAQ,CAAC,cAAc,CAAC,GAAG,SAAS,CAuBtC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type AnyToken, type
|
|
1
|
+
import { type AnyToken, type TokenDelimiter } from "../types/ast.js";
|
|
2
2
|
/**
|
|
3
3
|
* Returns whether token is a delimiter type (including if it's an expanded operator separator).
|
|
4
4
|
*/
|
|
5
|
-
export declare function isDelimiter(token?: AnyToken): token is AnyToken<
|
|
5
|
+
export declare function isDelimiter(token?: AnyToken): token is AnyToken<TokenDelimiter>;
|
|
6
6
|
//# sourceMappingURL=isDelimiter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isDelimiter.d.ts","sourceRoot":"","sources":["../../src/utils/isDelimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,KAAK,
|
|
1
|
+
{"version":3,"file":"isDelimiter.d.ts","sourceRoot":"","sources":["../../src/utils/isDelimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhF;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAC,cAAc,CAAC,CAY/E"}
|
package/dist/utils/isParen.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { type AnyToken, type
|
|
2
|
-
export declare function isParen(token?: AnyToken): token is AnyToken<
|
|
1
|
+
import { type AnyToken, type TokenParen } from "../types/ast.js";
|
|
2
|
+
export declare function isParen(token?: AnyToken): token is AnyToken<TokenParen>;
|
|
3
3
|
//# sourceMappingURL=isParen.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isParen.d.ts","sourceRoot":"","sources":["../../src/utils/isParen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,KAAK,
|
|
1
|
+
{"version":3,"file":"isParen.d.ts","sourceRoot":"","sources":["../../src/utils/isParen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAG5E,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC,CAEvE"}
|
package/dist/utils/isQuote.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AnyToken, type
|
|
1
|
+
import { type AnyToken, type TokenQuote } from "../types/ast.js";
|
|
2
2
|
/** Returns if the token is a quote token. This includes regex delimiters. */
|
|
3
|
-
export declare function isQuote(token?: AnyToken): token is AnyToken<
|
|
3
|
+
export declare function isQuote(token?: AnyToken): token is AnyToken<TokenQuote>;
|
|
4
4
|
//# sourceMappingURL=isQuote.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isQuote.d.ts","sourceRoot":"","sources":["../../src/utils/isQuote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,KAAK,
|
|
1
|
+
{"version":3,"file":"isQuote.d.ts","sourceRoot":"","sources":["../../src/utils/isQuote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5E,6EAA6E;AAC7E,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,KAAK,IAAI,QAAQ,CAAC,UAAU,CAAC,CAEvE"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@witchcraft/expressit",
|
|
3
3
|
"description": "A blazing fast, customizable, error-tolerant expression parser that creates safe to eval expressions + a few other goodies like autocomplete.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.3.0",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
8
|
"sideEffects": false,
|
|
9
9
|
"exports": {
|
|
10
10
|
".": {
|
|
@@ -85,21 +85,21 @@
|
|
|
85
85
|
"prepare": "husky && npm run build"
|
|
86
86
|
},
|
|
87
87
|
"dependencies": {
|
|
88
|
-
"@alanscodelog/utils": "^
|
|
88
|
+
"@alanscodelog/utils": "^5.1.0"
|
|
89
89
|
},
|
|
90
90
|
"devDependencies": {
|
|
91
91
|
"@alanscodelog/commitlint-config": "^3.0.1",
|
|
92
92
|
"@alanscodelog/eslint-config": "5.0.3",
|
|
93
|
-
"@alanscodelog/semantic-release-config": "^5.0.
|
|
94
|
-
"@alanscodelog/tsconfigs": "^
|
|
93
|
+
"@alanscodelog/semantic-release-config": "^5.0.4",
|
|
94
|
+
"@alanscodelog/tsconfigs": "^6.0.0",
|
|
95
95
|
"@commitlint/cli": "^19.6.1",
|
|
96
96
|
"@electric-sql/pglite": "^0.2.12",
|
|
97
97
|
"@types/node": "^22.10.2",
|
|
98
|
-
"@vitest/coverage-v8": "^
|
|
98
|
+
"@vitest/coverage-v8": "^3.1.1",
|
|
99
99
|
"concurrently": "^9.1.0",
|
|
100
100
|
"cross-env": "^7.0.3",
|
|
101
|
-
"drizzle-kit": "^0.
|
|
102
|
-
"drizzle-orm": "^0.
|
|
101
|
+
"drizzle-kit": "^0.31.0",
|
|
102
|
+
"drizzle-orm": "^0.42.0",
|
|
103
103
|
"fast-glob": "^3.3.1",
|
|
104
104
|
"http-server": "^14.1.1",
|
|
105
105
|
"husky": "^9.1.7",
|
|
@@ -108,12 +108,12 @@
|
|
|
108
108
|
"onchange": "^7.1.0",
|
|
109
109
|
"semantic-release": "^24.2.0",
|
|
110
110
|
"ts-node": "^10.9.1",
|
|
111
|
-
"typedoc": "0.
|
|
112
|
-
"typescript": "~5.
|
|
111
|
+
"typedoc": "0.28.3",
|
|
112
|
+
"typescript": "~5.8.3",
|
|
113
113
|
"vite": "^6.0.2",
|
|
114
|
-
"vite-plugin-externalize-deps": "^0.
|
|
114
|
+
"vite-plugin-externalize-deps": "^0.9.0",
|
|
115
115
|
"vite-tsconfig-paths": "^5.1.4",
|
|
116
|
-
"vitest": "^
|
|
116
|
+
"vitest": "^3.1.1"
|
|
117
117
|
},
|
|
118
118
|
"author": "Alan <alanscodelog@gmail.com>",
|
|
119
119
|
"repository": "https://github.com/witchcraftjs/expressit",
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
},
|
|
144
144
|
"browserslist": "defaults and supports es6-module,maintained node versions",
|
|
145
145
|
"engines": {
|
|
146
|
-
"node": ">=
|
|
146
|
+
"node": ">=20.0.0"
|
|
147
147
|
},
|
|
148
148
|
"@comments": {
|
|
149
149
|
"scripts": {
|
package/src/Lexer.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { EnumLike } from "@alanscodelog/utils"
|
|
2
|
+
import { enumFromArray } from "@alanscodelog/utils/enumFromArray.js"
|
|
1
3
|
import { isBlank } from "@alanscodelog/utils/isBlank.js"
|
|
2
4
|
import { pushIfNotIn } from "@alanscodelog/utils/pushIfNotIn.js"
|
|
3
5
|
|
|
@@ -7,63 +9,68 @@ import type { FullParserOptions } from "./types/index.js"
|
|
|
7
9
|
|
|
8
10
|
const regexFlags = /^[a-zA-Z]+/
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
12
|
+
const MODE = enumFromArray([
|
|
13
|
+
"MAIN",
|
|
14
|
+
"MAYBE_QUOTE_ERROR",
|
|
15
|
+
"NOT_SINGLE",
|
|
16
|
+
"NOT_DOUBLE",
|
|
17
|
+
"NOT_BACKTICK",
|
|
18
|
+
"NOT_REGEX",
|
|
19
|
+
"REGEX_END",
|
|
20
|
+
"BRACKET_MAIN",
|
|
21
|
+
"BRACKET_MAYBE_QUOTE_ERROR",
|
|
22
|
+
"BRACKET_NOT_SINGLE",
|
|
23
|
+
"BRACKET_NOT_DOUBLE",
|
|
24
|
+
"BRACKET_NOT_BACKTICK",
|
|
25
|
+
"BRACKET_NOT_REGEX",
|
|
26
|
+
"BRACKET_REGEX_END",
|
|
27
|
+
])
|
|
28
|
+
|
|
25
29
|
const BRACKET_PREFIX = "BRACKET"
|
|
26
30
|
|
|
31
|
+
export const $T = enumFromArray([
|
|
32
|
+
"_",
|
|
33
|
+
"VALUE_UNQUOTED",
|
|
34
|
+
"VALUE_REGEX",
|
|
35
|
+
"VALUE_NOT_SINGLE",
|
|
36
|
+
"VALUE_NOT_DOUBLE",
|
|
37
|
+
"VALUE_NOT_BACKTICK",
|
|
38
|
+
"SYM_OR",
|
|
39
|
+
"SYM_AND",
|
|
40
|
+
"SYM_NOT",
|
|
41
|
+
"WORD_OR",
|
|
42
|
+
"WORD_AND",
|
|
43
|
+
"WORD_NOT",
|
|
44
|
+
"REGEX_START",
|
|
45
|
+
"REGEX_END",
|
|
46
|
+
"EXP_PROP_OP",
|
|
47
|
+
"CUSTOM_PROP_OP",
|
|
48
|
+
"PAREN_L",
|
|
49
|
+
"PAREN_R",
|
|
50
|
+
"BRACKET_L",
|
|
51
|
+
"BRACKET_R",
|
|
52
|
+
"QUOTE_SINGLE",
|
|
53
|
+
"QUOTE_DOUBLE",
|
|
54
|
+
"QUOTE_BACKTICK",
|
|
55
|
+
])
|
|
56
|
+
|
|
27
57
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
28
|
-
export
|
|
29
|
-
_ = "_", // whitespace,
|
|
30
|
-
VALUE_UNQUOTED = "VALUE_UNQUOTED",
|
|
31
|
-
VALUE_REGEX = "VALUE_REGEX",
|
|
32
|
-
VALUE_NOT_SINGLE = "VALUE_NOT_SINGLE",
|
|
33
|
-
VALUE_NOT_DOUBLE = "VALUE_NOT_DOUBLE",
|
|
34
|
-
VALUE_NOT_BACKTICK = "VALUE_NOT_BACKTICK",
|
|
35
|
-
SYM_OR = "SYM_OR",
|
|
36
|
-
SYM_AND = "SYM_AND",
|
|
37
|
-
SYM_NOT = "SYM_NOT",
|
|
38
|
-
WORD_OR = "WORD_OR",
|
|
39
|
-
WORD_AND = "WORD_AND",
|
|
40
|
-
WORD_NOT = "WORD_NOT",
|
|
41
|
-
REGEX_START = "REGEX_START",
|
|
42
|
-
REGEX_END = "REGEX_END",
|
|
43
|
-
EXP_PROP_OP = "EXP_PROP_OP",
|
|
44
|
-
CUSTOM_PROP_OP = "CUSTOM_PROP_OP",
|
|
45
|
-
PAREN_L = "PAREN_L",
|
|
46
|
-
PAREN_R = "PAREN_R",
|
|
47
|
-
BRACKET_L = "BRACKET_L",
|
|
48
|
-
BRACKET_R = "BRACKET_R",
|
|
49
|
-
QUOTE_SINGLE = "QUOTE_SINGLE",
|
|
50
|
-
QUOTE_DOUBLE = "QUOTE_DOUBLE",
|
|
51
|
-
QUOTE_BACKTICK = "QUOTE_BACKTICK",
|
|
52
|
-
}
|
|
58
|
+
export type $TType = EnumLike<typeof $T>
|
|
53
59
|
|
|
60
|
+
export const $C = enumFromArray([
|
|
61
|
+
"ANY",
|
|
62
|
+
"QUOTE_ANY",
|
|
63
|
+
"REGEX_ANY",
|
|
64
|
+
"VALUE_FOR_SINGLE",
|
|
65
|
+
"VALUE_FOR_DOUBLE",
|
|
66
|
+
"VALUE_FOR_BACKTICK",
|
|
67
|
+
"OPERATOR_OR",
|
|
68
|
+
"OPERATOR_AND",
|
|
69
|
+
"OPERATOR_NOT",
|
|
70
|
+
"VALUE",
|
|
71
|
+
])
|
|
54
72
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
55
|
-
export
|
|
56
|
-
ANY = "ANY",
|
|
57
|
-
QUOTE_ANY = "QUOTE_ANY",
|
|
58
|
-
REGEX_ANY = "REGEX_ANY",
|
|
59
|
-
VALUE_FOR_SINGLE = "VALUE_FOR_SINGLE",
|
|
60
|
-
VALUE_FOR_DOUBLE = "VALUE_FOR_DOUBLE",
|
|
61
|
-
VALUE_FOR_BACKTICK = "VALUE_FOR_BACKTICK",
|
|
62
|
-
OPERATOR_OR = "OPERATOR_OR",
|
|
63
|
-
OPERATOR_AND = "OPERATOR_AND",
|
|
64
|
-
OPERATOR_NOT = "OPERATOR_NOT",
|
|
65
|
-
VALUE = "VALUE",
|
|
66
|
-
}
|
|
73
|
+
export type $CType = EnumLike<typeof $C>
|
|
67
74
|
|
|
68
75
|
|
|
69
76
|
type SymbolInfo = {
|
|
@@ -80,40 +87,42 @@ type SymbolInfo = {
|
|
|
80
87
|
|
|
81
88
|
type TokenMatchFunc = (c: string, input: string, start: number, mode: string) => string | boolean
|
|
82
89
|
|
|
83
|
-
interface
|
|
90
|
+
interface LexerBaseToken<T extends $TType | $CType> {
|
|
84
91
|
type: T
|
|
85
92
|
skip?: boolean
|
|
86
93
|
}
|
|
87
|
-
|
|
88
|
-
|
|
94
|
+
|
|
95
|
+
export interface LexerRealToken<
|
|
96
|
+
T extends $TType = $TType,
|
|
89
97
|
TPush extends string | undefined = undefined,
|
|
90
98
|
// TCategories extends $C[] | undefined = undefined,
|
|
91
|
-
> extends
|
|
99
|
+
> extends LexerBaseToken<T> {
|
|
92
100
|
matches: TokenMatchFunc
|
|
93
101
|
push?: TPush | ((mode: string, tokens: Token[]) => TPush)
|
|
94
102
|
// categories?: TCategories
|
|
95
|
-
longerAlt?: $
|
|
103
|
+
longerAlt?: $TType
|
|
96
104
|
skip?: boolean
|
|
97
105
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
106
|
+
|
|
107
|
+
export interface LexerCategoryToken<
|
|
108
|
+
TC extends $CType,
|
|
109
|
+
TTokens extends LexerRealToken<$TType, any>[] = LexerRealToken<$TType, any>[],
|
|
110
|
+
> extends LexerBaseToken<TC> {
|
|
102
111
|
isCategory: true
|
|
103
112
|
entries: Partial<Record<TTokens[number]["type"], TTokens[number]>>
|
|
104
113
|
// entries: Partial<Record<TTokens[number]["type"], TTokens[number]>>
|
|
105
114
|
}
|
|
106
115
|
|
|
107
|
-
export type
|
|
108
|
-
?
|
|
109
|
-
: TC extends $
|
|
110
|
-
?
|
|
116
|
+
export type LexerToken<TC extends $CType | $TType> = TC extends $TType
|
|
117
|
+
? LexerRealToken<TC, any>
|
|
118
|
+
: TC extends $CType
|
|
119
|
+
? LexerCategoryToken<TC>
|
|
111
120
|
: never
|
|
112
121
|
|
|
113
|
-
function
|
|
122
|
+
function createLexerCategoryToken<T extends $CType, TTokens extends LexerRealToken<$TType, any>>(
|
|
114
123
|
type: T,
|
|
115
124
|
entries: (TTokens | undefined)[],
|
|
116
|
-
):
|
|
125
|
+
): LexerCategoryToken<T, TTokens[]> {
|
|
117
126
|
return {
|
|
118
127
|
type,
|
|
119
128
|
isCategory: true,
|
|
@@ -125,12 +134,12 @@ function createTokenCategoryType<T extends $C, TTokens extends RealTokenType<$T,
|
|
|
125
134
|
}
|
|
126
135
|
|
|
127
136
|
function createTokenType<
|
|
128
|
-
T extends $
|
|
137
|
+
T extends $TType,
|
|
129
138
|
TPush extends string | undefined = undefined,
|
|
130
139
|
>(
|
|
131
140
|
type: T,
|
|
132
|
-
opts: Omit<
|
|
133
|
-
):
|
|
141
|
+
opts: Omit<LexerRealToken<T, TPush>, "type">,
|
|
142
|
+
): LexerRealToken<T, TPush > {
|
|
134
143
|
return {
|
|
135
144
|
type,
|
|
136
145
|
...opts,
|
|
@@ -164,7 +173,7 @@ function matchSymbol(symbols: string[]): TokenMatchFunc {
|
|
|
164
173
|
}
|
|
165
174
|
}
|
|
166
175
|
|
|
167
|
-
export interface Token<T extends $
|
|
176
|
+
export interface Token<T extends $TType | $CType = $TType | $CType> {
|
|
168
177
|
type: T
|
|
169
178
|
value: string
|
|
170
179
|
startOffset: number
|
|
@@ -175,11 +184,11 @@ export interface Token<T extends $T | $C = $T | $C> {
|
|
|
175
184
|
export class Lexer {
|
|
176
185
|
symbols: SymbolInfo
|
|
177
186
|
|
|
178
|
-
$: {[key in $
|
|
187
|
+
$: {[key in $TType]: LexerRealToken<key, any> }
|
|
179
188
|
|
|
180
189
|
$categories: ReturnType<Lexer["createTokens"]>["$categories"]
|
|
181
190
|
|
|
182
|
-
branches: {[key in keyof typeof MODE]?:
|
|
191
|
+
branches: {[key in keyof typeof MODE]?: LexerToken<$TType>[] }
|
|
183
192
|
|
|
184
193
|
opts: FullParserOptions<any>
|
|
185
194
|
|
|
@@ -509,7 +518,7 @@ export class Lexer {
|
|
|
509
518
|
}),
|
|
510
519
|
}
|
|
511
520
|
const $categories = {
|
|
512
|
-
[$C.ANY]:
|
|
521
|
+
[$C.ANY]: createLexerCategoryToken($C.ANY, [
|
|
513
522
|
$[$T.REGEX_START],
|
|
514
523
|
$[$T.REGEX_END],
|
|
515
524
|
$[$T.QUOTE_SINGLE],
|
|
@@ -532,39 +541,39 @@ export class Lexer {
|
|
|
532
541
|
$[$T.BRACKET_L],
|
|
533
542
|
$[$T.BRACKET_R],
|
|
534
543
|
] as const),
|
|
535
|
-
[$C.VALUE]:
|
|
544
|
+
[$C.VALUE]: createLexerCategoryToken($C.VALUE, [
|
|
536
545
|
$[$T.VALUE_UNQUOTED],
|
|
537
546
|
$[$T.VALUE_NOT_SINGLE],
|
|
538
547
|
$[$T.VALUE_NOT_DOUBLE],
|
|
539
548
|
$[$T.VALUE_NOT_BACKTICK],
|
|
540
549
|
] as const),
|
|
541
|
-
[$C.VALUE_FOR_SINGLE]:
|
|
550
|
+
[$C.VALUE_FOR_SINGLE]: createLexerCategoryToken($C.VALUE_FOR_SINGLE, [
|
|
542
551
|
$[$T.VALUE_NOT_SINGLE],
|
|
543
552
|
] as const),
|
|
544
|
-
[$C.VALUE_FOR_DOUBLE]:
|
|
553
|
+
[$C.VALUE_FOR_DOUBLE]: createLexerCategoryToken($C.VALUE_FOR_DOUBLE, [
|
|
545
554
|
$[$T.VALUE_NOT_DOUBLE],
|
|
546
555
|
] as const),
|
|
547
|
-
[$C.VALUE_FOR_BACKTICK]:
|
|
556
|
+
[$C.VALUE_FOR_BACKTICK]: createLexerCategoryToken($C.VALUE_FOR_BACKTICK, [
|
|
548
557
|
$[$T.VALUE_NOT_BACKTICK],
|
|
549
558
|
] as const),
|
|
550
|
-
[$C.REGEX_ANY]:
|
|
559
|
+
[$C.REGEX_ANY]: createLexerCategoryToken($C.REGEX_ANY, [
|
|
551
560
|
$[$T.REGEX_START],
|
|
552
561
|
$[$T.REGEX_END],
|
|
553
562
|
] as const),
|
|
554
|
-
[$C.QUOTE_ANY]:
|
|
563
|
+
[$C.QUOTE_ANY]: createLexerCategoryToken($C.QUOTE_ANY, [
|
|
555
564
|
$[$T.QUOTE_SINGLE],
|
|
556
565
|
$[$T.QUOTE_DOUBLE],
|
|
557
566
|
$[$T.QUOTE_BACKTICK],
|
|
558
567
|
] as const),
|
|
559
|
-
[$C.OPERATOR_OR]:
|
|
568
|
+
[$C.OPERATOR_OR]: createLexerCategoryToken($C.OPERATOR_OR, [
|
|
560
569
|
$[$T.SYM_OR],
|
|
561
570
|
$[$T.WORD_OR],
|
|
562
571
|
] as const),
|
|
563
|
-
[$C.OPERATOR_AND]:
|
|
572
|
+
[$C.OPERATOR_AND]: createLexerCategoryToken($C.OPERATOR_AND, [
|
|
564
573
|
$[$T.SYM_AND],
|
|
565
574
|
$[$T.WORD_AND],
|
|
566
575
|
] as const),
|
|
567
|
-
[$C.OPERATOR_NOT]:
|
|
576
|
+
[$C.OPERATOR_NOT]: createLexerCategoryToken($C.OPERATOR_NOT, [
|
|
568
577
|
$[$T.SYM_NOT],
|
|
569
578
|
$[$T.WORD_NOT],
|
|
570
579
|
] as const),
|
|
@@ -572,7 +581,7 @@ export class Lexer {
|
|
|
572
581
|
return { $, $categories }
|
|
573
582
|
}
|
|
574
583
|
|
|
575
|
-
createModeBranches(): {[key in keyof typeof MODE]?:
|
|
584
|
+
createModeBranches(): {[key in keyof typeof MODE]?: LexerToken<$TType>[] } {
|
|
576
585
|
const opts = this.opts
|
|
577
586
|
const $ = this.$
|
|
578
587
|
const quotes = [
|
|
@@ -652,13 +661,13 @@ export class Lexer {
|
|
|
652
661
|
}
|
|
653
662
|
|
|
654
663
|
|
|
655
|
-
tokenize(input: string): Token<$
|
|
664
|
+
tokenize(input: string): Token<$TType>[] {
|
|
656
665
|
const branches = this.createModeBranches()
|
|
657
|
-
const tokens: Token<$
|
|
666
|
+
const tokens: Token<$TType>[] = []
|
|
658
667
|
let mode = MODE.MAIN
|
|
659
668
|
let index = 0
|
|
660
669
|
let c = input[index]
|
|
661
|
-
let branch = branches[mode] as any as
|
|
670
|
+
let branch = branches[mode] as any as LexerToken<$TType>[]
|
|
662
671
|
while (index < input.length) {
|
|
663
672
|
for (const t of branch) {
|
|
664
673
|
let match = t.matches(c, input, index, mode)
|
|
@@ -694,7 +703,8 @@ export class Lexer {
|
|
|
694
703
|
return tokens
|
|
695
704
|
}
|
|
696
705
|
}
|
|
697
|
-
|
|
706
|
+
|
|
707
|
+
function createToken<T extends $TType>(type: T, value: string, startOffset: number, endOffset: number): Token<T> {
|
|
698
708
|
return {
|
|
699
709
|
type,
|
|
700
710
|
value,
|