@ptolemy2002/rgx 2.0.0 → 2.0.2
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/dist/index.d.ts +7 -37
- package/dist/index.js +32 -117
- package/dist/type-guards.d.ts +15 -0
- package/dist/type-guards.js +143 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.js +5 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,38 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { MaybeArray } from "@ptolemy2002/ts-utils";
|
|
1
|
+
import * as t from "./types";
|
|
3
2
|
export * from "./errors";
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export type RGXToken = RGXNativeToken | RGXLiteralToken | RGXConvertibleToken | RGXToken[];
|
|
11
|
-
export type RGXTokenType = 'no-op' | 'literal' | 'native' | 'convertible' | RGXTokenType[];
|
|
12
|
-
export type RGXTokenFromType<T extends RGXTokenType> = T extends 'no-op' ? RGXNoOpToken : T extends 'literal' ? RGXLiteralToken : T extends 'native' ? RGXNativeToken : T extends 'convertible' ? RGXConvertibleToken : T extends RGXTokenType[] ? {
|
|
13
|
-
[K in keyof T]: T[K] extends RGXTokenType ? RGXTokenFromType<T[K]> : never;
|
|
14
|
-
} : never;
|
|
15
|
-
export declare const validRegexSymbol: unique symbol;
|
|
16
|
-
export type ValidRegexBrandSymbol = typeof validRegexSymbol;
|
|
17
|
-
export type ValidRegexString = Branded<string, [ValidRegexBrandSymbol]>;
|
|
18
|
-
export declare const validVanillaRegexFlagsSymbol: unique symbol;
|
|
19
|
-
export type ValidVanillaRegexFlagsBrandSymbol = typeof validVanillaRegexFlagsSymbol;
|
|
20
|
-
export type ValidVanillaRegexFlags = Branded<string, [ValidVanillaRegexFlagsBrandSymbol]>;
|
|
21
|
-
export declare function isRGXNoOpToken(value: unknown): value is RGXNoOpToken;
|
|
22
|
-
export declare function assertRGXNoOpToken(value: unknown): asserts value is RGXNoOpToken;
|
|
23
|
-
export declare function isRGXLiteralToken(value: unknown): value is RGXLiteralToken;
|
|
24
|
-
export declare function assertRGXLiteralToken(value: unknown): asserts value is RGXLiteralToken;
|
|
25
|
-
export declare function isRGXNativeToken(value: unknown): value is RGXNativeToken;
|
|
26
|
-
export declare function assertRGXNativeToken(value: unknown): asserts value is RGXNativeToken;
|
|
27
|
-
export declare function isRGXConvertibleToken(value: unknown): value is RGXConvertibleToken;
|
|
28
|
-
export declare function assertRGXConvertibleToken(value: unknown): asserts value is RGXConvertibleToken;
|
|
29
|
-
export declare function rgxTokenType(value: RGXToken): RGXTokenType;
|
|
30
|
-
export declare function rgxTokenFromType<T extends RGXTokenType>(type: T, value: RGXToken): RGXTokenFromType<T>;
|
|
31
|
-
export declare function isValidRegexString(value: string): value is ValidRegexString;
|
|
32
|
-
export declare function assertValidRegexString(value: string): asserts value is ValidRegexString;
|
|
33
|
-
export declare function isValidVanillaRegexFlags(value: string): value is ValidVanillaRegexFlags;
|
|
34
|
-
export declare function assertValidVanillaRegexFlags(value: string): asserts value is ValidVanillaRegexFlags;
|
|
35
|
-
export declare function escapeRegex(value: string): ValidRegexString;
|
|
36
|
-
export declare function resolveRGXToken(token: RGXToken): ValidRegexString;
|
|
37
|
-
export declare function rgxConcat(tokens: RGXToken[]): ValidRegexString;
|
|
38
|
-
export default function rgx(flags?: string): (strings: TemplateStringsArray, ...tokens: RGXToken[]) => RegExp;
|
|
3
|
+
export * from "./types";
|
|
4
|
+
export * from "./type-guards";
|
|
5
|
+
export declare function escapeRegex(value: string): t.ValidRegexString;
|
|
6
|
+
export declare function resolveRGXToken(token: t.RGXToken): t.ValidRegexString;
|
|
7
|
+
export declare function rgxConcat(tokens: t.RGXToken[]): t.ValidRegexString;
|
|
8
|
+
export default function rgx(flags?: string): (strings: TemplateStringsArray, ...tokens: t.RGXToken[]) => RegExp;
|
package/dist/index.js
CHANGED
|
@@ -10,137 +10,52 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
10
10
|
if (k2 === undefined) k2 = k;
|
|
11
11
|
o[k2] = m[k];
|
|
12
12
|
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
13
35
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
36
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
37
|
};
|
|
16
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
17
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
18
|
-
};
|
|
19
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.validVanillaRegexFlagsSymbol = exports.validRegexSymbol = void 0;
|
|
21
|
-
exports.isRGXNoOpToken = isRGXNoOpToken;
|
|
22
|
-
exports.assertRGXNoOpToken = assertRGXNoOpToken;
|
|
23
|
-
exports.isRGXLiteralToken = isRGXLiteralToken;
|
|
24
|
-
exports.assertRGXLiteralToken = assertRGXLiteralToken;
|
|
25
|
-
exports.isRGXNativeToken = isRGXNativeToken;
|
|
26
|
-
exports.assertRGXNativeToken = assertRGXNativeToken;
|
|
27
|
-
exports.isRGXConvertibleToken = isRGXConvertibleToken;
|
|
28
|
-
exports.assertRGXConvertibleToken = assertRGXConvertibleToken;
|
|
29
|
-
exports.rgxTokenType = rgxTokenType;
|
|
30
|
-
exports.rgxTokenFromType = rgxTokenFromType;
|
|
31
|
-
exports.isValidRegexString = isValidRegexString;
|
|
32
|
-
exports.assertValidRegexString = assertValidRegexString;
|
|
33
|
-
exports.isValidVanillaRegexFlags = isValidVanillaRegexFlags;
|
|
34
|
-
exports.assertValidVanillaRegexFlags = assertValidVanillaRegexFlags;
|
|
35
39
|
exports.escapeRegex = escapeRegex;
|
|
36
40
|
exports.resolveRGXToken = resolveRGXToken;
|
|
37
41
|
exports.rgxConcat = rgxConcat;
|
|
38
42
|
exports.default = rgx;
|
|
39
|
-
const
|
|
40
|
-
const
|
|
43
|
+
const e = __importStar(require("./errors"));
|
|
44
|
+
const tg = __importStar(require("./type-guards"));
|
|
41
45
|
__exportStar(require("./errors"), exports);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
function isRGXNoOpToken(value) {
|
|
45
|
-
return value === null || value === undefined;
|
|
46
|
-
}
|
|
47
|
-
function assertRGXNoOpToken(value) {
|
|
48
|
-
if (!isRGXNoOpToken(value)) {
|
|
49
|
-
throw new errors_1.RGXInvalidTokenError(`Invalid no-op token`, 'null or undefined', value);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
function isRGXLiteralToken(value) {
|
|
53
|
-
return value instanceof RegExp;
|
|
54
|
-
}
|
|
55
|
-
function assertRGXLiteralToken(value) {
|
|
56
|
-
if (!isRGXLiteralToken(value)) {
|
|
57
|
-
throw new errors_1.RGXInvalidTokenError(`Invalid literal token`, 'RegExp', value);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function isRGXNativeToken(value) {
|
|
61
|
-
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || isRGXNoOpToken(value);
|
|
62
|
-
}
|
|
63
|
-
function assertRGXNativeToken(value) {
|
|
64
|
-
if (!isRGXNativeToken(value)) {
|
|
65
|
-
throw new errors_1.RGXInvalidTokenError(`Invalid native token`, 'string, number, boolean, null, or undefined', value);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
function isRGXConvertibleToken(value) {
|
|
69
|
-
if (typeof value === 'object' && value !== null && 'toRgx' in value) {
|
|
70
|
-
if ((0, is_callable_1.default)(value.toRgx)) {
|
|
71
|
-
const returnValue = value.toRgx();
|
|
72
|
-
if (Array.isArray(returnValue)) {
|
|
73
|
-
return returnValue.every(value => isRGXNativeToken(value) || isRGXLiteralToken(value));
|
|
74
|
-
}
|
|
75
|
-
return isRGXNativeToken(returnValue) || isRGXLiteralToken(returnValue);
|
|
76
|
-
}
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
function assertRGXConvertibleToken(value) {
|
|
82
|
-
if (!isRGXConvertibleToken(value)) {
|
|
83
|
-
throw new errors_1.RGXInvalidTokenError(`Invalid convertible token`, 'object with a toRgx method that returns a valid token', value);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
function rgxTokenType(value) {
|
|
87
|
-
if (isRGXNoOpToken(value))
|
|
88
|
-
return 'no-op';
|
|
89
|
-
if (isRGXLiteralToken(value))
|
|
90
|
-
return 'literal';
|
|
91
|
-
if (isRGXNativeToken(value))
|
|
92
|
-
return 'native';
|
|
93
|
-
if (isRGXConvertibleToken(value))
|
|
94
|
-
return 'convertible';
|
|
95
|
-
if (Array.isArray(value))
|
|
96
|
-
return value.map(rgxTokenType);
|
|
97
|
-
// Ignoring this line since it should be impossible to reach if the types are correct, but we need it to satisfy the return type
|
|
98
|
-
/* istanbul ignore next */
|
|
99
|
-
throw new errors_1.RGXInvalidTokenError(`Invalid RGX token: ${value}`, null, value);
|
|
100
|
-
}
|
|
101
|
-
function rgxTokenFromType(type, value) {
|
|
102
|
-
// Ignoring this line because the function is entirely a TypeScript utility that doesn't need to be tested at runtime.
|
|
103
|
-
/* istanbul ignore next */
|
|
104
|
-
return value;
|
|
105
|
-
}
|
|
106
|
-
function isValidRegexString(value) {
|
|
107
|
-
try {
|
|
108
|
-
new RegExp(value);
|
|
109
|
-
return true;
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
function assertValidRegexString(value) {
|
|
116
|
-
if (!isValidRegexString(value)) {
|
|
117
|
-
throw new errors_1.RGXInvalidRegexStringError(`Invalid regex string: ${value}`, value);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
function isValidVanillaRegexFlags(value) {
|
|
121
|
-
const patternMatch = /^[gimsuy]*$/.test(value);
|
|
122
|
-
if (!patternMatch)
|
|
123
|
-
return false;
|
|
124
|
-
// No repeated flags allowed
|
|
125
|
-
const flagsSet = new Set(value);
|
|
126
|
-
return flagsSet.size === value.length;
|
|
127
|
-
}
|
|
128
|
-
function assertValidVanillaRegexFlags(value) {
|
|
129
|
-
if (!isValidVanillaRegexFlags(value)) {
|
|
130
|
-
throw new errors_1.RGXInvalidVanillaRegexFlagsError(`Invalid vanilla regex flags: ${value}`, value);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
46
|
+
__exportStar(require("./types"), exports);
|
|
47
|
+
__exportStar(require("./type-guards"), exports);
|
|
133
48
|
function escapeRegex(value) {
|
|
134
49
|
return value.replaceAll(/[\-\^\$.*+?^${}()|[\]\\]/g, '\\$&');
|
|
135
50
|
}
|
|
136
51
|
function resolveRGXToken(token) {
|
|
137
|
-
if (isRGXNoOpToken(token))
|
|
52
|
+
if (tg.isRGXNoOpToken(token))
|
|
138
53
|
return '';
|
|
139
|
-
if (isRGXLiteralToken(token))
|
|
54
|
+
if (tg.isRGXLiteralToken(token))
|
|
140
55
|
return '(?:' + token.source + ')';
|
|
141
|
-
if (isRGXNativeToken(token))
|
|
56
|
+
if (tg.isRGXNativeToken(token))
|
|
142
57
|
return escapeRegex(String(token));
|
|
143
|
-
if (isRGXConvertibleToken(token)) {
|
|
58
|
+
if (tg.isRGXConvertibleToken(token)) {
|
|
144
59
|
return resolveRGXToken(token.toRgx());
|
|
145
60
|
}
|
|
146
61
|
// Interpret arrays as unions
|
|
@@ -154,14 +69,14 @@ function resolveRGXToken(token) {
|
|
|
154
69
|
}
|
|
155
70
|
// Ignoring this line since it should be impossible to reach if the types are correct, but we need it to satisfy the return type
|
|
156
71
|
/* istanbul ignore next */
|
|
157
|
-
throw new
|
|
72
|
+
throw new e.RGXInvalidTokenError(`Invalid RGX token: ${token}`, null, token);
|
|
158
73
|
}
|
|
159
74
|
// Wrapper for letting an array of tokens be resolved as a concatenation instead of a union.
|
|
160
75
|
function rgxConcat(tokens) {
|
|
161
76
|
return tokens.map(resolveRGXToken).join('');
|
|
162
77
|
}
|
|
163
78
|
function rgx(flags = '') {
|
|
164
|
-
assertValidVanillaRegexFlags(flags);
|
|
79
|
+
tg.assertValidVanillaRegexFlags(flags);
|
|
165
80
|
return (strings, ...tokens) => {
|
|
166
81
|
let pattern = '';
|
|
167
82
|
const resolvedTokens = tokens.map(resolveRGXToken);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as t from "./types";
|
|
2
|
+
export declare function isRGXNoOpToken(value: unknown): value is t.RGXNoOpToken;
|
|
3
|
+
export declare function assertRGXNoOpToken(value: unknown): asserts value is t.RGXNoOpToken;
|
|
4
|
+
export declare function isRGXLiteralToken(value: unknown): value is t.RGXLiteralToken;
|
|
5
|
+
export declare function assertRGXLiteralToken(value: unknown): asserts value is t.RGXLiteralToken;
|
|
6
|
+
export declare function isRGXNativeToken(value: unknown): value is t.RGXNativeToken;
|
|
7
|
+
export declare function assertRGXNativeToken(value: unknown): asserts value is t.RGXNativeToken;
|
|
8
|
+
export declare function isRGXConvertibleToken(value: unknown): value is t.RGXConvertibleToken;
|
|
9
|
+
export declare function assertRGXConvertibleToken(value: unknown): asserts value is t.RGXConvertibleToken;
|
|
10
|
+
export declare function rgxTokenType(value: t.RGXToken): t.RGXTokenType;
|
|
11
|
+
export declare function rgxTokenFromType<T extends t.RGXTokenType>(type: T, value: t.RGXToken): t.RGXTokenFromType<T>;
|
|
12
|
+
export declare function isValidRegexString(value: string): value is t.ValidRegexString;
|
|
13
|
+
export declare function assertValidRegexString(value: string): asserts value is t.ValidRegexString;
|
|
14
|
+
export declare function isValidVanillaRegexFlags(value: string): value is t.ValidVanillaRegexFlags;
|
|
15
|
+
export declare function assertValidVanillaRegexFlags(value: string): asserts value is t.ValidVanillaRegexFlags;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.isRGXNoOpToken = isRGXNoOpToken;
|
|
40
|
+
exports.assertRGXNoOpToken = assertRGXNoOpToken;
|
|
41
|
+
exports.isRGXLiteralToken = isRGXLiteralToken;
|
|
42
|
+
exports.assertRGXLiteralToken = assertRGXLiteralToken;
|
|
43
|
+
exports.isRGXNativeToken = isRGXNativeToken;
|
|
44
|
+
exports.assertRGXNativeToken = assertRGXNativeToken;
|
|
45
|
+
exports.isRGXConvertibleToken = isRGXConvertibleToken;
|
|
46
|
+
exports.assertRGXConvertibleToken = assertRGXConvertibleToken;
|
|
47
|
+
exports.rgxTokenType = rgxTokenType;
|
|
48
|
+
exports.rgxTokenFromType = rgxTokenFromType;
|
|
49
|
+
exports.isValidRegexString = isValidRegexString;
|
|
50
|
+
exports.assertValidRegexString = assertValidRegexString;
|
|
51
|
+
exports.isValidVanillaRegexFlags = isValidVanillaRegexFlags;
|
|
52
|
+
exports.assertValidVanillaRegexFlags = assertValidVanillaRegexFlags;
|
|
53
|
+
const e = __importStar(require("./errors"));
|
|
54
|
+
const is_callable_1 = __importDefault(require("is-callable"));
|
|
55
|
+
function isRGXNoOpToken(value) {
|
|
56
|
+
return value === null || value === undefined;
|
|
57
|
+
}
|
|
58
|
+
function assertRGXNoOpToken(value) {
|
|
59
|
+
if (!isRGXNoOpToken(value)) {
|
|
60
|
+
throw new e.RGXInvalidTokenError(`Invalid no-op token`, 'null or undefined', value);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function isRGXLiteralToken(value) {
|
|
64
|
+
return value instanceof RegExp;
|
|
65
|
+
}
|
|
66
|
+
function assertRGXLiteralToken(value) {
|
|
67
|
+
if (!isRGXLiteralToken(value)) {
|
|
68
|
+
throw new e.RGXInvalidTokenError(`Invalid literal token`, 'RegExp', value);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function isRGXNativeToken(value) {
|
|
72
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || isRGXNoOpToken(value);
|
|
73
|
+
}
|
|
74
|
+
function assertRGXNativeToken(value) {
|
|
75
|
+
if (!isRGXNativeToken(value)) {
|
|
76
|
+
throw new e.RGXInvalidTokenError(`Invalid native token`, 'string, number, boolean, null, or undefined', value);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function isRGXConvertibleToken(value) {
|
|
80
|
+
if (typeof value === 'object' && value !== null && 'toRgx' in value) {
|
|
81
|
+
if ((0, is_callable_1.default)(value.toRgx)) {
|
|
82
|
+
const returnValue = value.toRgx();
|
|
83
|
+
if (Array.isArray(returnValue)) {
|
|
84
|
+
return returnValue.every(value => isRGXNativeToken(value) || isRGXLiteralToken(value));
|
|
85
|
+
}
|
|
86
|
+
return isRGXNativeToken(returnValue) || isRGXLiteralToken(returnValue);
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
function assertRGXConvertibleToken(value) {
|
|
93
|
+
if (!isRGXConvertibleToken(value)) {
|
|
94
|
+
throw new e.RGXInvalidTokenError(`Invalid convertible token`, 'object with a toRgx method that returns a valid token', value);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function rgxTokenType(value) {
|
|
98
|
+
if (isRGXNoOpToken(value))
|
|
99
|
+
return 'no-op';
|
|
100
|
+
if (isRGXLiteralToken(value))
|
|
101
|
+
return 'literal';
|
|
102
|
+
if (isRGXNativeToken(value))
|
|
103
|
+
return 'native';
|
|
104
|
+
if (isRGXConvertibleToken(value))
|
|
105
|
+
return 'convertible';
|
|
106
|
+
if (Array.isArray(value))
|
|
107
|
+
return value.map(rgxTokenType);
|
|
108
|
+
// Ignoring this line since it should be impossible to reach if the types are correct, but we need it to satisfy the return type
|
|
109
|
+
/* istanbul ignore next */
|
|
110
|
+
throw new e.RGXInvalidTokenError(`Invalid RGX token: ${value}`, null, value);
|
|
111
|
+
}
|
|
112
|
+
function rgxTokenFromType(type, value) {
|
|
113
|
+
// Ignoring this line because the function is entirely a TypeScript utility that doesn't need to be tested at runtime.
|
|
114
|
+
/* istanbul ignore next */
|
|
115
|
+
return value;
|
|
116
|
+
}
|
|
117
|
+
function isValidRegexString(value) {
|
|
118
|
+
try {
|
|
119
|
+
new RegExp(value);
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function assertValidRegexString(value) {
|
|
127
|
+
if (!isValidRegexString(value)) {
|
|
128
|
+
throw new e.RGXInvalidRegexStringError(`Invalid regex string: ${value}`, value);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function isValidVanillaRegexFlags(value) {
|
|
132
|
+
const patternMatch = /^[gimsuy]*$/.test(value);
|
|
133
|
+
if (!patternMatch)
|
|
134
|
+
return false;
|
|
135
|
+
// No repeated flags allowed
|
|
136
|
+
const flagsSet = new Set(value);
|
|
137
|
+
return flagsSet.size === value.length;
|
|
138
|
+
}
|
|
139
|
+
function assertValidVanillaRegexFlags(value) {
|
|
140
|
+
if (!isValidVanillaRegexFlags(value)) {
|
|
141
|
+
throw new e.RGXInvalidVanillaRegexFlagsError(`Invalid vanilla regex flags: ${value}`, value);
|
|
142
|
+
}
|
|
143
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Branded } from "@ptolemy2002/ts-brand-utils";
|
|
2
|
+
import { MaybeArray } from "@ptolemy2002/ts-utils";
|
|
3
|
+
export type RGXNoOpToken = null | undefined;
|
|
4
|
+
export type RGXLiteralToken = RegExp;
|
|
5
|
+
export type RGXNativeToken = string | number | boolean | RGXNoOpToken;
|
|
6
|
+
export type RGXConvertibleToken = {
|
|
7
|
+
toRgx: () => MaybeArray<RGXNativeToken | RGXLiteralToken>;
|
|
8
|
+
};
|
|
9
|
+
export type RGXToken = RGXNativeToken | RGXLiteralToken | RGXConvertibleToken | RGXToken[];
|
|
10
|
+
export type RGXTokenType = 'no-op' | 'literal' | 'native' | 'convertible' | RGXTokenType[];
|
|
11
|
+
export type RGXTokenFromType<T extends RGXTokenType> = T extends 'no-op' ? RGXNoOpToken : T extends 'literal' ? RGXLiteralToken : T extends 'native' ? RGXNativeToken : T extends 'convertible' ? RGXConvertibleToken : T extends RGXTokenType[] ? {
|
|
12
|
+
[K in keyof T]: T[K] extends RGXTokenType ? RGXTokenFromType<T[K]> : never;
|
|
13
|
+
} : never;
|
|
14
|
+
export declare const validRegexSymbol: unique symbol;
|
|
15
|
+
export type ValidRegexBrandSymbol = typeof validRegexSymbol;
|
|
16
|
+
export type ValidRegexString = Branded<string, [ValidRegexBrandSymbol]>;
|
|
17
|
+
export declare const validVanillaRegexFlagsSymbol: unique symbol;
|
|
18
|
+
export type ValidVanillaRegexFlagsBrandSymbol = typeof validVanillaRegexFlagsSymbol;
|
|
19
|
+
export type ValidVanillaRegexFlags = Branded<string, [ValidVanillaRegexFlagsBrandSymbol]>;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validVanillaRegexFlagsSymbol = exports.validRegexSymbol = void 0;
|
|
4
|
+
exports.validRegexSymbol = Symbol('rgx.ValidRegex');
|
|
5
|
+
exports.validVanillaRegexFlagsSymbol = Symbol('rgx.ValidVanillaRegexFlags');
|