@speedkit/cli 4.25.2 → 4.27.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/CHANGELOG.md +17 -0
- package/README.md +192 -19
- package/dist/commands/auto-prewarm.d.ts +8 -1
- package/dist/commands/auto-prewarm.js +18 -7
- package/dist/commands/generate-pop-config.d.ts +1 -0
- package/dist/commands/generate-pop-config.js +9 -3
- package/dist/commands/prewarm.js +3 -1
- package/dist/commands/query/parameter.d.ts +26 -0
- package/dist/commands/query/parameter.js +27 -0
- package/dist/commands/query/prewarm.d.ts +31 -0
- package/dist/commands/query/prewarm.js +31 -0
- package/dist/commands/revalidate.js +8 -6
- package/dist/helpers/clipboard.d.ts +19 -0
- package/dist/helpers/clipboard.js +70 -0
- package/dist/helpers/evaluate-speed-kit-config.d.ts +8 -18
- package/dist/helpers/evaluate-speed-kit-config.js +8 -6
- package/dist/helpers/evaluate-speed-kit-config.spec.d.ts +1 -0
- package/dist/helpers/evaluate-speed-kit-config.spec.js +78 -0
- package/dist/models/cli-parameters.d.ts +73 -0
- package/dist/models/cli-parameters.js +151 -0
- package/dist/models/cli-parameters.spec.d.ts +1 -0
- package/dist/models/cli-parameters.spec.js +47 -0
- package/dist/services/athena/athena-service.d.ts +2 -0
- package/dist/services/athena/athena-service.js +15 -4
- package/dist/services/athena/athena-service.spec.d.ts +1 -0
- package/dist/services/athena/athena-service.spec.js +74 -0
- package/dist/services/deploy/handler/install-resource-handler.js +3 -4
- package/dist/services/onboarding/onboarding-service-factory.js +2 -2
- package/dist/services/pop-config/pop-config-service.d.ts +8 -1
- package/dist/services/pop-config/pop-config-service.js +16 -28
- package/dist/services/prewarm/assets/asset-api-client.d.ts +1 -1
- package/dist/services/prewarm/assets/asset-api-client.js +5 -4
- package/dist/services/prewarm/auto-pre-warm-factory.d.ts +12 -2
- package/dist/services/prewarm/auto-pre-warm-factory.js +20 -6
- package/dist/services/prewarm/csv-reader.d.ts +21 -2
- package/dist/services/prewarm/csv-reader.js +71 -9
- package/dist/services/prewarm/csv-reader.spec.d.ts +1 -0
- package/dist/services/prewarm/csv-reader.spec.js +75 -0
- package/dist/services/prewarm/index.d.ts +1 -0
- package/dist/services/prewarm/index.js +1 -0
- package/dist/services/prewarm/pre-warm-factory.d.ts +0 -2
- package/dist/services/prewarm/pre-warm-factory.js +8 -11
- package/dist/services/prewarm/pre-warm-model.d.ts +14 -1
- package/dist/services/prewarm/pre-warm-model.js +0 -1
- package/dist/services/prewarm/pre-warm-service.d.ts +9 -4
- package/dist/services/prewarm/pre-warm-service.js +18 -14
- package/dist/services/prewarm/prewarm-targets.d.ts +12 -0
- package/dist/services/prewarm/prewarm-targets.js +18 -0
- package/dist/services/prewarm/prewarm-targets.spec.d.ts +1 -0
- package/dist/services/prewarm/prewarm-targets.spec.js +29 -0
- package/dist/services/query-builder/error/match-matches-nothing-error.d.ts +11 -0
- package/dist/services/query-builder/error/match-matches-nothing-error.js +17 -0
- package/dist/services/query-builder/queries/device.d.ts +21 -0
- package/dist/services/query-builder/queries/device.js +26 -0
- package/dist/services/query-builder/queries/index.d.ts +6 -0
- package/dist/services/query-builder/queries/index.js +6 -0
- package/dist/services/query-builder/queries/page-filter.d.ts +39 -0
- package/dist/services/query-builder/queries/page-filter.js +135 -0
- package/dist/services/query-builder/queries/page-source.d.ts +30 -0
- package/dist/services/query-builder/queries/page-source.js +79 -0
- package/dist/services/query-builder/queries/parameter-query.d.ts +14 -0
- package/dist/services/query-builder/queries/parameter-query.js +142 -0
- package/dist/services/query-builder/queries/pops-query.d.ts +27 -0
- package/dist/services/query-builder/queries/pops-query.js +65 -0
- package/dist/services/query-builder/queries/prewarm-query.d.ts +18 -0
- package/dist/services/query-builder/queries/prewarm-query.js +227 -0
- package/dist/services/query-builder/queries/query-model.d.ts +97 -0
- package/dist/services/query-builder/queries/query-model.js +19 -0
- package/dist/services/query-builder/queries/spec/golden-configs.d.ts +18 -0
- package/dist/services/query-builder/queries/spec/golden-configs.js +116 -0
- package/dist/services/query-builder/queries/spec/golden.spec.d.ts +1 -0
- package/dist/services/query-builder/queries/spec/golden.spec.js +161 -0
- package/dist/services/query-builder/queries/spec/pops-query.spec.d.ts +1 -0
- package/dist/services/query-builder/queries/spec/pops-query.spec.js +58 -0
- package/dist/services/query-builder/queries/spec/queries.spec.d.ts +1 -0
- package/dist/services/query-builder/queries/spec/queries.spec.js +312 -0
- package/dist/services/query-builder/queries/spec/reported-bugs.spec.d.ts +1 -0
- package/dist/services/query-builder/queries/spec/reported-bugs.spec.js +86 -0
- package/dist/services/query-builder/query-builder-factory.d.ts +2 -2
- package/dist/services/query-builder/query-builder-factory.js +35 -7
- package/dist/services/query-builder/query-builder-model.d.ts +31 -19
- package/dist/services/query-builder/query-builder-model.js +5 -5
- package/dist/services/query-builder/query-builder-service.d.ts +26 -5
- package/dist/services/query-builder/query-builder-service.js +157 -44
- package/dist/services/query-builder/query-command.d.ts +26 -0
- package/dist/services/query-builder/query-command.js +35 -0
- package/dist/services/query-builder/rules/index.d.ts +8 -0
- package/dist/services/query-builder/rules/index.js +8 -0
- package/dist/services/query-builder/rules/match-pattern.d.ts +51 -0
- package/dist/services/query-builder/rules/match-pattern.js +141 -0
- package/dist/services/query-builder/rules/pattern-language.d.ts +59 -0
- package/dist/services/query-builder/rules/pattern-language.js +159 -0
- package/dist/services/query-builder/rules/rule-model.d.ts +107 -0
- package/dist/services/query-builder/rules/rule-model.js +54 -0
- package/dist/services/query-builder/rules/rule-parser.d.ts +33 -0
- package/dist/services/query-builder/rules/rule-parser.js +189 -0
- package/dist/services/query-builder/rules/rule-reducer.d.ts +71 -0
- package/dist/services/query-builder/rules/rule-reducer.js +383 -0
- package/dist/services/query-builder/rules/rule-relevance.d.ts +43 -0
- package/dist/services/query-builder/rules/rule-relevance.js +69 -0
- package/dist/services/query-builder/rules/rule-to-sql.d.ts +51 -0
- package/dist/services/query-builder/rules/rule-to-sql.js +75 -0
- package/dist/services/query-builder/rules/spec/pattern-language.spec.d.ts +1 -0
- package/dist/services/query-builder/rules/spec/pattern-language.spec.js +90 -0
- package/dist/services/query-builder/rules/spec/rule-parser.spec.d.ts +1 -0
- package/dist/services/query-builder/rules/spec/rule-parser.spec.js +150 -0
- package/dist/services/query-builder/rules/spec/rule-reducer.spec.d.ts +1 -0
- package/dist/services/query-builder/rules/spec/rule-reducer.spec.js +169 -0
- package/dist/services/query-builder/rules/spec/rule-relevance.spec.d.ts +1 -0
- package/dist/services/query-builder/rules/spec/rule-relevance.spec.js +88 -0
- package/dist/services/query-builder/rules/spec/rule-to-sql.spec.d.ts +1 -0
- package/dist/services/query-builder/rules/spec/rule-to-sql.spec.js +110 -0
- package/dist/services/query-builder/rules/spec/runtime-semantics.spec.d.ts +1 -0
- package/dist/services/query-builder/rules/spec/runtime-semantics.spec.js +55 -0
- package/dist/services/query-builder/rules/spec/strip-parameters.spec.d.ts +1 -0
- package/dist/services/query-builder/rules/spec/strip-parameters.spec.js +85 -0
- package/dist/services/query-builder/rules/strip-parameters.d.ts +39 -0
- package/dist/services/query-builder/rules/strip-parameters.js +197 -0
- package/dist/services/query-builder/sql/expression.d.ts +73 -0
- package/dist/services/query-builder/sql/expression.js +133 -0
- package/dist/services/query-builder/sql/format.d.ts +14 -0
- package/dist/services/query-builder/sql/format.js +48 -0
- package/dist/services/query-builder/sql/index.d.ts +4 -0
- package/dist/services/query-builder/sql/index.js +4 -0
- package/dist/services/query-builder/sql/predicate.d.ts +66 -0
- package/dist/services/query-builder/sql/predicate.js +124 -0
- package/dist/services/query-builder/sql/regex.d.ts +28 -0
- package/dist/services/query-builder/sql/regex.js +81 -0
- package/dist/services/query-builder/sql/spec/expression.spec.d.ts +1 -0
- package/dist/services/query-builder/sql/spec/expression.spec.js +75 -0
- package/dist/services/query-builder/sql/spec/format.spec.d.ts +1 -0
- package/dist/services/query-builder/sql/spec/format.spec.js +37 -0
- package/dist/services/query-builder/sql/spec/predicate.spec.d.ts +1 -0
- package/dist/services/query-builder/sql/spec/predicate.spec.js +78 -0
- package/dist/services/query-builder/sql/spec/regex.spec.d.ts +1 -0
- package/dist/services/query-builder/sql/spec/regex.spec.js +62 -0
- package/dist/services/revalidate/revalidate-model.d.ts +9 -3
- package/dist/services/revalidate/revalidate-model.js +12 -3
- package/oclif.manifest.json +354 -104
- package/package.json +11 -2
- package/dist/commands/build-parameter-query.d.ts +0 -14
- package/dist/commands/build-parameter-query.js +0 -25
- package/dist/commands/build-prewarm-query.d.ts +0 -16
- package/dist/commands/build-prewarm-query.js +0 -37
- package/dist/helpers/build-query-helper.d.ts +0 -32
- package/dist/helpers/build-query-helper.js +0 -223
- package/dist/helpers/get-parsed-config.d.ts +0 -15
- package/dist/helpers/get-parsed-config.js +0 -62
- package/dist/services/onboarding/dashboard/parameter-query-builder.d.ts +0 -8
- package/dist/services/onboarding/dashboard/parameter-query-builder.js +0 -63
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns the whitelisted filter as a sql query string.
|
|
3
|
-
*
|
|
4
|
-
* @param parsedConfig - The speed kit config parsed as an object.
|
|
5
|
-
*/
|
|
6
|
-
export declare function getWhitelistedFilter(parsedConfig: any): string;
|
|
7
|
-
/**
|
|
8
|
-
* Returns the blacklisted filter as a SQL query string.
|
|
9
|
-
*
|
|
10
|
-
* @param parsedConfig - The speed kit config parsed as an object.
|
|
11
|
-
*/
|
|
12
|
-
export declare function getBlacklistedFilter(parsedConfig: any): string;
|
|
13
|
-
/**
|
|
14
|
-
* Returns the parameter filter as a SQL query string.
|
|
15
|
-
*
|
|
16
|
-
* @param params - The stripped parameters that are named within the speed kit config.
|
|
17
|
-
* @param skConfigVersion - The Speed Kit config ruleset version.
|
|
18
|
-
*/
|
|
19
|
-
export declare function getParameterFilter(parameters: (string | RegExp)[], skConfigVersion?: number): string;
|
|
20
|
-
/**
|
|
21
|
-
* Returns the parameter replace (regexp_replace) as a SQL query string.
|
|
22
|
-
*
|
|
23
|
-
* @param params - The stripped parameters that are named within the speed kit config.
|
|
24
|
-
* @param skConfigVersion - The Speed Kit config ruleset version.
|
|
25
|
-
*/
|
|
26
|
-
export declare function getParameterReplaceFilter(parameters: (string | RegExp)[], skConfigVersion?: number): string;
|
|
27
|
-
/**
|
|
28
|
-
* Returns the stripped parameters that are named within the speed kit config.
|
|
29
|
-
*
|
|
30
|
-
* @param parsedConfig - The speed kit config parsed as an object.
|
|
31
|
-
*/
|
|
32
|
-
export declare function getStrippedParameters(parsedConfig: any): (string | RegExp)[];
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns the string between a left bound and a right bound.
|
|
3
|
-
*
|
|
4
|
-
* @param input - The input string to get the inner string from.
|
|
5
|
-
* @param leftBound - The left bound of the string to be cut.
|
|
6
|
-
* @param rightBound - The right bound of the string to be cut.
|
|
7
|
-
*/
|
|
8
|
-
function getStringBetween(input, leftBound, rightBound) {
|
|
9
|
-
return input.slice(input.indexOf(leftBound) + 1, input.lastIndexOf(rightBound));
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Returns the comparison filter (like, regexp_like) as a SQL query string.
|
|
13
|
-
*
|
|
14
|
-
* @param property - The property to be compared
|
|
15
|
-
* @param sqlField -The SQL field to compare with.
|
|
16
|
-
* @param shouldEqual - True if the property should equal the sql value, false otherwise.
|
|
17
|
-
* @param type - Whether type of property is a pathname or url.
|
|
18
|
-
*/
|
|
19
|
-
function getFilterForProperty(property, sqlField, shouldEqual, type) {
|
|
20
|
-
if (typeof property === "string") {
|
|
21
|
-
if (type === "pathname") {
|
|
22
|
-
return `url_extract_path(${sqlField}) ${shouldEqual ? "" : "not "}like '${property}%'`;
|
|
23
|
-
}
|
|
24
|
-
return `${sqlField} ${shouldEqual ? "" : "not "}like 'https://${property}%'`;
|
|
25
|
-
}
|
|
26
|
-
const ignoreCase = isRegExpIgnoringCase(property);
|
|
27
|
-
const sqlRegExp = getStringBetween(String(property), "/", "/");
|
|
28
|
-
if (type === "pathname") {
|
|
29
|
-
return `${shouldEqual ? "" : "not "}regexp_like(url_extract_path(${sqlField}), '${ignoreCase ? "(?i)" : ""}${sqlRegExp}')`;
|
|
30
|
-
}
|
|
31
|
-
return `${shouldEqual ? "" : "not "}regexp_like(${sqlField}, '${ignoreCase ? "(?i)" : ""}${sqlRegExp}')`;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Returns all properties of a speed kit rule with the given keys.
|
|
35
|
-
*
|
|
36
|
-
* @param speedKitRuleValues - The speed kit rule value to get the properties from (e.g. the whitelist).
|
|
37
|
-
* @param key - The key to get the properties with (e.g. 'pathname').
|
|
38
|
-
*/
|
|
39
|
-
function getRuleProperty(speedKitRuleValues, key) {
|
|
40
|
-
const properties = [];
|
|
41
|
-
if (!speedKitRuleValues) {
|
|
42
|
-
return properties;
|
|
43
|
-
}
|
|
44
|
-
for (const ruleValue of speedKitRuleValues) {
|
|
45
|
-
for (const ruleKey of Object.keys(ruleValue).filter((ruleKey) => key === ruleKey))
|
|
46
|
-
properties.push(...ruleValue[ruleKey]);
|
|
47
|
-
}
|
|
48
|
-
return properties;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Returns the whitelisted filter as a sql query string.
|
|
52
|
-
*
|
|
53
|
-
* @param parsedConfig - The speed kit config parsed as an object.
|
|
54
|
-
*/
|
|
55
|
-
export function getWhitelistedFilter(parsedConfig) {
|
|
56
|
-
const { whitelist, enabledSites } = parsedConfig;
|
|
57
|
-
// TODO: use origins instead here
|
|
58
|
-
const whitelistedFilter = `(\n ${(whitelist[0].host || whitelist[0].url)
|
|
59
|
-
.map((hostname) => getFilterForProperty(hostname, "url", true, "url"))
|
|
60
|
-
.join("\n or ")}\n )`;
|
|
61
|
-
const enabledFilter = getRuleProperty(enabledSites, "pathname")
|
|
62
|
-
.map((pathname) => getFilterForProperty(pathname, "url", true, "pathname"))
|
|
63
|
-
.join("\nor ");
|
|
64
|
-
if (!enabledFilter) {
|
|
65
|
-
return `${whitelistedFilter}`;
|
|
66
|
-
}
|
|
67
|
-
return `(${whitelistedFilter}) and (${enabledFilter})`;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Returns the blacklisted filter as a SQL query string.
|
|
71
|
-
*
|
|
72
|
-
* @param parsedConfig - The speed kit config parsed as an object.
|
|
73
|
-
*/
|
|
74
|
-
export function getBlacklistedFilter(parsedConfig) {
|
|
75
|
-
const { blacklist, disabledSites } = parsedConfig;
|
|
76
|
-
const blacklistedPathnamesFilter = getRuleProperty(blacklist, "pathname")
|
|
77
|
-
.map((pathname) => getFilterForProperty(pathname, "url", false, "pathname"))
|
|
78
|
-
.join("\n and ");
|
|
79
|
-
const blacklistedUrlsFilter = getRuleProperty(blacklist, "url")
|
|
80
|
-
.map((url) => getFilterForProperty(url, "url", false, "url"))
|
|
81
|
-
.join("\n and ");
|
|
82
|
-
const disabledFilter = getRuleProperty(disabledSites, "pathname")
|
|
83
|
-
.map((pathname) => getFilterForProperty(pathname, "url", false, "pathname"))
|
|
84
|
-
.join("\n and ");
|
|
85
|
-
let blacklistedFilter = "";
|
|
86
|
-
if (blacklistedPathnamesFilter) {
|
|
87
|
-
blacklistedFilter += blacklistedPathnamesFilter;
|
|
88
|
-
}
|
|
89
|
-
if (blacklistedUrlsFilter) {
|
|
90
|
-
blacklistedFilter += `\n and ${blacklistedUrlsFilter}`;
|
|
91
|
-
}
|
|
92
|
-
if (disabledFilter) {
|
|
93
|
-
blacklistedFilter += `\n and ${disabledFilter}`;
|
|
94
|
-
}
|
|
95
|
-
return blacklistedFilter;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Returns the parameter filter as a SQL query string.
|
|
99
|
-
*
|
|
100
|
-
* @param params - The stripped parameters that are named within the speed kit config.
|
|
101
|
-
* @param skConfigVersion - The Speed Kit config ruleset version.
|
|
102
|
-
*/
|
|
103
|
-
export function getParameterFilter(parameters, skConfigVersion = 1) {
|
|
104
|
-
return parameters
|
|
105
|
-
.map((parameter) => {
|
|
106
|
-
// Prefix comparison for strings
|
|
107
|
-
if (typeof parameter === "string") {
|
|
108
|
-
return skConfigVersion === 1
|
|
109
|
-
? `not regexp_like(key, '^${parameter}')`
|
|
110
|
-
: `key <> '${parameter}'`;
|
|
111
|
-
}
|
|
112
|
-
// Regexp like for complex regular expressions
|
|
113
|
-
const ignoreCase = isRegExpIgnoringCase(parameter);
|
|
114
|
-
return `not regexp_like(key, '${ignoreCase ? "(?i)" : ""}${getStringBetween(String(parameter), "/", "/")}')`;
|
|
115
|
-
})
|
|
116
|
-
.join("\nand ");
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Returns the parameter replace (regexp_replace) as a SQL query string.
|
|
120
|
-
*
|
|
121
|
-
* @param params - The stripped parameters that are named within the speed kit config.
|
|
122
|
-
* @param skConfigVersion - The Speed Kit config ruleset version.
|
|
123
|
-
*/
|
|
124
|
-
export function getParameterReplaceFilter(parameters, skConfigVersion = 1) {
|
|
125
|
-
const prefixParameters = [];
|
|
126
|
-
const suffixParameters = [];
|
|
127
|
-
const fullMatchParameters = [];
|
|
128
|
-
const prefixIgnoreCaseParameters = [];
|
|
129
|
-
const suffixIgnoreCaseParameters = [];
|
|
130
|
-
const fullMatchIgnoreCaseParameters = [];
|
|
131
|
-
for (const parameter of parameters) {
|
|
132
|
-
// String params or regex params with start marker but no end marker
|
|
133
|
-
if (typeof parameter === "string") {
|
|
134
|
-
if (skConfigVersion === 1) {
|
|
135
|
-
prefixParameters.push(parameter);
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
fullMatchParameters.push(parameter);
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
const ignoreCase = isRegExpIgnoringCase(parameter);
|
|
144
|
-
// Regex params with start marker but no end marker
|
|
145
|
-
if (/\/\^[^$]+$/.test(String(parameter))) {
|
|
146
|
-
(ignoreCase ? prefixIgnoreCaseParameters : prefixParameters).push(getStringBetween(String(parameter), "^", "/"));
|
|
147
|
-
continue;
|
|
148
|
-
}
|
|
149
|
-
// Regex params with end marker but no start marker
|
|
150
|
-
if (/\/[^$^]+\$/.test(String(parameter))) {
|
|
151
|
-
(ignoreCase ? suffixIgnoreCaseParameters : suffixParameters).push(getStringBetween(String(parameter), "/", "$"));
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
// Regex params with start marker and end marker
|
|
155
|
-
if (/\/\^[^$]+\$\//.test(String(parameter))) {
|
|
156
|
-
(ignoreCase ? fullMatchIgnoreCaseParameters : fullMatchParameters).push(getStringBetween(String(parameter), "^", "$"));
|
|
157
|
-
continue;
|
|
158
|
-
}
|
|
159
|
-
// Regex params with no start marker and no end marker are being considered full matches
|
|
160
|
-
(ignoreCase ? fullMatchIgnoreCaseParameters : fullMatchParameters).push(getStringBetween(String(parameter), "/", "/"));
|
|
161
|
-
}
|
|
162
|
-
let regExpQuery = "regexp_replace(url, '#.*' )";
|
|
163
|
-
const regExps = [
|
|
164
|
-
getParameterPrefixRegExp(prefixParameters, false),
|
|
165
|
-
getParameterPrefixRegExp(prefixIgnoreCaseParameters, true),
|
|
166
|
-
getParameterSuffixRegExp(suffixParameters, false),
|
|
167
|
-
getParameterSuffixRegExp(suffixIgnoreCaseParameters, true),
|
|
168
|
-
getParameterFullMatchRegExp(fullMatchParameters, false),
|
|
169
|
-
getParameterFullMatchRegExp(fullMatchIgnoreCaseParameters, true),
|
|
170
|
-
];
|
|
171
|
-
// Nest all regexes inside each other:
|
|
172
|
-
for (const regExp of regExps) {
|
|
173
|
-
if (regExp) {
|
|
174
|
-
regExpQuery = `regexp_replace(${regExpQuery}, '${regExp}', '')`;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return regExpQuery;
|
|
178
|
-
}
|
|
179
|
-
function isRegExpIgnoringCase(regExp) {
|
|
180
|
-
return /\/i$/.test(String(regExp));
|
|
181
|
-
}
|
|
182
|
-
function getParameterPrefixRegExp(parameters, ignoreCase) {
|
|
183
|
-
return parameters.length > 0
|
|
184
|
-
? `${ignoreCase ? "(?i)" : ""}[?&](${parameters.join("|")})[^&]*`
|
|
185
|
-
: null;
|
|
186
|
-
}
|
|
187
|
-
function getParameterSuffixRegExp(parameters, ignoreCase) {
|
|
188
|
-
return parameters.length > 0
|
|
189
|
-
? `${ignoreCase ? "(?i)" : ""}[?&][^&]*(${parameters.join("|")})(=[^&]*)?(?=&|$)`
|
|
190
|
-
: null;
|
|
191
|
-
}
|
|
192
|
-
function getParameterFullMatchRegExp(parameters, ignoreCase) {
|
|
193
|
-
return parameters.length > 0
|
|
194
|
-
? `${ignoreCase ? "(?i)" : ""}[?&](${parameters.join("|")})(=[^&]*)?(?=&|$)`
|
|
195
|
-
: null;
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Returns the stripped parameters that are named within the speed kit config.
|
|
199
|
-
*
|
|
200
|
-
* @param parsedConfig - The speed kit config parsed as an object.
|
|
201
|
-
*/
|
|
202
|
-
export function getStrippedParameters(parsedConfig) {
|
|
203
|
-
const parameterArray = parsedConfig.stripQueryParams;
|
|
204
|
-
if (!parameterArray) {
|
|
205
|
-
return [];
|
|
206
|
-
}
|
|
207
|
-
const isSimpleArray = parameterArray.every((parameter) => typeof parameter === "string" || parameter instanceof RegExp);
|
|
208
|
-
if (isSimpleArray) {
|
|
209
|
-
return parameterArray;
|
|
210
|
-
}
|
|
211
|
-
const parameters = [];
|
|
212
|
-
for (const entry of parameterArray) {
|
|
213
|
-
if (!entry.params) {
|
|
214
|
-
continue;
|
|
215
|
-
}
|
|
216
|
-
if (!Array.isArray(entry.params)) {
|
|
217
|
-
parameters.push(entry.params);
|
|
218
|
-
continue;
|
|
219
|
-
}
|
|
220
|
-
parameters.push(...entry.params);
|
|
221
|
-
}
|
|
222
|
-
return parameters;
|
|
223
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { ConfigFile } from "./customer-config.js";
|
|
2
|
-
interface SpeedKitConfig {
|
|
3
|
-
ruleSetConfig?: {
|
|
4
|
-
version?: string;
|
|
5
|
-
};
|
|
6
|
-
[key: string]: any;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* @deprecated
|
|
10
|
-
* @param config
|
|
11
|
-
*/
|
|
12
|
-
export declare function parseSpeedKitConfig(config: string): SpeedKitConfig;
|
|
13
|
-
export declare function getParsedConfig(configFile: ConfigFile): Promise<SpeedKitConfig>;
|
|
14
|
-
export declare function getSpeedKitConfigVersion(config: SpeedKitConfig): number;
|
|
15
|
-
export {};
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
import * as vm from "node:vm";
|
|
3
|
-
/**
|
|
4
|
-
* @deprecated
|
|
5
|
-
* @param config
|
|
6
|
-
*/
|
|
7
|
-
export function parseSpeedKitConfig(config) {
|
|
8
|
-
// Replace all properties that use function calls or that are related to other objects like window
|
|
9
|
-
const window = {};
|
|
10
|
-
window.top = window;
|
|
11
|
-
const storage = {
|
|
12
|
-
length: 0,
|
|
13
|
-
clear: () => { },
|
|
14
|
-
getItem: () => { },
|
|
15
|
-
key: () => null,
|
|
16
|
-
removeItem: () => { },
|
|
17
|
-
setItem: () => { },
|
|
18
|
-
};
|
|
19
|
-
const node = {
|
|
20
|
-
querySelector: () => node,
|
|
21
|
-
querySelectorAll: () => [],
|
|
22
|
-
classList: { contains: () => false },
|
|
23
|
-
};
|
|
24
|
-
const context = {
|
|
25
|
-
window,
|
|
26
|
-
APP: "",
|
|
27
|
-
document: Object.assign(Object.create(node), {
|
|
28
|
-
cookie: "",
|
|
29
|
-
documentElement: Object.create(node),
|
|
30
|
-
head: Object.create(node),
|
|
31
|
-
body: Object.create(node),
|
|
32
|
-
}),
|
|
33
|
-
speedKit: window.speedKit,
|
|
34
|
-
navigator: { userAgent: "test-agent" },
|
|
35
|
-
location: new URL("https://www.example.com"),
|
|
36
|
-
localStorage: storage,
|
|
37
|
-
sessionStorage: storage,
|
|
38
|
-
};
|
|
39
|
-
vm.runInNewContext(config, context);
|
|
40
|
-
return window.speedKit;
|
|
41
|
-
}
|
|
42
|
-
export async function getParsedConfig(configFile) {
|
|
43
|
-
const configString = configFile ? await configFile.readContent() : undefined;
|
|
44
|
-
if (!configString) {
|
|
45
|
-
throw new Error("Speed Kit config could not be found in directory");
|
|
46
|
-
}
|
|
47
|
-
let parsedConfig;
|
|
48
|
-
try {
|
|
49
|
-
parsedConfig = parseSpeedKitConfig(configString);
|
|
50
|
-
}
|
|
51
|
-
catch (error) {
|
|
52
|
-
throw new Error(`Speed Kit config string could not be parsed.\n${error.stack}`);
|
|
53
|
-
}
|
|
54
|
-
if (!parsedConfig) {
|
|
55
|
-
throw new Error("Speed Kit config was not correctly exposed on the global speedKit variable.");
|
|
56
|
-
}
|
|
57
|
-
return parsedConfig;
|
|
58
|
-
}
|
|
59
|
-
export function getSpeedKitConfigVersion(config) {
|
|
60
|
-
return Number(config.ruleSetConfig?.version) || 1;
|
|
61
|
-
}
|
|
62
|
-
/* eslint-enable */
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { CustomerConfig, ConfigFileInterface } from "../../integration-api/index.js";
|
|
2
|
-
export declare class ParameterQueryBuilder {
|
|
3
|
-
private customerConfig;
|
|
4
|
-
private speedKitConfigFile;
|
|
5
|
-
constructor(customerConfig: CustomerConfig, speedKitConfigFile: ConfigFileInterface);
|
|
6
|
-
buildParameterQuery(app: string, parameterFilter: string, whitelistedFilter: string, blacklistedFilter: string, parameterReplaceFilter: string): string;
|
|
7
|
-
getQuery(): string;
|
|
8
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { getBlacklistedFilter, getParameterFilter, getParameterReplaceFilter, getStrippedParameters, getWhitelistedFilter, } from "../../../helpers/build-query-helper.js";
|
|
2
|
-
import { parseSpeedKitConfig } from "../../../helpers/get-parsed-config.js";
|
|
3
|
-
export class ParameterQueryBuilder {
|
|
4
|
-
customerConfig;
|
|
5
|
-
speedKitConfigFile;
|
|
6
|
-
constructor(customerConfig, speedKitConfigFile) {
|
|
7
|
-
this.customerConfig = customerConfig;
|
|
8
|
-
this.speedKitConfigFile = speedKitConfigFile;
|
|
9
|
-
}
|
|
10
|
-
buildParameterQuery(app, parameterFilter, whitelistedFilter, blacklistedFilter, parameterReplaceFilter) {
|
|
11
|
-
const nowMinusOneMonth = new Date(new Date().setMonth(new Date().getMonth() - 1, new Date().getDate()));
|
|
12
|
-
const monthString = `${nowMinusOneMonth.getMonth() + 1 < 10 ? "0" : ""}${nowMinusOneMonth.getMonth() + 1}`;
|
|
13
|
-
const dateString = `${nowMinusOneMonth.getDate() < 10 ? "0" : ""}${nowMinusOneMonth.getDate()}`;
|
|
14
|
-
const date = `${nowMinusOneMonth.getFullYear()}-${monthString}-${dateString}`;
|
|
15
|
-
return `
|
|
16
|
-
with urlWithParams as (
|
|
17
|
-
select
|
|
18
|
-
url,
|
|
19
|
-
createdat,
|
|
20
|
-
split(url, '?')[1] as urlWithoutParams,
|
|
21
|
-
filter (
|
|
22
|
-
transform(
|
|
23
|
-
split(split(url, '?')[2], '&'),
|
|
24
|
-
(pair) -> split(pair, '=')[1]
|
|
25
|
-
),
|
|
26
|
-
(key) -> ${parameterFilter}
|
|
27
|
-
) as paramKeys
|
|
28
|
-
from live.rum.pi
|
|
29
|
-
where app = '${app}'
|
|
30
|
-
and date >= '${date}'
|
|
31
|
-
and cardinality(split(url, '?')) > 1
|
|
32
|
-
and (${whitelistedFilter})
|
|
33
|
-
and ${blacklistedFilter}
|
|
34
|
-
), prepared as (
|
|
35
|
-
select count(*) as PIs,
|
|
36
|
-
count(distinct url) as urls,
|
|
37
|
-
count(distinct ${parameterReplaceFilter}) as cachedUrls,
|
|
38
|
-
count(distinct urlWithoutParams) as uniqueWithoutParam,
|
|
39
|
-
paramKeys,
|
|
40
|
-
element_at(array_distinct(max_by(url, MD5(to_utf8(to_iso8601(createdat))), 500)), 1) as example1,
|
|
41
|
-
element_at(array_distinct(max_by(url, MD5(to_utf8(to_iso8601(createdat))), 500)), 2) as example2,
|
|
42
|
-
element_at(array_distinct(max_by(url, MD5(to_utf8(to_iso8601(createdat))), 500)), 3) as example3
|
|
43
|
-
from urlWithParams
|
|
44
|
-
group by paramKeys
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
select paramKeys, cachedUrls - uniqueWithoutParam as potentialGain, cachedUrls, PIs, example1, example2, example3
|
|
48
|
-
from prepared
|
|
49
|
-
where cardinality(paramKeys) > 0
|
|
50
|
-
order by case when potentialGain > cachedUrls and potentialGain > PIs then potentialGain
|
|
51
|
-
when cachedUrls > PIs then cachedUrls
|
|
52
|
-
else PIs end desc`;
|
|
53
|
-
}
|
|
54
|
-
getQuery() {
|
|
55
|
-
const parsedConfig = parseSpeedKitConfig(this.speedKitConfigFile.getContent());
|
|
56
|
-
const parameters = getStrippedParameters(parsedConfig);
|
|
57
|
-
const parameterFilter = getParameterFilter(parameters);
|
|
58
|
-
const whitelistedFilter = getWhitelistedFilter(parsedConfig);
|
|
59
|
-
const blacklistedFilter = getBlacklistedFilter(parsedConfig);
|
|
60
|
-
const parameterReplaceFilter = getParameterReplaceFilter(parameters);
|
|
61
|
-
return this.buildParameterQuery(this.customerConfig.app, parameterFilter, whitelistedFilter, blacklistedFilter, parameterReplaceFilter);
|
|
62
|
-
}
|
|
63
|
-
}
|