@ptolemy2002/rgx 13.8.0 → 13.9.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.
Files changed (51) hide show
  1. package/README.md +1 -0
  2. package/dist/class/base.d.ts +4 -1
  3. package/dist/class/base.js +13 -0
  4. package/dist/class/exclusion.d.ts +4 -1
  5. package/dist/class/exclusion.js +27 -0
  6. package/dist/class/group.d.ts +4 -0
  7. package/dist/class/group.js +30 -0
  8. package/dist/class/init.d.ts +3 -0
  9. package/dist/class/init.js +24 -0
  10. package/dist/class/lookahead.d.ts +4 -1
  11. package/dist/class/lookahead.js +14 -2
  12. package/dist/class/lookaround.d.ts +2 -0
  13. package/dist/class/lookaround.js +13 -0
  14. package/dist/class/lookbehind.d.ts +4 -1
  15. package/dist/class/lookbehind.js +14 -2
  16. package/dist/class/repeat.d.ts +4 -1
  17. package/dist/class/repeat.js +23 -0
  18. package/dist/class/subpattern.d.ts +4 -0
  19. package/dist/class/subpattern.js +15 -0
  20. package/dist/class/toRGXClassToken.js +4 -0
  21. package/dist/class/union.d.ts +4 -0
  22. package/dist/class/union.js +29 -1
  23. package/dist/class/wrapper.d.ts +4 -1
  24. package/dist/class/wrapper.js +19 -2
  25. package/dist/errors/base.d.ts +1 -1
  26. package/dist/errors/index.d.ts +5 -0
  27. package/dist/errors/index.js +5 -0
  28. package/dist/errors/invalidJSONClassKey.d.ts +6 -0
  29. package/dist/errors/invalidJSONClassKey.js +15 -0
  30. package/dist/errors/invalidJSONToken.d.ts +4 -0
  31. package/dist/errors/invalidJSONToken.js +12 -0
  32. package/dist/errors/invalidToken.js +15 -2
  33. package/dist/errors/jsonClassArgsValidationFailed.d.ts +8 -0
  34. package/dist/errors/jsonClassArgsValidationFailed.js +20 -0
  35. package/dist/errors/jsonClassConflict.d.ts +6 -0
  36. package/dist/errors/jsonClassConflict.js +15 -0
  37. package/dist/errors/notJSONSerializable.d.ts +7 -0
  38. package/dist/errors/notJSONSerializable.js +26 -0
  39. package/dist/flag-transformer/accentInsensitive.js +5 -5
  40. package/dist/index.d.ts +1 -0
  41. package/dist/index.js +1 -0
  42. package/dist/internal/assureAcceptance.js +4 -1
  43. package/dist/json.d.ts +35 -0
  44. package/dist/json.js +208 -0
  45. package/dist/resolve.js +4 -0
  46. package/dist/typeGuards.d.ts +22 -10
  47. package/dist/typeGuards.js +183 -36
  48. package/dist/types.d.ts +26 -5
  49. package/dist/types.js +3 -1
  50. package/dist/walker/base.d.ts +8 -0
  51. package/package.json +1 -1
package/README.md CHANGED
@@ -12,6 +12,7 @@ Because there is so much to document, it has been broken up into multiple files.
12
12
  - [type-guards](./docs/type-guards.md) - Type guards for validating various types of tokens and string values.
13
13
  - [ExtRegExp](./docs/ExtRegExp.md) - The `ExtRegExp` class, which extends the built-in `RegExp` class with the ability to create custom flags that transform the source string of the regular expression before it is compiled.
14
14
  - [constants](./docs/constants.md) - Constants provided by the library, such as predefined character classes and tokens.
15
+ - [json](./docs/json.md) - JSON tokens, a JSON-serializable form of any token, along with the functions that convert tokens to and from that form and the registry of class names that JSON class tokens can target.
15
16
  - `util` - A directory containing documentation for various utility functions provided by the library.
16
17
  - [clone](./docs/util/clone.md) - The `cloneRGXToken` function, which creates a clone of a given RGX token to a specified depth.
17
18
  - [escapeRegex](./docs/util/escapeRegex.md) - The `escapeRegex` function, which escapes special regex characters in a given string and assures you that the result is valid Regex.
@@ -1,4 +1,4 @@
1
- import { RGXConvertibleToken, RGXToken, ValidRegexFlags, ValidRegexString } from "../types";
1
+ import { RGXConvertibleToken, RGXJSONClassToken, RGXJSONValue, RGXToken, ValidRegexFlags, ValidRegexString } from "../types";
2
2
  import { RGXTokenCollectionInput } from "../collection";
3
3
  import { ResolveRGXTokenOptions } from "../resolve";
4
4
  import { CloneDepth } from "@ptolemy2002/immutability-utils";
@@ -11,6 +11,9 @@ import type { RGXExclusionToken } from "./exclusion";
11
11
  export declare abstract class RGXClassToken implements RGXConvertibleToken {
12
12
  abstract toRgx(): RGXToken;
13
13
  abstract clone(depth?: CloneDepth): ThisType<this>;
14
+ toJSON(): RGXJSONClassToken;
15
+ static validateJSONArgs(args: RGXJSONValue[]): boolean | string;
16
+ static fromJSON(json: RGXJSONClassToken): RGXClassToken;
14
17
  rgxAcceptInsertion(tokens: RGXToken[], flags: ValidRegexFlags): string | boolean;
15
18
  static check: (value: unknown) => value is RGXClassToken;
16
19
  static assert: (value: unknown) => asserts value is RGXClassToken;
@@ -4,6 +4,19 @@ exports.RGXClassToken = void 0;
4
4
  const errors_1 = require("../errors");
5
5
  const resolve_1 = require("../resolve");
6
6
  class RGXClassToken {
7
+ // Subclasses are expected to override toJSON and both static methods below. They are not marked abstract
8
+ // (so existing subclasses keep compiling), so they throw RGXNotImplementedError by default.
9
+ // toJSON must return a JSON class token whose args, when given to the registered constructor for the
10
+ // class, reconstruct an equivalent token.
11
+ toJSON() {
12
+ throw new errors_1.RGXNotImplementedError(`${this.constructor.name}.toJSON()`, 'subclasses must override this method.');
13
+ }
14
+ static validateJSONArgs(args) {
15
+ throw new errors_1.RGXNotImplementedError('RGXClassToken.validateJSONArgs(args)', 'subclasses must override this static method.');
16
+ }
17
+ static fromJSON(json) {
18
+ throw new errors_1.RGXNotImplementedError('RGXClassToken.fromJSON(json)', 'subclasses must override this static method.');
19
+ }
7
20
  rgxAcceptInsertion(tokens, flags) {
8
21
  return true;
9
22
  }
@@ -1,4 +1,4 @@
1
- import { RGXToken } from "../types";
1
+ import { RGXJSONClassToken, RGXJSONValue, RGXToken } from "../types";
2
2
  import { RGXClassToken } from "./base";
3
3
  import { RGXClassUnionToken } from "./union";
4
4
  import { RGXTokenCollectionInput } from "../collection";
@@ -15,5 +15,8 @@ export declare class RGXExclusionToken extends RGXClassToken {
15
15
  constructor(exclusionId: string, token: RGXToken, exclusions?: RGXTokenCollectionInput, terminal?: RGXToken);
16
16
  toRgx(): RGXToken;
17
17
  clone(depth?: CloneDepth): RGXExclusionToken;
18
+ static validateJSONArgs(args: RGXJSONValue[]): boolean | string;
19
+ static fromJSON(json: RGXJSONClassToken): RGXExclusionToken;
20
+ toJSON(): RGXJSONClassToken;
18
21
  }
19
22
  export declare const rgxExclusion: (exclusionId: string, token: RGXToken, exclusions?: RGXTokenCollectionInput, terminal?: RGXToken) => RGXExclusionToken;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rgxExclusion = exports.RGXExclusionToken = void 0;
4
+ const json_1 = require("../json");
4
5
  const base_1 = require("./base");
5
6
  const union_1 = require("./union");
6
7
  const resolve_1 = require("../resolve");
@@ -48,6 +49,32 @@ class RGXExclusionToken extends base_1.RGXClassToken {
48
49
  return this;
49
50
  return new RGXExclusionToken(this.exclusionId, (0, clone_1.cloneRGXToken)(this.token, (0, immutability_utils_1.depthDecrement)(depth, 1)), this.exclusions.clone((0, immutability_utils_1.depthDecrement)(depth, 1)), (0, clone_1.cloneRGXToken)(this.terminal, (0, immutability_utils_1.depthDecrement)(depth, 1)));
50
51
  }
52
+ static validateJSONArgs(args) {
53
+ if (args.length < 2 || args.length > 4)
54
+ return "Expected between 2 and 4 arguments (exclusionId, token, exclusions, terminal).";
55
+ const [exclusionId, token, exclusions, terminal] = args;
56
+ if (typeof exclusionId !== "string")
57
+ return "Argument 0 (exclusionId) must be a string.";
58
+ if (!(0, typeGuards_1.isRGXJSONToken)(token))
59
+ return "Argument 1 (token) must be a JSON token.";
60
+ if (exclusions !== undefined && !(0, typeGuards_1.isRGXJSONToken)(exclusions))
61
+ return "Argument 2 (exclusions) must be a JSON token, if present.";
62
+ if (terminal !== undefined && !(0, typeGuards_1.isRGXJSONToken)(terminal))
63
+ return "Argument 3 (terminal) must be a JSON token, if present.";
64
+ return true;
65
+ }
66
+ static fromJSON(json) {
67
+ const [exclusionId, token, exclusions, terminal] = (0, json_1.rgxJSONClassArgs)(json, "RGXExclusionToken", RGXExclusionToken.validateJSONArgs);
68
+ return new RGXExclusionToken(exclusionId, (0, json_1.rgxTokenFromJSON)(token), exclusions === undefined ? [] : (0, json_1.rgxTokenFromJSON)(exclusions), terminal === undefined ? null : (0, json_1.rgxTokenFromJSON)(terminal));
69
+ }
70
+ toJSON() {
71
+ return (0, json_1.createRGXJSONClassToken)("RGXExclusionToken", [
72
+ this.exclusionId,
73
+ (0, json_1.rgxTokenToJSON)(this.token),
74
+ (0, json_1.rgxTokenToJSON)(this.exclusions.tokens.tokens),
75
+ (0, json_1.rgxTokenToJSON)(this.terminal)
76
+ ]);
77
+ }
51
78
  }
52
79
  exports.RGXExclusionToken = RGXExclusionToken;
53
80
  RGXExclusionToken.check = (0, utils_1.createRGXClassGuardFunction)(RGXExclusionToken);
@@ -1,6 +1,7 @@
1
1
  import { RGXTokenCollection, RGXTokenCollectionInput } from "../collection";
2
2
  import { RGXClassToken } from "./base";
3
3
  import { CloneDepth } from "@ptolemy2002/immutability-utils";
4
+ import { RGXJSONClassToken, RGXJSONValue } from "../types";
4
5
  export type RGXGroupTokenArgs = {
5
6
  name?: string | null;
6
7
  capturing?: boolean;
@@ -24,5 +25,8 @@ export declare class RGXGroupToken extends RGXClassToken {
24
25
  constructor({ name, capturing, flags }?: RGXGroupTokenArgs, tokens?: RGXTokenCollectionInput);
25
26
  toRgx(): RegExp;
26
27
  clone(depth?: CloneDepth): RGXGroupToken;
28
+ static validateJSONArgs(args: RGXJSONValue[]): boolean | string;
29
+ static fromJSON(json: RGXJSONClassToken): RGXGroupToken;
30
+ toJSON(): RGXJSONClassToken;
27
31
  }
28
32
  export declare const rgxGroup: (args_0?: RGXGroupTokenArgs | undefined, tokens?: RGXTokenCollectionInput) => RGXGroupToken;
@@ -7,6 +7,8 @@ const internal_1 = require("../internal");
7
7
  const utils_1 = require("../utils");
8
8
  const typeGuards_1 = require("../typeGuards");
9
9
  const immutability_utils_1 = require("@ptolemy2002/immutability-utils");
10
+ const json_1 = require("../json");
11
+ const typeGuards_2 = require("../typeGuards");
10
12
  class RGXGroupToken extends base_1.RGXClassToken {
11
13
  get name() {
12
14
  return this._name;
@@ -79,6 +81,34 @@ class RGXGroupToken extends base_1.RGXClassToken {
79
81
  return this;
80
82
  return new RGXGroupToken({ name: this.name, capturing: this._capturing, flags: this.flags }, this.tokens.clone((0, immutability_utils_1.depthDecrement)(depth, 1)));
81
83
  }
84
+ static validateJSONArgs(args) {
85
+ if (args.length > 2)
86
+ return "Expected at most 2 arguments (args, tokens).";
87
+ const [groupArgs, tokens] = args;
88
+ if (groupArgs !== undefined) {
89
+ if (typeof groupArgs !== "object" || groupArgs === null || Array.isArray(groupArgs))
90
+ return "Argument 0 (args) must be an object.";
91
+ if (groupArgs.name !== undefined && groupArgs.name !== null && typeof groupArgs.name !== "string")
92
+ return "Argument 0 (args) must have a string or null name, if present.";
93
+ if (groupArgs.capturing !== undefined && typeof groupArgs.capturing !== "boolean")
94
+ return "Argument 0 (args) must have a boolean capturing property, if present.";
95
+ if (groupArgs.flags !== undefined && typeof groupArgs.flags !== "string")
96
+ return "Argument 0 (args) must have a string flags property, if present.";
97
+ }
98
+ if (tokens !== undefined && !(0, typeGuards_2.isRGXJSONToken)(tokens))
99
+ return "Argument 1 (tokens) must be a JSON token.";
100
+ return true;
101
+ }
102
+ static fromJSON(json) {
103
+ const [groupArgs, tokens] = (0, json_1.rgxJSONClassArgs)(json, "RGXGroupToken", RGXGroupToken.validateJSONArgs);
104
+ return new RGXGroupToken(groupArgs ?? {}, tokens === undefined ? [] : (0, json_1.rgxTokenFromJSON)(tokens));
105
+ }
106
+ toJSON() {
107
+ return (0, json_1.createRGXJSONClassToken)("RGXGroupToken", [
108
+ { name: this.name, capturing: this._capturing, flags: this.flags },
109
+ (0, json_1.rgxTokenToJSON)(this.tokens.tokens)
110
+ ]);
111
+ }
82
112
  }
83
113
  exports.RGXGroupToken = RGXGroupToken;
84
114
  RGXGroupToken.check = (0, utils_1.createRGXClassGuardFunction)(RGXGroupToken);
@@ -1 +1,4 @@
1
+ import { RGXJSONBuiltinClassName, RGXJSONClassTokenConstructor } from "../json";
2
+ export declare const RGX_BUILTIN_JSON_CLASSES: Record<RGXJSONBuiltinClassName, RGXJSONClassTokenConstructor>;
3
+ export declare function registerBuiltinRGXJSONClasses(): void;
1
4
  export declare function rgxClassInit(): void;
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RGX_BUILTIN_JSON_CLASSES = void 0;
4
+ exports.registerBuiltinRGXJSONClasses = registerBuiltinRGXJSONClasses;
3
5
  exports.rgxClassInit = rgxClassInit;
4
6
  const base_1 = require("./base");
5
7
  const union_1 = require("./union");
@@ -10,7 +12,29 @@ const errors_1 = require("../errors");
10
12
  const lookahead_1 = require("./lookahead");
11
13
  const lookbehind_1 = require("./lookbehind");
12
14
  const exclusion_1 = require("./exclusion");
15
+ const wrapper_1 = require("./wrapper");
16
+ const subpattern_1 = require("./subpattern");
17
+ const json_1 = require("../json");
18
+ exports.RGX_BUILTIN_JSON_CLASSES = {
19
+ RGXClassWrapperToken: wrapper_1.RGXClassWrapperToken,
20
+ RGXClassUnionToken: union_1.RGXClassUnionToken,
21
+ RGXGroupToken: group_1.RGXGroupToken,
22
+ RGXRepeatToken: repeat_1.RGXRepeatToken,
23
+ RGXLookaheadToken: lookahead_1.RGXLookaheadToken,
24
+ RGXLookbehindToken: lookbehind_1.RGXLookbehindToken,
25
+ RGXExclusionToken: exclusion_1.RGXExclusionToken,
26
+ RGXSubpatternToken: subpattern_1.RGXSubpatternToken
27
+ };
28
+ function registerBuiltinRGXJSONClasses() {
29
+ for (const [name, constructor] of Object.entries(exports.RGX_BUILTIN_JSON_CLASSES)) {
30
+ // Skip classes that are already registered so this function is safe to call more than once.
31
+ if (!(0, json_1.hasRGXJSONClass)(name))
32
+ (0, json_1.registerRGXJSONClassToken)(name, constructor);
33
+ }
34
+ }
13
35
  function rgxClassInit() {
36
+ // Make the built-in class tokens available to rgxTokenFromJSON.
37
+ registerBuiltinRGXJSONClasses();
14
38
  // Patch RGXClassToken here, Since classes like RGXClassUnionToken are instances of RGXClassToken
15
39
  // themselves. If we tried to import RGXClassUnionToken in base.ts, it would cause a circular dependency.
16
40
  base_1.RGXClassToken.prototype.or = function (...others) {
@@ -1,4 +1,4 @@
1
- import { RGXToken } from "../types";
1
+ import { RGXJSONClassToken, RGXJSONValue, RGXToken } from "../types";
2
2
  import { RGXLookaroundToken } from "./lookaround";
3
3
  import { RGXLookbehindToken } from "./lookbehind";
4
4
  import { CloneDepth } from "@ptolemy2002/immutability-utils";
@@ -9,5 +9,8 @@ export declare class RGXLookaheadToken extends RGXLookaroundToken {
9
9
  reverse(): RGXLookbehindToken;
10
10
  toRgx(): RGXToken;
11
11
  clone(depth?: CloneDepth): RGXLookaheadToken;
12
+ static validateJSONArgs(args: RGXJSONValue[]): boolean | string;
13
+ static fromJSON(json: RGXJSONClassToken): RGXLookaheadToken;
14
+ toJSON(): RGXJSONClassToken;
12
15
  }
13
16
  export declare const rgxLookahead: (tokens?: import("..").RGXTokenCollectionInput, positive?: boolean | undefined) => RGXLookaheadToken;
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rgxLookahead = exports.RGXLookaheadToken = void 0;
4
+ const json_1 = require("../json");
5
+ const lookaround_1 = require("./lookaround");
4
6
  const internal_1 = require("../internal");
5
7
  const utils_1 = require("../utils");
6
- const lookaround_1 = require("./lookaround");
8
+ const lookaround_2 = require("./lookaround");
7
9
  const lookbehind_1 = require("./lookbehind");
8
10
  const immutability_utils_1 = require("@ptolemy2002/immutability-utils");
9
- class RGXLookaheadToken extends lookaround_1.RGXLookaroundToken {
11
+ class RGXLookaheadToken extends lookaround_2.RGXLookaroundToken {
10
12
  negate() {
11
13
  return new RGXLookaheadToken(this.tokens, !this.positive);
12
14
  }
@@ -26,6 +28,16 @@ class RGXLookaheadToken extends lookaround_1.RGXLookaroundToken {
26
28
  return this;
27
29
  return new RGXLookaheadToken(this.tokens.clone((0, immutability_utils_1.depthDecrement)(depth, 1)), this.positive);
28
30
  }
31
+ static validateJSONArgs(args) {
32
+ return (0, lookaround_1.validateLookaroundJSONArgs)(args);
33
+ }
34
+ static fromJSON(json) {
35
+ const [tokens, positive] = (0, json_1.rgxJSONClassArgs)(json, "RGXLookaheadToken", RGXLookaheadToken.validateJSONArgs);
36
+ return new RGXLookaheadToken(tokens === undefined ? [] : (0, json_1.rgxTokenFromJSON)(tokens), positive ?? true);
37
+ }
38
+ toJSON() {
39
+ return (0, json_1.createRGXJSONClassToken)("RGXLookaheadToken", [(0, json_1.rgxTokenToJSON)(this.tokens.tokens), this.positive]);
40
+ }
29
41
  }
30
42
  exports.RGXLookaheadToken = RGXLookaheadToken;
31
43
  RGXLookaheadToken.check = (0, utils_1.createRGXClassGuardFunction)(RGXLookaheadToken);
@@ -1,5 +1,6 @@
1
1
  import { RGXTokenCollection, RGXTokenCollectionInput } from "../collection";
2
2
  import { RGXClassToken } from "./base";
3
+ import { RGXJSONValue } from "../types";
3
4
  export declare abstract class RGXLookaroundToken extends RGXClassToken {
4
5
  tokens: RGXTokenCollection;
5
6
  _negative: boolean;
@@ -16,3 +17,4 @@ export declare abstract class RGXLookaroundToken extends RGXClassToken {
16
17
  abstract negate(): RGXLookaroundToken;
17
18
  abstract reverse(): RGXLookaroundToken;
18
19
  }
20
+ export declare function validateLookaroundJSONArgs(args: RGXJSONValue[]): boolean | string;
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RGXLookaroundToken = void 0;
4
+ exports.validateLookaroundJSONArgs = validateLookaroundJSONArgs;
4
5
  const collection_1 = require("../collection");
5
6
  const base_1 = require("./base");
6
7
  const errors_1 = require("../errors");
8
+ const typeGuards_1 = require("../typeGuards");
7
9
  class RGXLookaroundToken extends base_1.RGXClassToken {
8
10
  get rgxIsGroup() {
9
11
  return true;
@@ -45,3 +47,14 @@ RGXLookaroundToken.assert = (value) => {
45
47
  throw new errors_1.RGXInvalidTokenError("Invalid token type", { type: "custom", values: ["instance of RGXLookaroundToken"] }, value);
46
48
  }
47
49
  };
50
+ // Shared argument validation for the lookahead and lookbehind JSON forms.
51
+ function validateLookaroundJSONArgs(args) {
52
+ if (args.length > 2)
53
+ return "Expected at most 2 arguments (tokens, positive).";
54
+ const [tokens, positive] = args;
55
+ if (tokens !== undefined && !(0, typeGuards_1.isRGXJSONToken)(tokens))
56
+ return "Argument 0 (tokens) must be a JSON token.";
57
+ if (positive !== undefined && typeof positive !== "boolean")
58
+ return "Argument 1 (positive) must be a boolean, if present.";
59
+ return true;
60
+ }
@@ -1,4 +1,4 @@
1
- import { RGXToken } from "../types";
1
+ import { RGXJSONClassToken, RGXJSONValue, RGXToken } from "../types";
2
2
  import { RGXLookaheadToken } from "./lookahead";
3
3
  import { RGXLookaroundToken } from "./lookaround";
4
4
  import { CloneDepth } from "@ptolemy2002/immutability-utils";
@@ -9,5 +9,8 @@ export declare class RGXLookbehindToken extends RGXLookaroundToken {
9
9
  reverse(): RGXLookaheadToken;
10
10
  toRgx(): RGXToken;
11
11
  clone(depth?: CloneDepth): RGXLookbehindToken;
12
+ static validateJSONArgs(args: RGXJSONValue[]): boolean | string;
13
+ static fromJSON(json: RGXJSONClassToken): RGXLookbehindToken;
14
+ toJSON(): RGXJSONClassToken;
12
15
  }
13
16
  export declare const rgxLookbehind: (tokens?: import("..").RGXTokenCollectionInput, positive?: boolean | undefined) => RGXLookbehindToken;
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rgxLookbehind = exports.RGXLookbehindToken = void 0;
4
+ const json_1 = require("../json");
5
+ const lookaround_1 = require("./lookaround");
4
6
  const internal_1 = require("../internal");
5
7
  const utils_1 = require("../utils");
6
8
  const lookahead_1 = require("./lookahead");
7
- const lookaround_1 = require("./lookaround");
9
+ const lookaround_2 = require("./lookaround");
8
10
  const immutability_utils_1 = require("@ptolemy2002/immutability-utils");
9
- class RGXLookbehindToken extends lookaround_1.RGXLookaroundToken {
11
+ class RGXLookbehindToken extends lookaround_2.RGXLookaroundToken {
10
12
  negate() {
11
13
  return new RGXLookbehindToken(this.tokens, !this.positive);
12
14
  }
@@ -26,6 +28,16 @@ class RGXLookbehindToken extends lookaround_1.RGXLookaroundToken {
26
28
  return this;
27
29
  return new RGXLookbehindToken(this.tokens.clone((0, immutability_utils_1.depthDecrement)(depth, 1)), this.positive);
28
30
  }
31
+ static validateJSONArgs(args) {
32
+ return (0, lookaround_1.validateLookaroundJSONArgs)(args);
33
+ }
34
+ static fromJSON(json) {
35
+ const [tokens, positive] = (0, json_1.rgxJSONClassArgs)(json, "RGXLookbehindToken", RGXLookbehindToken.validateJSONArgs);
36
+ return new RGXLookbehindToken(tokens === undefined ? [] : (0, json_1.rgxTokenFromJSON)(tokens), positive ?? true);
37
+ }
38
+ toJSON() {
39
+ return (0, json_1.createRGXJSONClassToken)("RGXLookbehindToken", [(0, json_1.rgxTokenToJSON)(this.tokens.tokens), this.positive]);
40
+ }
29
41
  }
30
42
  exports.RGXLookbehindToken = RGXLookbehindToken;
31
43
  RGXLookbehindToken.check = (0, utils_1.createRGXClassGuardFunction)(RGXLookbehindToken);
@@ -1,4 +1,4 @@
1
- import { RGXGroupedToken, RGXToken } from "../types";
1
+ import { RGXGroupedToken, RGXJSONClassToken, RGXJSONValue, RGXToken } from "../types";
2
2
  import { RGXClassToken } from "./base";
3
3
  import { CloneDepth } from "@ptolemy2002/immutability-utils";
4
4
  export declare class RGXRepeatToken extends RGXClassToken {
@@ -19,5 +19,8 @@ export declare class RGXRepeatToken extends RGXClassToken {
19
19
  get repeaterSuffix(): string;
20
20
  toRgx(): RGXToken;
21
21
  clone(depth?: CloneDepth): RGXRepeatToken;
22
+ static validateJSONArgs(args: RGXJSONValue[]): boolean | string;
23
+ static fromJSON(json: RGXJSONClassToken): RGXRepeatToken;
24
+ toJSON(): RGXJSONClassToken;
22
25
  }
23
26
  export declare const rgxRepeat: (token: RGXToken, min?: number | undefined, max?: number | null | undefined, lazy?: boolean | undefined) => RGXRepeatToken;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rgxRepeat = exports.RGXRepeatToken = void 0;
4
+ const json_1 = require("../json");
4
5
  const base_1 = require("./base");
5
6
  const group_1 = require("./group");
6
7
  const typeGuards_1 = require("../typeGuards");
@@ -97,6 +98,28 @@ class RGXRepeatToken extends base_1.RGXClassToken {
97
98
  return this;
98
99
  return new RGXRepeatToken((0, clone_1.cloneRGXToken)(this.token, (0, immutability_utils_1.depthDecrement)(depth, 1)), this.min, this.max);
99
100
  }
101
+ static validateJSONArgs(args) {
102
+ if (args.length < 1 || args.length > 4)
103
+ return "Expected between 1 and 4 arguments (token, min, max, lazy).";
104
+ const [token, min, max, lazy] = args;
105
+ if (!(0, typeGuards_1.isRGXJSONToken)(token))
106
+ return "Argument 0 (token) must be a JSON token.";
107
+ if (min !== undefined && typeof min !== "number")
108
+ return "Argument 1 (min) must be a number, if present.";
109
+ if (max !== undefined && max !== null && typeof max !== "number")
110
+ return "Argument 2 (max) must be a number or null, if present.";
111
+ if (lazy !== undefined && typeof lazy !== "boolean")
112
+ return "Argument 3 (lazy) must be a boolean, if present.";
113
+ return true;
114
+ }
115
+ static fromJSON(json) {
116
+ const [token, min, max, lazy] = (0, json_1.rgxJSONClassArgs)(json, "RGXRepeatToken", RGXRepeatToken.validateJSONArgs);
117
+ const resolvedMin = min ?? 1;
118
+ return new RGXRepeatToken((0, json_1.rgxTokenFromJSON)(token), resolvedMin, max === undefined ? resolvedMin : max, lazy ?? false);
119
+ }
120
+ toJSON() {
121
+ return (0, json_1.createRGXJSONClassToken)("RGXRepeatToken", [(0, json_1.rgxTokenToJSON)(this.token), this.min, this.max, this.lazy]);
122
+ }
100
123
  }
101
124
  exports.RGXRepeatToken = RGXRepeatToken;
102
125
  RGXRepeatToken.check = (0, utils_1.createRGXClassGuardFunction)(RGXRepeatToken);
@@ -1,4 +1,5 @@
1
1
  import { RGXClassToken } from "./base";
2
+ import { RGXJSONClassToken, RGXJSONValue } from "../types";
2
3
  import { CloneDepth } from "@ptolemy2002/immutability-utils";
3
4
  export declare class RGXSubpatternToken extends RGXClassToken {
4
5
  _pattern: string | number;
@@ -9,5 +10,8 @@ export declare class RGXSubpatternToken extends RGXClassToken {
9
10
  constructor(pattern: string | number);
10
11
  toRgx(): RegExp;
11
12
  clone(depth?: CloneDepth): RGXSubpatternToken;
13
+ static validateJSONArgs(args: RGXJSONValue[]): boolean | string;
14
+ static fromJSON(json: RGXJSONClassToken): RGXSubpatternToken;
15
+ toJSON(): RGXJSONClassToken;
12
16
  }
13
17
  export declare const rgxSubpattern: (pattern: string | number) => RGXSubpatternToken;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rgxSubpattern = exports.RGXSubpatternToken = void 0;
4
4
  const base_1 = require("./base");
5
+ const json_1 = require("../json");
5
6
  const typeGuards_1 = require("../typeGuards");
6
7
  const errors_1 = require("../errors");
7
8
  const internal_1 = require("../internal");
@@ -37,6 +38,20 @@ class RGXSubpatternToken extends base_1.RGXClassToken {
37
38
  return this;
38
39
  return new RGXSubpatternToken(this.pattern);
39
40
  }
41
+ static validateJSONArgs(args) {
42
+ if (args.length !== 1)
43
+ return "Expected exactly 1 argument (pattern).";
44
+ if (typeof args[0] !== "string" && typeof args[0] !== "number")
45
+ return "Argument 0 (pattern) must be a string or number.";
46
+ return true;
47
+ }
48
+ static fromJSON(json) {
49
+ const [pattern] = (0, json_1.rgxJSONClassArgs)(json, "RGXSubpatternToken", RGXSubpatternToken.validateJSONArgs);
50
+ return new RGXSubpatternToken(pattern);
51
+ }
52
+ toJSON() {
53
+ return (0, json_1.createRGXJSONClassToken)("RGXSubpatternToken", [this.pattern]);
54
+ }
40
55
  }
41
56
  exports.RGXSubpatternToken = RGXSubpatternToken;
42
57
  RGXSubpatternToken.check = (0, utils_1.createRGXClassGuardFunction)(RGXSubpatternToken);
@@ -7,7 +7,11 @@ const union_1 = require("./union");
7
7
  const collection_1 = require("../collection");
8
8
  const group_1 = require("./group");
9
9
  const wrapper_1 = require("./wrapper");
10
+ const json_1 = require("../json");
10
11
  function toRGXClassToken(token) {
12
+ // JSON class tokens become class tokens and JSON literal tokens become literal tokens (which get wrapped below).
13
+ if ((0, typeGuards_1.isRGXJSONObjectToken)(token, false))
14
+ token = (0, json_1.rgxTokenFromJSON)(token);
11
15
  if (base_1.RGXClassToken.check(token))
12
16
  return token;
13
17
  if ((0, typeGuards_1.isRGXArrayToken)(token))
@@ -2,6 +2,7 @@ import { RGXToken } from "../types";
2
2
  import { RGXTokenCollection, RGXTokenCollectionInput } from "../collection";
3
3
  import { RGXClassToken } from "./base";
4
4
  import { CloneDepth } from "@ptolemy2002/immutability-utils";
5
+ import { RGXJSONClassToken, RGXJSONValue } from "../types";
5
6
  export type RGXUnionInsertionPosition = 'prefix' | 'suffix';
6
7
  export declare class RGXClassUnionToken extends RGXClassToken {
7
8
  tokens: RGXTokenCollection;
@@ -13,6 +14,9 @@ export declare class RGXClassUnionToken extends RGXClassToken {
13
14
  concat(pos?: RGXUnionInsertionPosition, ...others: RGXTokenCollectionInput[]): this;
14
15
  toRgx(): RegExp;
15
16
  clone(depth?: CloneDepth): RGXClassUnionToken;
17
+ static validateJSONArgs(args: RGXJSONValue[]): boolean | string;
18
+ static fromJSON(json: RGXJSONClassToken): RGXClassUnionToken;
19
+ toJSON(): RGXJSONClassToken;
16
20
  }
17
21
  export declare function expandRgxUnionTokens(...tokens: RGXTokenCollectionInput[]): RGXTokenCollection;
18
22
  export declare function removeRgxUnionDuplicates(...tokens: RGXTokenCollectionInput[]): RGXTokenCollection;
@@ -8,6 +8,8 @@ const collection_1 = require("../collection");
8
8
  const base_1 = require("./base");
9
9
  const immutability_utils_1 = require("@ptolemy2002/immutability-utils");
10
10
  const utils_1 = require("../utils");
11
+ const json_1 = require("../json");
12
+ const typeGuards_1 = require("../typeGuards");
11
13
  class RGXClassUnionToken extends base_1.RGXClassToken {
12
14
  constructor(tokens = []) {
13
15
  super();
@@ -51,6 +53,20 @@ class RGXClassUnionToken extends base_1.RGXClassToken {
51
53
  return this;
52
54
  return new RGXClassUnionToken(this.tokens.clone((0, immutability_utils_1.depthDecrement)(depth, 1)));
53
55
  }
56
+ static validateJSONArgs(args) {
57
+ if (args.length > 1)
58
+ return "Expected at most 1 argument (tokens).";
59
+ if (args.length === 1 && !(0, typeGuards_1.isRGXJSONToken)(args[0]))
60
+ return "Argument 0 (tokens) must be a JSON token.";
61
+ return true;
62
+ }
63
+ static fromJSON(json) {
64
+ const [tokens] = (0, json_1.rgxJSONClassArgs)(json, "RGXClassUnionToken", RGXClassUnionToken.validateJSONArgs);
65
+ return new RGXClassUnionToken(tokens === undefined ? [] : (0, json_1.rgxTokenFromJSON)(tokens));
66
+ }
67
+ toJSON() {
68
+ return (0, json_1.createRGXJSONClassToken)("RGXClassUnionToken", [(0, json_1.rgxTokenToJSON)(this.tokens.tokens)]);
69
+ }
54
70
  }
55
71
  exports.RGXClassUnionToken = RGXClassUnionToken;
56
72
  RGXClassUnionToken.check = (0, utils_1.createRGXClassGuardFunction)(RGXClassUnionToken);
@@ -75,8 +91,10 @@ function expandRgxUnionTokens(...tokens) {
75
91
  }
76
92
  function removeRgxUnionDuplicates(...tokens) {
77
93
  let uniqueTokens = [...new Set(tokens)];
78
- // Handle RegExp objects separately since they are not considered equal even if they have the same pattern and flags
94
+ // Handle RegExp objects separately since they are not considered equal even if they have the same pattern and flags.
95
+ // JSON object tokens get the same treatment, compared by their serialized form.
79
96
  const seenRegexes = new Set();
97
+ const seenJSON = new Set();
80
98
  uniqueTokens = uniqueTokens.filter(token => {
81
99
  if (token instanceof RegExp) {
82
100
  const regexString = token.toString();
@@ -88,6 +106,16 @@ function removeRgxUnionDuplicates(...tokens) {
88
106
  return true;
89
107
  }
90
108
  }
109
+ if ((0, typeGuards_1.isRGXJSONObjectToken)(token, false)) {
110
+ const jsonString = JSON.stringify(token);
111
+ if (seenJSON.has(jsonString)) {
112
+ return false;
113
+ }
114
+ else {
115
+ seenJSON.add(jsonString);
116
+ return true;
117
+ }
118
+ }
91
119
  return true;
92
120
  });
93
121
  return new collection_1.RGXTokenCollection(uniqueTokens, 'union');
@@ -1,4 +1,4 @@
1
- import { RGXToken } from "../types";
1
+ import { RGXJSONClassToken, RGXJSONValue, RGXToken } from "../types";
2
2
  import { RGXClassToken } from "./base";
3
3
  import { CloneDepth } from "@ptolemy2002/immutability-utils";
4
4
  export declare class RGXClassWrapperToken extends RGXClassToken {
@@ -11,5 +11,8 @@ export declare class RGXClassWrapperToken extends RGXClassToken {
11
11
  unwrap(): RGXToken;
12
12
  toRgx(): RGXToken;
13
13
  clone(depth?: CloneDepth): RGXClassWrapperToken;
14
+ static validateJSONArgs(args: RGXJSONValue[]): boolean | string;
15
+ static fromJSON(json: RGXJSONClassToken): RGXClassWrapperToken;
16
+ toJSON(): RGXJSONClassToken;
14
17
  }
15
18
  export declare const rgxClassWrapper: (token: RGXToken) => RGXClassWrapperToken;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rgxClassWrapper = exports.RGXClassWrapperToken = void 0;
4
+ const json_1 = require("../json");
4
5
  const base_1 = require("./base");
5
6
  const typeGuards_1 = require("../typeGuards");
6
7
  const internal_1 = require("../internal");
@@ -16,8 +17,10 @@ class RGXClassWrapperToken extends base_1.RGXClassToken {
16
17
  return (0, typeGuards_1.isRGXGroupedToken)(this.token);
17
18
  }
18
19
  get rgxIsRepeatable() {
19
- if ((0, typeGuards_1.isRGXToken)(this.token, 'convertible'))
20
- return this.token.rgxIsRepeatable ?? true;
20
+ // JSON tokens become literal or class tokens, so check the converted token instead.
21
+ const token = (0, typeGuards_1.isRGXJSONObjectToken)(this.token, false) ? (0, json_1.rgxTokenFromJSON)(this.token) : this.token;
22
+ if ((0, typeGuards_1.isRGXToken)(token, 'convertible', true, false))
23
+ return token.rgxIsRepeatable ?? true;
21
24
  // Assume any other token is repeatable, since we don't know its implementation.
22
25
  return true;
23
26
  }
@@ -32,6 +35,20 @@ class RGXClassWrapperToken extends base_1.RGXClassToken {
32
35
  return this;
33
36
  return new RGXClassWrapperToken((0, clone_1.cloneRGXToken)(this.token, (0, immutability_utils_1.depthDecrement)(depth, 1)));
34
37
  }
38
+ static validateJSONArgs(args) {
39
+ if (args.length !== 1)
40
+ return "Expected exactly 1 argument (token).";
41
+ if (!(0, typeGuards_1.isRGXJSONToken)(args[0]))
42
+ return "Argument 0 (token) must be a JSON token.";
43
+ return true;
44
+ }
45
+ static fromJSON(json) {
46
+ const [token] = (0, json_1.rgxJSONClassArgs)(json, "RGXClassWrapperToken", RGXClassWrapperToken.validateJSONArgs);
47
+ return new RGXClassWrapperToken((0, json_1.rgxTokenFromJSON)(token));
48
+ }
49
+ toJSON() {
50
+ return (0, json_1.createRGXJSONClassToken)("RGXClassWrapperToken", [(0, json_1.rgxTokenToJSON)(this.token)]);
51
+ }
35
52
  }
36
53
  exports.RGXClassWrapperToken = RGXClassWrapperToken;
37
54
  RGXClassWrapperToken.check = (0, utils_1.createRGXClassGuardFunction)(RGXClassWrapperToken);
@@ -1,4 +1,4 @@
1
- export type RGXErrorCode = 'UNKNOWN' | 'INVALID_RGX_TOKEN' | 'INVALID_REGEX_STRING' | 'INVALID_REGEX_FLAGS' | 'INVALID_VANILLA_REGEX_FLAGS' | 'NOT_IMPLEMENTED' | 'NOT_SUPPORTED' | 'INVALID_IDENTIFIER' | 'OUT_OF_BOUNDS' | 'INVALID_FLAG_TRANSFORMER_KEY' | 'FLAG_TRANSFORMER_CONFLICT' | 'CONSTANT_CONFLICT' | 'INVALID_CONSTANT_KEY' | 'INSERTION_REJECTED' | 'REGEX_NOT_MATCHED_AT_POSITION' | 'REGEX_NOT_MATCHED_AFTER_POSITION' | 'PART_VALIDATION_FAILED' | 'INVALID_LEXER_MODE' | 'LEXEME_NOT_MATCHED_AT_POSITION' | 'INVALID_RGX_LEXER' | 'INVALID_RGX_WALKER' | 'INVALID_RGX_PART' | 'NOT_DIRECT_REGEXP' | 'CURRENT_TOKEN_NOT_FOUND' | 'INVALID_REGEX_LOCALIZABLE_FLAG_DIFF' | 'INVALID_REGEX_LOCALIZABLE_FLAGS';
1
+ export type RGXErrorCode = 'UNKNOWN' | 'INVALID_RGX_TOKEN' | 'INVALID_REGEX_STRING' | 'INVALID_REGEX_FLAGS' | 'INVALID_VANILLA_REGEX_FLAGS' | 'NOT_IMPLEMENTED' | 'NOT_SUPPORTED' | 'INVALID_IDENTIFIER' | 'OUT_OF_BOUNDS' | 'INVALID_FLAG_TRANSFORMER_KEY' | 'FLAG_TRANSFORMER_CONFLICT' | 'CONSTANT_CONFLICT' | 'INVALID_CONSTANT_KEY' | 'INSERTION_REJECTED' | 'REGEX_NOT_MATCHED_AT_POSITION' | 'REGEX_NOT_MATCHED_AFTER_POSITION' | 'PART_VALIDATION_FAILED' | 'INVALID_LEXER_MODE' | 'LEXEME_NOT_MATCHED_AT_POSITION' | 'INVALID_RGX_LEXER' | 'INVALID_RGX_WALKER' | 'INVALID_RGX_PART' | 'NOT_DIRECT_REGEXP' | 'CURRENT_TOKEN_NOT_FOUND' | 'INVALID_REGEX_LOCALIZABLE_FLAG_DIFF' | 'INVALID_REGEX_LOCALIZABLE_FLAGS' | 'INVALID_RGX_JSON_TOKEN' | 'JSON_CLASS_CONFLICT' | 'INVALID_JSON_CLASS_KEY' | 'JSON_CLASS_ARGS_VALIDATION_FAILED' | 'NOT_JSON_SERIALIZABLE';
2
2
  export declare class RGXError extends Error {
3
3
  _message: string;
4
4
  code: RGXErrorCode;
@@ -24,3 +24,8 @@ export * from './notDirectRegexp';
24
24
  export * from './currentTokenNotFound';
25
25
  export * from './invalidRegexLocalizableFlagDiff';
26
26
  export * from './invalidRegexLocalizableFlags';
27
+ export * from './invalidJSONToken';
28
+ export * from './jsonClassConflict';
29
+ export * from './invalidJSONClassKey';
30
+ export * from './jsonClassArgsValidationFailed';
31
+ export * from './notJSONSerializable';
@@ -40,3 +40,8 @@ __exportStar(require("./notDirectRegexp"), exports);
40
40
  __exportStar(require("./currentTokenNotFound"), exports);
41
41
  __exportStar(require("./invalidRegexLocalizableFlagDiff"), exports);
42
42
  __exportStar(require("./invalidRegexLocalizableFlags"), exports);
43
+ __exportStar(require("./invalidJSONToken"), exports);
44
+ __exportStar(require("./jsonClassConflict"), exports);
45
+ __exportStar(require("./invalidJSONClassKey"), exports);
46
+ __exportStar(require("./jsonClassArgsValidationFailed"), exports);
47
+ __exportStar(require("./notJSONSerializable"), exports);
@@ -0,0 +1,6 @@
1
+ import { RGXError } from "./base";
2
+ export declare class RGXInvalidJSONClassKeyError extends RGXError {
3
+ got: string;
4
+ constructor(message: string, got: string);
5
+ calcMessage(message: string): string;
6
+ }