@alwaysmeticulous/session-filters 2.306.0 → 2.308.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/dist/__tests__/session-filters.spec.d.ts +2 -0
- package/dist/__tests__/session-filters.spec.d.ts.map +1 -0
- package/dist/__tests__/session-filters.spec.js +113 -0
- package/dist/__tests__/session-filters.spec.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/session-filters.d.ts +28 -0
- package/dist/session-filters.d.ts.map +1 -0
- package/dist/session-filters.js +107 -0
- package/dist/session-filters.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-filters.spec.d.ts","sourceRoot":"","sources":["../../src/__tests__/session-filters.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3754007a-7c83-5315-b646-b29f289c9aff")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
const vitest_1 = require("vitest");
|
|
6
|
+
const session_filters_1 = require("../session-filters");
|
|
7
|
+
(0, vitest_1.describe)("validateSessionFilter", () => {
|
|
8
|
+
(0, vitest_1.it)("accepts a valid filter", () => {
|
|
9
|
+
const result = (0, session_filters_1.validateSessionFilter)({
|
|
10
|
+
type: "session-start-url-matches-any-regex",
|
|
11
|
+
regexes: ["my-path/", "your-path/two/"],
|
|
12
|
+
});
|
|
13
|
+
(0, vitest_1.expect)(result).toEqual({
|
|
14
|
+
valid: true,
|
|
15
|
+
filter: {
|
|
16
|
+
type: "session-start-url-matches-any-regex",
|
|
17
|
+
regexes: ["my-path/", "your-path/two/"],
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
(0, vitest_1.it)("rejects non-object values", () => {
|
|
22
|
+
for (const value of [null, undefined, "filter", 42, ["a"]]) {
|
|
23
|
+
const result = (0, session_filters_1.validateSessionFilter)(value);
|
|
24
|
+
(0, vitest_1.expect)(result.valid).toBe(false);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.it)("rejects unknown filter types", () => {
|
|
28
|
+
const result = (0, session_filters_1.validateSessionFilter)({
|
|
29
|
+
type: "session-navigates-to",
|
|
30
|
+
regexes: ["a"],
|
|
31
|
+
});
|
|
32
|
+
(0, vitest_1.expect)(result).toMatchObject({ valid: false });
|
|
33
|
+
if (result.valid) {
|
|
34
|
+
throw new Error("expected invalid");
|
|
35
|
+
}
|
|
36
|
+
(0, vitest_1.expect)(result.error).toContain("Unknown session filter type");
|
|
37
|
+
});
|
|
38
|
+
(0, vitest_1.it)("rejects a missing or non-array regexes field", () => {
|
|
39
|
+
for (const regexes of [undefined, "a", { a: 1 }]) {
|
|
40
|
+
const result = (0, session_filters_1.validateSessionFilter)({
|
|
41
|
+
type: "session-start-url-matches-any-regex",
|
|
42
|
+
regexes,
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.expect)(result.valid).toBe(false);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
(0, vitest_1.it)("rejects an empty regexes list", () => {
|
|
48
|
+
const result = (0, session_filters_1.validateSessionFilter)({
|
|
49
|
+
type: "session-start-url-matches-any-regex",
|
|
50
|
+
regexes: [],
|
|
51
|
+
});
|
|
52
|
+
(0, vitest_1.expect)(result).toMatchObject({ valid: false });
|
|
53
|
+
if (result.valid) {
|
|
54
|
+
throw new Error("expected invalid");
|
|
55
|
+
}
|
|
56
|
+
(0, vitest_1.expect)(result.error).toContain("must not be empty");
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.it)("rejects non-string and empty-string regexes", () => {
|
|
59
|
+
for (const regexes of [[42], [""], ["ok", null]]) {
|
|
60
|
+
const result = (0, session_filters_1.validateSessionFilter)({
|
|
61
|
+
type: "session-start-url-matches-any-regex",
|
|
62
|
+
regexes,
|
|
63
|
+
});
|
|
64
|
+
(0, vitest_1.expect)(result.valid).toBe(false);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)("rejects more regexes than the maximum", () => {
|
|
68
|
+
const result = (0, session_filters_1.validateSessionFilter)({
|
|
69
|
+
type: "session-start-url-matches-any-regex",
|
|
70
|
+
regexes: Array.from({ length: session_filters_1.MAX_SESSION_FILTER_REGEXES + 1 }, () => "a"),
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.expect)(result.valid).toBe(false);
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.it)("rejects regexes that do not compile", () => {
|
|
75
|
+
const result = (0, session_filters_1.validateSessionFilter)({
|
|
76
|
+
type: "session-start-url-matches-any-regex",
|
|
77
|
+
regexes: ["valid", "(unclosed"],
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.expect)(result).toMatchObject({ valid: false });
|
|
80
|
+
if (result.valid) {
|
|
81
|
+
throw new Error("expected invalid");
|
|
82
|
+
}
|
|
83
|
+
(0, vitest_1.expect)(result.error).toContain('"(unclosed"');
|
|
84
|
+
(0, vitest_1.expect)(result.error).toContain("does not compile");
|
|
85
|
+
});
|
|
86
|
+
(0, vitest_1.it)("rejects regexes with features unsupported by the linear-time engine", () => {
|
|
87
|
+
// Backreferences and lookaheads are backtracking features that RE2
|
|
88
|
+
// (deliberately) does not support.
|
|
89
|
+
const result = (0, session_filters_1.validateSessionFilter)({
|
|
90
|
+
type: "session-start-url-matches-any-regex",
|
|
91
|
+
regexes: ["(?=lookahead)"],
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.expect)(result.valid).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
(0, vitest_1.describe)("compileSessionFilter", () => {
|
|
97
|
+
const matcher = (0, session_filters_1.compileSessionFilter)({
|
|
98
|
+
type: "session-start-url-matches-any-regex",
|
|
99
|
+
regexes: ["/checkout/", "^https://app\\.example\\.com/settings"],
|
|
100
|
+
});
|
|
101
|
+
(0, vitest_1.it)("matches a start URL matching any of the regexes", () => {
|
|
102
|
+
(0, vitest_1.expect)(matcher("https://shop.example.com/checkout/payment")).toBe(true);
|
|
103
|
+
(0, vitest_1.expect)(matcher("https://app.example.com/settings/profile")).toBe(true);
|
|
104
|
+
});
|
|
105
|
+
(0, vitest_1.it)("does not match a start URL matching none of the regexes", () => {
|
|
106
|
+
(0, vitest_1.expect)(matcher("https://app.example.com/dashboard")).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.it)("matches anywhere in the URL (unanchored) like the underlying engine", () => {
|
|
109
|
+
(0, vitest_1.expect)(matcher("https://example.com/a/checkout/b")).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=session-filters.spec.js.map
|
|
113
|
+
//# debugId=3754007a-7c83-5315-b646-b29f289c9aff
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-filters.spec.js","sources":["../../src/__tests__/session-filters.spec.ts"],"sourceRoot":"","names":[],"mappings":";;;;AAAA,mCAA8C;AAC9C,wDAI4B;AAE5B,IAAA,iBAAQ,EAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAA,WAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAAC;YACnC,IAAI,EAAE,qCAAqC;YAC3C,OAAO,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC;SACxC,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE;gBACN,IAAI,EAAE,qCAAqC;gBAC3C,OAAO,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC;aACxC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAAC,KAAK,CAAC,CAAC;YAC5C,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAAC;YACnC,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,CAAC,GAAG,CAAC;SACf,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QACD,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,KAAK,MAAM,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAAC;gBACnC,IAAI,EAAE,qCAAqC;gBAC3C,OAAO;aACR,CAAC,CAAC;YACH,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAAC;YACnC,IAAI,EAAE,qCAAqC;YAC3C,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QACD,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAAC;gBACnC,IAAI,EAAE,qCAAqC;gBAC3C,OAAO;aACR,CAAC,CAAC;YACH,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAAC;YACnC,IAAI,EAAE,qCAAqC;YAC3C,OAAO,EAAE,KAAK,CAAC,IAAI,CACjB,EAAE,MAAM,EAAE,4CAA0B,GAAG,CAAC,EAAE,EAC1C,GAAG,EAAE,CAAC,GAAG,CACV;SACF,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAAC;YACnC,IAAI,EAAE,qCAAqC;YAC3C,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;SAChC,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACtC,CAAC;QACD,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,mEAAmE;QACnE,mCAAmC;QACnC,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAAC;YACnC,IAAI,EAAE,qCAAqC;YAC3C,OAAO,EAAE,CAAC,eAAe,CAAC;SAC3B,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,MAAM,OAAO,GAAG,IAAA,sCAAoB,EAAC;QACnC,IAAI,EAAE,qCAAqC;QAC3C,OAAO,EAAE,CAAC,YAAY,EAAE,uCAAuC,CAAC;KACjE,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,IAAA,eAAM,EAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,IAAA,eAAM,EAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,IAAA,eAAM,EAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,IAAA,eAAM,EAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","debugId":"3754007a-7c83-5315-b646-b29f289c9aff"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAC1B,+BAA+B,EAC/B,KAAK,6BAA6B,GACnC,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="107699b2-3be3-54f4-a9f0-5f35a54bab9d")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.MAX_SESSION_FILTER_REGEX_LENGTH = exports.MAX_SESSION_FILTER_REGEXES = exports.validateSessionFilter = exports.compileSessionFilter = void 0;
|
|
6
|
+
var session_filters_1 = require("./session-filters");
|
|
7
|
+
Object.defineProperty(exports, "compileSessionFilter", { enumerable: true, get: function () { return session_filters_1.compileSessionFilter; } });
|
|
8
|
+
Object.defineProperty(exports, "validateSessionFilter", { enumerable: true, get: function () { return session_filters_1.validateSessionFilter; } });
|
|
9
|
+
Object.defineProperty(exports, "MAX_SESSION_FILTER_REGEXES", { enumerable: true, get: function () { return session_filters_1.MAX_SESSION_FILTER_REGEXES; } });
|
|
10
|
+
Object.defineProperty(exports, "MAX_SESSION_FILTER_REGEX_LENGTH", { enumerable: true, get: function () { return session_filters_1.MAX_SESSION_FILTER_REGEX_LENGTH; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
12
|
+
//# debugId=107699b2-3be3-54f4-a9f0-5f35a54bab9d
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,qDAM2B;AALzB,uHAAA,oBAAoB,OAAA;AACpB,wHAAA,qBAAqB,OAAA;AACrB,6HAAA,0BAA0B,OAAA;AAC1B,kIAAA,+BAA+B,OAAA","debugId":"107699b2-3be3-54f4-a9f0-5f35a54bab9d"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SessionFilter } from "@alwaysmeticulous/api";
|
|
2
|
+
export declare const MAX_SESSION_FILTER_REGEXES = 100;
|
|
3
|
+
export declare const MAX_SESSION_FILTER_REGEX_LENGTH = 1000;
|
|
4
|
+
export type SessionFilterValidationResult = {
|
|
5
|
+
valid: true;
|
|
6
|
+
filter: SessionFilter;
|
|
7
|
+
} | {
|
|
8
|
+
valid: false;
|
|
9
|
+
error: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Validates an untrusted value as a {@link SessionFilter}, including checking
|
|
13
|
+
* that every regex compiles with the same engine used for matching (Google's
|
|
14
|
+
* RE2 — linear-time, no backreferences or lookaround; see
|
|
15
|
+
* https://github.com/google/re2/wiki/Syntax).
|
|
16
|
+
*
|
|
17
|
+
* Shared by the CLI (to reject bad filters before triggering a run) and the
|
|
18
|
+
* backend (to reject bad filters at the API boundary), so validation semantics
|
|
19
|
+
* cannot drift between the two.
|
|
20
|
+
*/
|
|
21
|
+
export declare const validateSessionFilter: (value: unknown) => SessionFilterValidationResult;
|
|
22
|
+
/**
|
|
23
|
+
* Compiles a {@link SessionFilter} into a predicate over a session's start
|
|
24
|
+
* URL. Throws if any regex does not compile — call
|
|
25
|
+
* {@link validateSessionFilter} first at the system boundary.
|
|
26
|
+
*/
|
|
27
|
+
export declare const compileSessionFilter: (filter: SessionFilter) => ((sessionStartUrl: string) => boolean);
|
|
28
|
+
//# sourceMappingURL=session-filters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-filters.d.ts","sourceRoot":"","sources":["../src/session-filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAyB3D,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AAErD,MAAM,MAAM,6BAA6B,GACrC;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GACtC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpC;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,UACzB,OAAO,KACb,6BA0EF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,WACvB,aAAa,KACpB,CAAC,CAAC,eAAe,EAAE,MAAM,KAAK,OAAO,CAKvC,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="70ea37cf-98b4-5dfc-81a1-bbe140d7b48e")}catch(e){}}();
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.compileSessionFilter = exports.validateSessionFilter = exports.MAX_SESSION_FILTER_REGEX_LENGTH = exports.MAX_SESSION_FILTER_REGEXES = void 0;
|
|
6
|
+
let cachedRE2;
|
|
7
|
+
const getRE2 = () => {
|
|
8
|
+
if (cachedRE2 === undefined) {
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
10
|
+
cachedRE2 = require("re2");
|
|
11
|
+
}
|
|
12
|
+
return cachedRE2;
|
|
13
|
+
};
|
|
14
|
+
exports.MAX_SESSION_FILTER_REGEXES = 100;
|
|
15
|
+
exports.MAX_SESSION_FILTER_REGEX_LENGTH = 1_000;
|
|
16
|
+
/**
|
|
17
|
+
* Validates an untrusted value as a {@link SessionFilter}, including checking
|
|
18
|
+
* that every regex compiles with the same engine used for matching (Google's
|
|
19
|
+
* RE2 — linear-time, no backreferences or lookaround; see
|
|
20
|
+
* https://github.com/google/re2/wiki/Syntax).
|
|
21
|
+
*
|
|
22
|
+
* Shared by the CLI (to reject bad filters before triggering a run) and the
|
|
23
|
+
* backend (to reject bad filters at the API boundary), so validation semantics
|
|
24
|
+
* cannot drift between the two.
|
|
25
|
+
*/
|
|
26
|
+
const validateSessionFilter = (value) => {
|
|
27
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
28
|
+
return { valid: false, error: "Session filter must be an object." };
|
|
29
|
+
}
|
|
30
|
+
const type = value.type;
|
|
31
|
+
if (type !== "session-start-url-matches-any-regex") {
|
|
32
|
+
return {
|
|
33
|
+
valid: false,
|
|
34
|
+
error: `Unknown session filter type ${JSON.stringify(type)}. Supported types: "session-start-url-matches-any-regex".`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const regexes = value.regexes;
|
|
38
|
+
if (!Array.isArray(regexes)) {
|
|
39
|
+
return {
|
|
40
|
+
valid: false,
|
|
41
|
+
error: "Session filter 'regexes' must be an array of strings.",
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (regexes.length === 0) {
|
|
45
|
+
return {
|
|
46
|
+
valid: false,
|
|
47
|
+
error: "Session filter 'regexes' must not be empty: an empty list would match no sessions. Omit the filter to run all selected sessions.",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (regexes.length > exports.MAX_SESSION_FILTER_REGEXES) {
|
|
51
|
+
return {
|
|
52
|
+
valid: false,
|
|
53
|
+
error: `Session filter 'regexes' must contain at most ${exports.MAX_SESSION_FILTER_REGEXES} entries (got ${regexes.length}).`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
for (const regex of regexes) {
|
|
57
|
+
if (typeof regex !== "string") {
|
|
58
|
+
return {
|
|
59
|
+
valid: false,
|
|
60
|
+
error: "Session filter 'regexes' must be an array of strings.",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (regex.length === 0) {
|
|
64
|
+
return {
|
|
65
|
+
valid: false,
|
|
66
|
+
error: "Session filter 'regexes' must not contain empty strings (an empty regex matches every session).",
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
if (regex.length > exports.MAX_SESSION_FILTER_REGEX_LENGTH) {
|
|
70
|
+
return {
|
|
71
|
+
valid: false,
|
|
72
|
+
error: `Session filter regexes must be at most ${exports.MAX_SESSION_FILTER_REGEX_LENGTH} characters long (got one of length ${regex.length}).`,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
const RE2Ctor = getRE2();
|
|
77
|
+
new RE2Ctor(regex);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return {
|
|
81
|
+
valid: false,
|
|
82
|
+
error: `Session filter regex ${JSON.stringify(regex)} does not compile: ${error instanceof Error ? error.message : String(error)}. Regexes use the RE2 syntax (https://github.com/google/re2/wiki/Syntax).`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
valid: true,
|
|
88
|
+
filter: {
|
|
89
|
+
type: "session-start-url-matches-any-regex",
|
|
90
|
+
regexes: regexes,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
exports.validateSessionFilter = validateSessionFilter;
|
|
95
|
+
/**
|
|
96
|
+
* Compiles a {@link SessionFilter} into a predicate over a session's start
|
|
97
|
+
* URL. Throws if any regex does not compile — call
|
|
98
|
+
* {@link validateSessionFilter} first at the system boundary.
|
|
99
|
+
*/
|
|
100
|
+
const compileSessionFilter = (filter) => {
|
|
101
|
+
const RE2Ctor = getRE2();
|
|
102
|
+
const compiledRegexes = filter.regexes.map((regex) => new RE2Ctor(regex));
|
|
103
|
+
return (sessionStartUrl) => compiledRegexes.some((regex) => regex.test(sessionStartUrl));
|
|
104
|
+
};
|
|
105
|
+
exports.compileSessionFilter = compileSessionFilter;
|
|
106
|
+
//# sourceMappingURL=session-filters.js.map
|
|
107
|
+
//# debugId=70ea37cf-98b4-5dfc-81a1-bbe140d7b48e
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-filters.js","sources":["../src/session-filters.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"70ea37cf-98b4-5dfc-81a1-bbe140d7b48e"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwaysmeticulous/session-filters",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.308.0",
|
|
4
4
|
"description": "Validation and matching for Meticulous session filters, shared between the CLI and the Meticulous backend",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
],
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"re2": "1.24.0",
|
|
13
|
-
"@alwaysmeticulous/api": "2.
|
|
13
|
+
"@alwaysmeticulous/api": "2.307.0"
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"vitest": "^4.1.7"
|