@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.
Files changed (150) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +192 -19
  3. package/dist/commands/auto-prewarm.d.ts +8 -1
  4. package/dist/commands/auto-prewarm.js +18 -7
  5. package/dist/commands/generate-pop-config.d.ts +1 -0
  6. package/dist/commands/generate-pop-config.js +9 -3
  7. package/dist/commands/prewarm.js +3 -1
  8. package/dist/commands/query/parameter.d.ts +26 -0
  9. package/dist/commands/query/parameter.js +27 -0
  10. package/dist/commands/query/prewarm.d.ts +31 -0
  11. package/dist/commands/query/prewarm.js +31 -0
  12. package/dist/commands/revalidate.js +8 -6
  13. package/dist/helpers/clipboard.d.ts +19 -0
  14. package/dist/helpers/clipboard.js +70 -0
  15. package/dist/helpers/evaluate-speed-kit-config.d.ts +8 -18
  16. package/dist/helpers/evaluate-speed-kit-config.js +8 -6
  17. package/dist/helpers/evaluate-speed-kit-config.spec.d.ts +1 -0
  18. package/dist/helpers/evaluate-speed-kit-config.spec.js +78 -0
  19. package/dist/models/cli-parameters.d.ts +73 -0
  20. package/dist/models/cli-parameters.js +151 -0
  21. package/dist/models/cli-parameters.spec.d.ts +1 -0
  22. package/dist/models/cli-parameters.spec.js +47 -0
  23. package/dist/services/athena/athena-service.d.ts +2 -0
  24. package/dist/services/athena/athena-service.js +15 -4
  25. package/dist/services/athena/athena-service.spec.d.ts +1 -0
  26. package/dist/services/athena/athena-service.spec.js +74 -0
  27. package/dist/services/deploy/handler/install-resource-handler.js +3 -4
  28. package/dist/services/onboarding/onboarding-service-factory.js +2 -2
  29. package/dist/services/pop-config/pop-config-service.d.ts +8 -1
  30. package/dist/services/pop-config/pop-config-service.js +16 -28
  31. package/dist/services/prewarm/assets/asset-api-client.d.ts +1 -1
  32. package/dist/services/prewarm/assets/asset-api-client.js +5 -4
  33. package/dist/services/prewarm/auto-pre-warm-factory.d.ts +12 -2
  34. package/dist/services/prewarm/auto-pre-warm-factory.js +20 -6
  35. package/dist/services/prewarm/csv-reader.d.ts +21 -2
  36. package/dist/services/prewarm/csv-reader.js +71 -9
  37. package/dist/services/prewarm/csv-reader.spec.d.ts +1 -0
  38. package/dist/services/prewarm/csv-reader.spec.js +75 -0
  39. package/dist/services/prewarm/index.d.ts +1 -0
  40. package/dist/services/prewarm/index.js +1 -0
  41. package/dist/services/prewarm/pre-warm-factory.d.ts +0 -2
  42. package/dist/services/prewarm/pre-warm-factory.js +8 -11
  43. package/dist/services/prewarm/pre-warm-model.d.ts +14 -1
  44. package/dist/services/prewarm/pre-warm-model.js +0 -1
  45. package/dist/services/prewarm/pre-warm-service.d.ts +9 -4
  46. package/dist/services/prewarm/pre-warm-service.js +18 -14
  47. package/dist/services/prewarm/prewarm-targets.d.ts +12 -0
  48. package/dist/services/prewarm/prewarm-targets.js +18 -0
  49. package/dist/services/prewarm/prewarm-targets.spec.d.ts +1 -0
  50. package/dist/services/prewarm/prewarm-targets.spec.js +29 -0
  51. package/dist/services/query-builder/error/match-matches-nothing-error.d.ts +11 -0
  52. package/dist/services/query-builder/error/match-matches-nothing-error.js +17 -0
  53. package/dist/services/query-builder/queries/device.d.ts +21 -0
  54. package/dist/services/query-builder/queries/device.js +26 -0
  55. package/dist/services/query-builder/queries/index.d.ts +6 -0
  56. package/dist/services/query-builder/queries/index.js +6 -0
  57. package/dist/services/query-builder/queries/page-filter.d.ts +39 -0
  58. package/dist/services/query-builder/queries/page-filter.js +135 -0
  59. package/dist/services/query-builder/queries/page-source.d.ts +30 -0
  60. package/dist/services/query-builder/queries/page-source.js +79 -0
  61. package/dist/services/query-builder/queries/parameter-query.d.ts +14 -0
  62. package/dist/services/query-builder/queries/parameter-query.js +142 -0
  63. package/dist/services/query-builder/queries/pops-query.d.ts +27 -0
  64. package/dist/services/query-builder/queries/pops-query.js +65 -0
  65. package/dist/services/query-builder/queries/prewarm-query.d.ts +18 -0
  66. package/dist/services/query-builder/queries/prewarm-query.js +227 -0
  67. package/dist/services/query-builder/queries/query-model.d.ts +97 -0
  68. package/dist/services/query-builder/queries/query-model.js +19 -0
  69. package/dist/services/query-builder/queries/spec/golden-configs.d.ts +18 -0
  70. package/dist/services/query-builder/queries/spec/golden-configs.js +116 -0
  71. package/dist/services/query-builder/queries/spec/golden.spec.d.ts +1 -0
  72. package/dist/services/query-builder/queries/spec/golden.spec.js +161 -0
  73. package/dist/services/query-builder/queries/spec/pops-query.spec.d.ts +1 -0
  74. package/dist/services/query-builder/queries/spec/pops-query.spec.js +58 -0
  75. package/dist/services/query-builder/queries/spec/queries.spec.d.ts +1 -0
  76. package/dist/services/query-builder/queries/spec/queries.spec.js +312 -0
  77. package/dist/services/query-builder/queries/spec/reported-bugs.spec.d.ts +1 -0
  78. package/dist/services/query-builder/queries/spec/reported-bugs.spec.js +86 -0
  79. package/dist/services/query-builder/query-builder-factory.d.ts +2 -2
  80. package/dist/services/query-builder/query-builder-factory.js +35 -7
  81. package/dist/services/query-builder/query-builder-model.d.ts +31 -19
  82. package/dist/services/query-builder/query-builder-model.js +5 -5
  83. package/dist/services/query-builder/query-builder-service.d.ts +26 -5
  84. package/dist/services/query-builder/query-builder-service.js +157 -44
  85. package/dist/services/query-builder/query-command.d.ts +26 -0
  86. package/dist/services/query-builder/query-command.js +35 -0
  87. package/dist/services/query-builder/rules/index.d.ts +8 -0
  88. package/dist/services/query-builder/rules/index.js +8 -0
  89. package/dist/services/query-builder/rules/match-pattern.d.ts +51 -0
  90. package/dist/services/query-builder/rules/match-pattern.js +141 -0
  91. package/dist/services/query-builder/rules/pattern-language.d.ts +59 -0
  92. package/dist/services/query-builder/rules/pattern-language.js +159 -0
  93. package/dist/services/query-builder/rules/rule-model.d.ts +107 -0
  94. package/dist/services/query-builder/rules/rule-model.js +54 -0
  95. package/dist/services/query-builder/rules/rule-parser.d.ts +33 -0
  96. package/dist/services/query-builder/rules/rule-parser.js +189 -0
  97. package/dist/services/query-builder/rules/rule-reducer.d.ts +71 -0
  98. package/dist/services/query-builder/rules/rule-reducer.js +383 -0
  99. package/dist/services/query-builder/rules/rule-relevance.d.ts +43 -0
  100. package/dist/services/query-builder/rules/rule-relevance.js +69 -0
  101. package/dist/services/query-builder/rules/rule-to-sql.d.ts +51 -0
  102. package/dist/services/query-builder/rules/rule-to-sql.js +75 -0
  103. package/dist/services/query-builder/rules/spec/pattern-language.spec.d.ts +1 -0
  104. package/dist/services/query-builder/rules/spec/pattern-language.spec.js +90 -0
  105. package/dist/services/query-builder/rules/spec/rule-parser.spec.d.ts +1 -0
  106. package/dist/services/query-builder/rules/spec/rule-parser.spec.js +150 -0
  107. package/dist/services/query-builder/rules/spec/rule-reducer.spec.d.ts +1 -0
  108. package/dist/services/query-builder/rules/spec/rule-reducer.spec.js +169 -0
  109. package/dist/services/query-builder/rules/spec/rule-relevance.spec.d.ts +1 -0
  110. package/dist/services/query-builder/rules/spec/rule-relevance.spec.js +88 -0
  111. package/dist/services/query-builder/rules/spec/rule-to-sql.spec.d.ts +1 -0
  112. package/dist/services/query-builder/rules/spec/rule-to-sql.spec.js +110 -0
  113. package/dist/services/query-builder/rules/spec/runtime-semantics.spec.d.ts +1 -0
  114. package/dist/services/query-builder/rules/spec/runtime-semantics.spec.js +55 -0
  115. package/dist/services/query-builder/rules/spec/strip-parameters.spec.d.ts +1 -0
  116. package/dist/services/query-builder/rules/spec/strip-parameters.spec.js +85 -0
  117. package/dist/services/query-builder/rules/strip-parameters.d.ts +39 -0
  118. package/dist/services/query-builder/rules/strip-parameters.js +197 -0
  119. package/dist/services/query-builder/sql/expression.d.ts +73 -0
  120. package/dist/services/query-builder/sql/expression.js +133 -0
  121. package/dist/services/query-builder/sql/format.d.ts +14 -0
  122. package/dist/services/query-builder/sql/format.js +48 -0
  123. package/dist/services/query-builder/sql/index.d.ts +4 -0
  124. package/dist/services/query-builder/sql/index.js +4 -0
  125. package/dist/services/query-builder/sql/predicate.d.ts +66 -0
  126. package/dist/services/query-builder/sql/predicate.js +124 -0
  127. package/dist/services/query-builder/sql/regex.d.ts +28 -0
  128. package/dist/services/query-builder/sql/regex.js +81 -0
  129. package/dist/services/query-builder/sql/spec/expression.spec.d.ts +1 -0
  130. package/dist/services/query-builder/sql/spec/expression.spec.js +75 -0
  131. package/dist/services/query-builder/sql/spec/format.spec.d.ts +1 -0
  132. package/dist/services/query-builder/sql/spec/format.spec.js +37 -0
  133. package/dist/services/query-builder/sql/spec/predicate.spec.d.ts +1 -0
  134. package/dist/services/query-builder/sql/spec/predicate.spec.js +78 -0
  135. package/dist/services/query-builder/sql/spec/regex.spec.d.ts +1 -0
  136. package/dist/services/query-builder/sql/spec/regex.spec.js +62 -0
  137. package/dist/services/revalidate/revalidate-model.d.ts +9 -3
  138. package/dist/services/revalidate/revalidate-model.js +12 -3
  139. package/oclif.manifest.json +354 -104
  140. package/package.json +11 -2
  141. package/dist/commands/build-parameter-query.d.ts +0 -14
  142. package/dist/commands/build-parameter-query.js +0 -25
  143. package/dist/commands/build-prewarm-query.d.ts +0 -16
  144. package/dist/commands/build-prewarm-query.js +0 -37
  145. package/dist/helpers/build-query-helper.d.ts +0 -32
  146. package/dist/helpers/build-query-helper.js +0 -223
  147. package/dist/helpers/get-parsed-config.d.ts +0 -15
  148. package/dist/helpers/get-parsed-config.js +0 -62
  149. package/dist/services/onboarding/dashboard/parameter-query-builder.d.ts +0 -8
  150. package/dist/services/onboarding/dashboard/parameter-query-builder.js +0 -63
@@ -13,6 +13,7 @@
13
13
  "examples": [
14
14
  "$ sk auto-prewarm <customerPath> -c <configName>",
15
15
  "$ sk auto-prewarm customers/decathlon.de -c production",
16
+ "$ sk auto-prewarm customers/decathlon.de --device desktop,mobile",
16
17
  "$ sk auto-prewarm customers/decathlon.de -v MOBILE,DESKTOP"
17
18
  ],
18
19
  "flags": {
@@ -26,18 +27,82 @@
26
27
  "multiple": false,
27
28
  "type": "option"
28
29
  },
30
+ "days": {
31
+ "char": "d",
32
+ "description": "Number of days the query looks back",
33
+ "name": "days",
34
+ "required": false,
35
+ "hasDynamicHelp": false,
36
+ "multiple": false,
37
+ "type": "option"
38
+ },
39
+ "excludeNoindex": {
40
+ "description": "Exclude page impressions of pages marked noindex",
41
+ "name": "excludeNoindex",
42
+ "allowNo": false,
43
+ "type": "boolean"
44
+ },
45
+ "excludeSuspicious": {
46
+ "description": "Exclude page impressions Speed Kit classified as suspicious",
47
+ "name": "excludeSuspicious",
48
+ "allowNo": false,
49
+ "type": "boolean"
50
+ },
51
+ "explain": {
52
+ "description": "Account for every rule the query leaves out, reduces or approximates",
53
+ "name": "explain",
54
+ "allowNo": false,
55
+ "type": "boolean"
56
+ },
57
+ "hardNavigationsOnly": {
58
+ "description": "Exclude soft (SPA) navigations",
59
+ "name": "hardNavigationsOnly",
60
+ "allowNo": false,
61
+ "type": "boolean"
62
+ },
63
+ "match": {
64
+ "description": "Keep only urls whose path matches this regular expression, e.g. '^/p/'. The path is matched with its query string, the way a version 1 pathname rule matches it, so '[?&]size=' works too. Repeat the flag to keep the urls matching any of several patterns, and start a pattern with (?i) to match case-insensitively",
65
+ "name": "match",
66
+ "required": false,
67
+ "hasDynamicHelp": false,
68
+ "multiple": true,
69
+ "type": "option"
70
+ },
71
+ "device": {
72
+ "description": "Split the list by device class, so every url is warmed in the variations it was actually requested in. A class not named is left out",
73
+ "exclusive": [
74
+ "variation"
75
+ ],
76
+ "name": "device",
77
+ "required": false,
78
+ "delimiter": ",",
79
+ "hasDynamicHelp": false,
80
+ "multiple": true,
81
+ "options": [
82
+ "desktop",
83
+ "mobile",
84
+ "tablet"
85
+ ],
86
+ "type": "option"
87
+ },
29
88
  "variation": {
30
89
  "char": "v",
90
+ "description": "Pair every url of the list with each of these variations. For the custom variations no traffic can reveal, e.g. 'desktop-pdp-a,mobile-pdp-a'",
91
+ "exclusive": [
92
+ "device"
93
+ ],
31
94
  "name": "variation",
32
- "default": "default",
95
+ "required": false,
96
+ "delimiter": ",",
33
97
  "hasDynamicHelp": false,
34
- "multiple": false,
98
+ "multiple": true,
35
99
  "type": "option"
36
100
  },
37
101
  "variationPath": {
38
102
  "char": "p",
39
103
  "description": "path to variations.csv",
40
104
  "exclusive": [
105
+ "device",
41
106
  "variation"
42
107
  ],
43
108
  "name": "variationPath",
@@ -81,102 +146,6 @@
81
146
  "auto-prewarm.js"
82
147
  ]
83
148
  },
84
- "build-parameter-query": {
85
- "aliases": [],
86
- "args": {
87
- "customerPath": {
88
- "description": "The customer config path",
89
- "name": "customerPath",
90
- "required": true
91
- }
92
- },
93
- "description": "Build a parameter query that can be executed in Athena",
94
- "examples": [
95
- "$ sk build-parameter-query <customerPath> -c <configName>",
96
- "$ sk build-parameter-query customers/decathlon.de -c production"
97
- ],
98
- "flags": {
99
- "configName": {
100
- "char": "c",
101
- "description": "The costumer config name",
102
- "name": "configName",
103
- "required": false,
104
- "default": "production",
105
- "hasDynamicHelp": false,
106
- "multiple": false,
107
- "type": "option"
108
- }
109
- },
110
- "hasDynamicHelp": false,
111
- "hiddenAliases": [],
112
- "id": "build-parameter-query",
113
- "pluginAlias": "@speedkit/cli",
114
- "pluginName": "@speedkit/cli",
115
- "pluginType": "core",
116
- "strict": true,
117
- "enableJsonFlag": false,
118
- "isESM": true,
119
- "relativePath": [
120
- "dist",
121
- "commands",
122
- "build-parameter-query.js"
123
- ]
124
- },
125
- "build-prewarm-query": {
126
- "aliases": [],
127
- "args": {
128
- "customerPath": {
129
- "description": "The customer config path",
130
- "name": "customerPath",
131
- "required": true
132
- }
133
- },
134
- "description": "Build a prewarm query that can be executed in Athena",
135
- "examples": [
136
- "$ sk build-prewarm-query <customerPath> -c <configName>",
137
- "$ sk build-prewarm-query customers/decathlon.de -c production"
138
- ],
139
- "flags": {
140
- "configName": {
141
- "char": "c",
142
- "description": "The costumer config name",
143
- "name": "configName",
144
- "required": false,
145
- "default": "production",
146
- "hasDynamicHelp": false,
147
- "multiple": false,
148
- "type": "option"
149
- },
150
- "quiet": {
151
- "char": "q",
152
- "description": "Output only the raw query without clipboard copy or styling",
153
- "name": "quiet",
154
- "allowNo": false,
155
- "type": "boolean"
156
- },
157
- "execute": {
158
- "char": "e",
159
- "description": "Execute the query directly and write the result to a <app>-<date>-prewarm.csv file",
160
- "name": "execute",
161
- "allowNo": false,
162
- "type": "boolean"
163
- }
164
- },
165
- "hasDynamicHelp": false,
166
- "hiddenAliases": [],
167
- "id": "build-prewarm-query",
168
- "pluginAlias": "@speedkit/cli",
169
- "pluginName": "@speedkit/cli",
170
- "pluginType": "core",
171
- "strict": true,
172
- "enableJsonFlag": false,
173
- "isESM": true,
174
- "relativePath": [
175
- "dist",
176
- "commands",
177
- "build-prewarm-query.js"
178
- ]
179
- },
180
149
  "deploy": {
181
150
  "aliases": [],
182
151
  "args": {
@@ -458,6 +427,14 @@
458
427
  "$ sk generate-pop-config --coverage 95 --pop-limit 6 --traffic-share 2 --deploy appName"
459
428
  ],
460
429
  "flags": {
430
+ "days": {
431
+ "description": "Number of days the query looks back",
432
+ "name": "days",
433
+ "required": false,
434
+ "hasDynamicHelp": false,
435
+ "multiple": false,
436
+ "type": "option"
437
+ },
461
438
  "coverage": {
462
439
  "char": "c",
463
440
  "description": "The percentage of traffic which should be covered through prewarming.",
@@ -768,8 +745,8 @@
768
745
  "flags": {
769
746
  "variation": {
770
747
  "char": "v",
748
+ "description": "Warm every url of the list in each of these variations, e.g. 'desktop,mobile'. Ignored for a list that names a variation itself",
771
749
  "name": "variation",
772
- "default": "default",
773
750
  "hasDynamicHelp": false,
774
751
  "multiple": false,
775
752
  "type": "option"
@@ -884,7 +861,7 @@
884
861
  "examples": [
885
862
  "$ sk revalidate <app> --pattern <regex> [--pattern <regex>] [--dryRun] [--wait]",
886
863
  "$ sk revalidate example-shop --pattern '^https://www\\.example\\.com/en/.*-c(?:1234|5678)(?:/|\\?|$)' --dryRun",
887
- "$ sk revalidate example-shop --pattern '^https://www\\.example\\.com/en/.*-c1234(?:/|\\?|$)' --wait",
864
+ "$ sk revalidate example-shop --pattern '^https://www\\.example\\.com/en/.*-c1234(?:/|\\?|$)' --type PURGE --wait",
888
865
  "$ sk revalidate example-shop --prefix https://www.example.com/en/ --dryRun"
889
866
  ],
890
867
  "flags": {
@@ -910,9 +887,9 @@
910
887
  "type": "option"
911
888
  },
912
889
  "type": {
913
- "description": "PURGE drops the entries and does not rebuild them, which is what an out-of-scope URL needs.",
890
+ "description": "REFRESH revalidates against origin and keeps serving the cached copy meanwhile. A URL that went out of scope needs PURGE instead: it drops the entries and does not rebuild them, which is the only type that stops serving for good.",
914
891
  "name": "type",
915
- "default": "PURGE",
892
+ "default": "REFRESH",
916
893
  "hasDynamicHelp": false,
917
894
  "multiple": false,
918
895
  "options": [
@@ -937,7 +914,7 @@
937
914
  "type": "boolean"
938
915
  },
939
916
  "yes": {
940
- "description": "Skip the confirmation a job above 100 assets asks for. Required in a non-interactive shell.",
917
+ "description": "Skip the confirmation a dropping job above 100 assets asks for. Required in a non-interactive shell.",
941
918
  "name": "yes",
942
919
  "allowNo": false,
943
920
  "type": "boolean"
@@ -1312,7 +1289,280 @@
1312
1289
  "extension",
1313
1290
  "update.js"
1314
1291
  ]
1292
+ },
1293
+ "query:parameter": {
1294
+ "aliases": [
1295
+ "build-parameter-query"
1296
+ ],
1297
+ "args": {
1298
+ "customerPath": {
1299
+ "description": "The customer config path",
1300
+ "name": "customerPath",
1301
+ "required": true
1302
+ }
1303
+ },
1304
+ "deprecateAliases": true,
1305
+ "description": "Build a parameter query that can be executed in Athena",
1306
+ "examples": [
1307
+ "$ sk query parameter <customerPath> -c <configName>",
1308
+ "$ sk query parameter customers/decathlon.de -c production",
1309
+ "$ sk query parameter customers/decathlon.de --explain"
1310
+ ],
1311
+ "flags": {
1312
+ "configName": {
1313
+ "char": "c",
1314
+ "description": "The costumer config name",
1315
+ "name": "configName",
1316
+ "required": false,
1317
+ "default": "production",
1318
+ "hasDynamicHelp": false,
1319
+ "multiple": false,
1320
+ "type": "option"
1321
+ },
1322
+ "days": {
1323
+ "char": "d",
1324
+ "description": "Number of days the query looks back",
1325
+ "name": "days",
1326
+ "required": false,
1327
+ "hasDynamicHelp": false,
1328
+ "multiple": false,
1329
+ "type": "option"
1330
+ },
1331
+ "excludeNoindex": {
1332
+ "description": "Exclude page impressions of pages marked noindex",
1333
+ "name": "excludeNoindex",
1334
+ "allowNo": false,
1335
+ "type": "boolean"
1336
+ },
1337
+ "excludeSuspicious": {
1338
+ "description": "Exclude page impressions Speed Kit classified as suspicious",
1339
+ "name": "excludeSuspicious",
1340
+ "allowNo": false,
1341
+ "type": "boolean"
1342
+ },
1343
+ "explain": {
1344
+ "description": "Account for every rule the query leaves out, reduces or approximates",
1345
+ "name": "explain",
1346
+ "allowNo": false,
1347
+ "type": "boolean"
1348
+ },
1349
+ "hardNavigationsOnly": {
1350
+ "description": "Exclude soft (SPA) navigations",
1351
+ "name": "hardNavigationsOnly",
1352
+ "allowNo": false,
1353
+ "type": "boolean"
1354
+ },
1355
+ "execute": {
1356
+ "char": "e",
1357
+ "description": "Execute the query directly and write the result to a <app>-<date>-<query>.csv file",
1358
+ "name": "execute",
1359
+ "allowNo": false,
1360
+ "type": "boolean"
1361
+ },
1362
+ "quiet": {
1363
+ "char": "q",
1364
+ "description": "Output only the raw query without clipboard copy or styling",
1365
+ "name": "quiet",
1366
+ "allowNo": false,
1367
+ "type": "boolean"
1368
+ },
1369
+ "bySet": {
1370
+ "description": "Rank whole sets of parameters instead of single parameters, to see which ones travel together",
1371
+ "name": "bySet",
1372
+ "allowNo": false,
1373
+ "type": "boolean"
1374
+ },
1375
+ "minImpressions": {
1376
+ "description": "Leave out parameters seen on fewer page impressions than this",
1377
+ "name": "minImpressions",
1378
+ "required": false,
1379
+ "hasDynamicHelp": false,
1380
+ "multiple": false,
1381
+ "type": "option"
1382
+ }
1383
+ },
1384
+ "hasDynamicHelp": false,
1385
+ "hiddenAliases": [],
1386
+ "id": "query:parameter",
1387
+ "pluginAlias": "@speedkit/cli",
1388
+ "pluginName": "@speedkit/cli",
1389
+ "pluginType": "core",
1390
+ "strict": true,
1391
+ "enableJsonFlag": false,
1392
+ "isESM": true,
1393
+ "relativePath": [
1394
+ "dist",
1395
+ "commands",
1396
+ "query",
1397
+ "parameter.js"
1398
+ ]
1399
+ },
1400
+ "query:prewarm": {
1401
+ "aliases": [
1402
+ "build-prewarm-query"
1403
+ ],
1404
+ "args": {
1405
+ "customerPath": {
1406
+ "description": "The customer config path",
1407
+ "name": "customerPath",
1408
+ "required": true
1409
+ }
1410
+ },
1411
+ "deprecateAliases": true,
1412
+ "description": "Build a prewarm query that can be executed in Athena",
1413
+ "examples": [
1414
+ "$ sk query prewarm <customerPath> -c <configName>",
1415
+ "$ sk query prewarm customers/decathlon.de -c production",
1416
+ "$ sk query prewarm customers/decathlon.de --explain",
1417
+ "$ sk query prewarm customers/decathlon.de --match '^/p/'",
1418
+ "$ sk query prewarm customers/decathlon.de --device desktop,mobile",
1419
+ "$ sk query prewarm customers/decathlon.de -v MOBILE,DESKTOP",
1420
+ "$ sk query prewarm customers/decathlon.de --count"
1421
+ ],
1422
+ "flags": {
1423
+ "configName": {
1424
+ "char": "c",
1425
+ "description": "The costumer config name",
1426
+ "name": "configName",
1427
+ "required": false,
1428
+ "default": "production",
1429
+ "hasDynamicHelp": false,
1430
+ "multiple": false,
1431
+ "type": "option"
1432
+ },
1433
+ "days": {
1434
+ "char": "d",
1435
+ "description": "Number of days the query looks back",
1436
+ "name": "days",
1437
+ "required": false,
1438
+ "hasDynamicHelp": false,
1439
+ "multiple": false,
1440
+ "type": "option"
1441
+ },
1442
+ "excludeNoindex": {
1443
+ "description": "Exclude page impressions of pages marked noindex",
1444
+ "name": "excludeNoindex",
1445
+ "allowNo": false,
1446
+ "type": "boolean"
1447
+ },
1448
+ "excludeSuspicious": {
1449
+ "description": "Exclude page impressions Speed Kit classified as suspicious",
1450
+ "name": "excludeSuspicious",
1451
+ "allowNo": false,
1452
+ "type": "boolean"
1453
+ },
1454
+ "explain": {
1455
+ "description": "Account for every rule the query leaves out, reduces or approximates",
1456
+ "name": "explain",
1457
+ "allowNo": false,
1458
+ "type": "boolean"
1459
+ },
1460
+ "hardNavigationsOnly": {
1461
+ "description": "Exclude soft (SPA) navigations",
1462
+ "name": "hardNavigationsOnly",
1463
+ "allowNo": false,
1464
+ "type": "boolean"
1465
+ },
1466
+ "execute": {
1467
+ "char": "e",
1468
+ "description": "Execute the query directly and write the result to a <app>-<date>-<query>.csv file",
1469
+ "name": "execute",
1470
+ "allowNo": false,
1471
+ "type": "boolean"
1472
+ },
1473
+ "quiet": {
1474
+ "char": "q",
1475
+ "description": "Output only the raw query without clipboard copy or styling",
1476
+ "name": "quiet",
1477
+ "allowNo": false,
1478
+ "type": "boolean"
1479
+ },
1480
+ "device": {
1481
+ "description": "Split the list by device class, so every url is warmed in the variations it was actually requested in. A class not named is left out",
1482
+ "exclusive": [
1483
+ "variation"
1484
+ ],
1485
+ "name": "device",
1486
+ "required": false,
1487
+ "delimiter": ",",
1488
+ "hasDynamicHelp": false,
1489
+ "multiple": true,
1490
+ "options": [
1491
+ "desktop",
1492
+ "mobile",
1493
+ "tablet"
1494
+ ],
1495
+ "type": "option"
1496
+ },
1497
+ "variation": {
1498
+ "char": "v",
1499
+ "description": "Pair every url of the list with each of these variations. For the custom variations no traffic can reveal, e.g. 'desktop-pdp-a,mobile-pdp-a'",
1500
+ "exclusive": [
1501
+ "device"
1502
+ ],
1503
+ "name": "variation",
1504
+ "required": false,
1505
+ "delimiter": ",",
1506
+ "hasDynamicHelp": false,
1507
+ "multiple": true,
1508
+ "type": "option"
1509
+ },
1510
+ "count": {
1511
+ "description": "Run the query and report how large the list is instead of what is in it: urls, the impressions they stand for, and a row per variation where the list carries variations. Every other flag still applies, so this counts the list the same command would produce",
1512
+ "exclusive": [
1513
+ "execute"
1514
+ ],
1515
+ "name": "count",
1516
+ "allowNo": false,
1517
+ "type": "boolean"
1518
+ },
1519
+ "excludeNotFound": {
1520
+ "description": "Leave out urls the origin answers with a 404 more often than not",
1521
+ "name": "excludeNotFound",
1522
+ "allowNo": false,
1523
+ "type": "boolean"
1524
+ },
1525
+ "limit": {
1526
+ "description": "Keep only the most requested urls",
1527
+ "name": "limit",
1528
+ "required": false,
1529
+ "hasDynamicHelp": false,
1530
+ "multiple": false,
1531
+ "type": "option"
1532
+ },
1533
+ "match": {
1534
+ "description": "Keep only urls whose path matches this regular expression, e.g. '^/p/'. The path is matched with its query string, the way a version 1 pathname rule matches it, so '[?&]size=' works too. Repeat the flag to keep the urls matching any of several patterns, and start a pattern with (?i) to match case-insensitively",
1535
+ "name": "match",
1536
+ "required": false,
1537
+ "hasDynamicHelp": false,
1538
+ "multiple": true,
1539
+ "type": "option"
1540
+ },
1541
+ "minHits": {
1542
+ "description": "Keep only urls requested at least this often in the window",
1543
+ "name": "minHits",
1544
+ "required": false,
1545
+ "hasDynamicHelp": false,
1546
+ "multiple": false,
1547
+ "type": "option"
1548
+ }
1549
+ },
1550
+ "hasDynamicHelp": false,
1551
+ "hiddenAliases": [],
1552
+ "id": "query:prewarm",
1553
+ "pluginAlias": "@speedkit/cli",
1554
+ "pluginName": "@speedkit/cli",
1555
+ "pluginType": "core",
1556
+ "strict": true,
1557
+ "enableJsonFlag": false,
1558
+ "isESM": true,
1559
+ "relativePath": [
1560
+ "dist",
1561
+ "commands",
1562
+ "query",
1563
+ "prewarm.js"
1564
+ ]
1315
1565
  }
1316
1566
  },
1317
- "version": "4.25.2"
1567
+ "version": "4.27.0"
1318
1568
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@speedkit/cli",
3
3
  "description": "Speed Kit CLI",
4
- "version": "4.25.2",
4
+ "version": "4.27.0",
5
5
  "author": {
6
6
  "name": "Baqend.com",
7
7
  "email": "info@baqend.com"
@@ -27,7 +27,9 @@
27
27
  "prepack": "npm run build",
28
28
  "test": "mocha",
29
29
  "coverage": "nyc mocha",
30
- "coverage:report": "nyc --reporter cobertura mocha"
30
+ "coverage:report": "nyc --reporter cobertura mocha",
31
+ "test:golden": "UPDATE_GOLDEN=1 mocha --grep \"golden queries\"",
32
+ "snapshot:queries": "node scripts/snapshot-customer-queries.mjs"
31
33
  },
32
34
  "mocha": {
33
35
  "reporter": "xunit",
@@ -69,6 +71,11 @@
69
71
  "./dist/hooks/init/dns-result-order.js"
70
72
  ]
71
73
  },
74
+ "topics": {
75
+ "query": {
76
+ "description": "Build the Athena queries a customer config implies"
77
+ }
78
+ },
72
79
  "bin": "sk",
73
80
  "dirname": "speed-kit-cli",
74
81
  "plugins": [
@@ -99,6 +106,7 @@
99
106
  "@oclif/plugin-help": "^6.2.45",
100
107
  "@oclif/plugin-not-found": "^3.2.81",
101
108
  "@oclif/plugin-warn-if-update-available": "^3.1.61",
109
+ "@speedkit/rules": "^1.3.0-0",
102
110
  "baqend": "^4.2.5",
103
111
  "chalk": "^5.6.2",
104
112
  "chokidar": "^5.0.0",
@@ -129,6 +137,7 @@
129
137
  "parse5-htmlparser2-tree-adapter": "^7.0.0",
130
138
  "puppeteer": "^24.41.0",
131
139
  "puppeteer-extra": "^3.3.6",
140
+ "refa": "^0.12.1",
132
141
  "semver": "^7.7.4",
133
142
  "spinnies": "^0.5.1",
134
143
  "strip-comments": "^2.0.1",
@@ -1,14 +0,0 @@
1
- import { Command } from "@oclif/core";
2
- export default class BuildParameterQuery extends Command {
3
- static args: {
4
- customerPath: import("@oclif/core/interfaces").Arg<string, {
5
- exists?: boolean;
6
- }>;
7
- };
8
- static description: string;
9
- static examples: string[];
10
- static flags: {
11
- configName: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
- };
13
- run(): Promise<void>;
14
- }
@@ -1,25 +0,0 @@
1
- import { Command } from "@oclif/core";
2
- import { CLI_CONFIG_NAME, CLI_CUSTOMER_CONFIG, CLIParameters, CLIParametersChar, CLIParametersExample, } from "../models/cli-parameters.js";
3
- import { QueryBuilderFactory } from "../services/query-builder/query-builder-factory.js";
4
- import { CliConfig } from "../helpers/cli-config.js";
5
- import { QueryTpe } from "../services/query-builder/query-builder-model.js";
6
- export default class BuildParameterQuery extends Command {
7
- static args = CLI_CUSTOMER_CONFIG;
8
- static description = "Build a parameter query that can be executed in Athena";
9
- static examples = [
10
- `$ sk build-parameter-query <${CLIParameters.CustomerPath}> -${CLIParametersChar.ConfigName} <${CLIParameters.ConfigName}>`,
11
- `$ sk build-parameter-query ${CLIParametersExample.CustomerPath} -${CLIParametersChar.ConfigName} ${CLIParametersExample.ConfigName}`,
12
- ];
13
- static flags = {
14
- ...CLI_CONFIG_NAME,
15
- };
16
- async run() {
17
- const { args: { customerPath }, flags: { configName }, } = await this.parse(BuildParameterQuery);
18
- const service = await new QueryBuilderFactory({
19
- configName,
20
- customerPath,
21
- isWindows: this.config.windows,
22
- }, new CliConfig(this.config).load()).buildService(QueryTpe.parameter);
23
- await service.run();
24
- }
25
- }
@@ -1,16 +0,0 @@
1
- import { Command } from "@oclif/core";
2
- export default class BuildPrewarmQuery extends Command {
3
- static args: {
4
- customerPath: import("@oclif/core/interfaces").Arg<string, {
5
- exists?: boolean;
6
- }>;
7
- };
8
- static description: string;
9
- static examples: string[];
10
- static flags: {
11
- quiet: import("@oclif/core/interfaces").BooleanFlag<boolean>;
12
- execute: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
- configName: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
- };
15
- run(): Promise<void>;
16
- }
@@ -1,37 +0,0 @@
1
- import { Command, Flags } from "@oclif/core";
2
- import { CLI_CONFIG_NAME, CLI_CUSTOMER_CONFIG, CLIParameters, CLIParametersChar, CLIParametersExample, } from "../models/cli-parameters.js";
3
- import { CliConfig } from "../helpers/cli-config.js";
4
- import { QueryBuilderFactory } from "../services/query-builder/query-builder-factory.js";
5
- import { QueryTpe } from "../services/query-builder/query-builder-model.js";
6
- export default class BuildPrewarmQuery extends Command {
7
- static args = CLI_CUSTOMER_CONFIG;
8
- static description = "Build a prewarm query that can be executed in Athena";
9
- static examples = [
10
- `$ sk build-prewarm-query <${CLIParameters.CustomerPath}> -${CLIParametersChar.ConfigName} <${CLIParameters.ConfigName}>`,
11
- `$ sk build-prewarm-query ${CLIParametersExample.CustomerPath} -${CLIParametersChar.ConfigName} ${CLIParametersExample.ConfigName}`,
12
- ];
13
- static flags = {
14
- ...CLI_CONFIG_NAME,
15
- quiet: Flags.boolean({
16
- char: "q",
17
- description: "Output only the raw query without clipboard copy or styling",
18
- default: false,
19
- }),
20
- execute: Flags.boolean({
21
- char: "e",
22
- description: "Execute the query directly and write the result to a <app>-<date>-prewarm.csv file",
23
- default: false,
24
- }),
25
- };
26
- async run() {
27
- const { args: { customerPath }, flags: { configName, quiet, execute }, } = await this.parse(BuildPrewarmQuery);
28
- const service = await new QueryBuilderFactory({
29
- configName,
30
- customerPath,
31
- isWindows: this.config.windows,
32
- quiet,
33
- execute,
34
- }, new CliConfig(this.config).load()).buildService(QueryTpe.prewarm);
35
- await service.run();
36
- }
37
- }