@elastic/synthetics 1.0.0-beta.3 → 1.0.0-beta.32

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 (202) hide show
  1. package/README.md +4 -3
  2. package/dist/cli.js +123 -161
  3. package/dist/cli.js.map +1 -1
  4. package/dist/common_types.d.ts +159 -34
  5. package/dist/common_types.d.ts.map +1 -1
  6. package/dist/config.d.ts +2 -5
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +5 -5
  9. package/dist/config.js.map +1 -1
  10. package/dist/core/browser-service.js +5 -5
  11. package/dist/core/browser-service.js.map +1 -1
  12. package/dist/core/expect.d.ts +25 -25
  13. package/dist/core/expect.d.ts.map +1 -1
  14. package/dist/core/expect.js.map +1 -1
  15. package/dist/core/gatherer.d.ts +4 -8
  16. package/dist/core/gatherer.d.ts.map +1 -1
  17. package/dist/core/gatherer.js +49 -15
  18. package/dist/core/gatherer.js.map +1 -1
  19. package/dist/core/index.d.ts +5 -1
  20. package/dist/core/index.d.ts.map +1 -1
  21. package/dist/core/index.js +23 -11
  22. package/dist/core/index.js.map +1 -1
  23. package/dist/core/logger.d.ts +0 -1
  24. package/dist/core/logger.d.ts.map +1 -1
  25. package/dist/core/logger.js +3 -16
  26. package/dist/core/logger.js.map +1 -1
  27. package/dist/core/runner.d.ts +21 -65
  28. package/dist/core/runner.d.ts.map +1 -1
  29. package/dist/core/runner.js +212 -93
  30. package/dist/core/runner.js.map +1 -1
  31. package/dist/dsl/index.js +5 -1
  32. package/dist/dsl/index.js.map +1 -1
  33. package/dist/dsl/journey.d.ts +9 -4
  34. package/dist/dsl/journey.d.ts.map +1 -1
  35. package/dist/dsl/journey.js +27 -7
  36. package/dist/dsl/journey.js.map +1 -1
  37. package/dist/dsl/monitor.d.ts +66 -0
  38. package/dist/dsl/monitor.d.ts.map +1 -0
  39. package/dist/dsl/monitor.js +63 -0
  40. package/dist/dsl/monitor.js.map +1 -0
  41. package/dist/dsl/step.d.ts +3 -2
  42. package/dist/dsl/step.d.ts.map +1 -1
  43. package/dist/dsl/step.js +2 -1
  44. package/dist/dsl/step.js.map +1 -1
  45. package/dist/formatter/javascript.d.ts +98 -0
  46. package/dist/formatter/javascript.d.ts.map +1 -0
  47. package/dist/formatter/javascript.js +295 -0
  48. package/dist/formatter/javascript.js.map +1 -0
  49. package/dist/generator/index.d.ts +29 -0
  50. package/dist/generator/index.d.ts.map +1 -0
  51. package/dist/generator/index.js +240 -0
  52. package/dist/generator/index.js.map +1 -0
  53. package/dist/{reporters/reporter.js → generator/utils.d.ts} +5 -3
  54. package/dist/generator/utils.d.ts.map +1 -0
  55. package/dist/generator/utils.js +80 -0
  56. package/dist/generator/utils.js.map +1 -0
  57. package/dist/helpers.d.ts +24 -1
  58. package/dist/helpers.d.ts.map +1 -1
  59. package/dist/helpers.js +126 -19
  60. package/dist/helpers.js.map +1 -1
  61. package/dist/index.d.ts +6 -7
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +5 -26
  64. package/dist/index.js.map +1 -1
  65. package/dist/{parse_args.d.ts → loader.d.ts} +2 -5
  66. package/dist/loader.d.ts.map +1 -0
  67. package/dist/loader.js +152 -0
  68. package/dist/loader.js.map +1 -0
  69. package/dist/locations/index.d.ts +45 -0
  70. package/dist/locations/index.d.ts.map +1 -0
  71. package/dist/locations/index.js +90 -0
  72. package/dist/locations/index.js.map +1 -0
  73. package/dist/{reporters/reporter.d.ts → locations/public-locations.d.ts} +12 -8
  74. package/dist/locations/public-locations.d.ts.map +1 -0
  75. package/dist/locations/public-locations.js +41 -0
  76. package/dist/locations/public-locations.js.map +1 -0
  77. package/dist/options.d.ts +41 -0
  78. package/dist/options.d.ts.map +1 -0
  79. package/dist/options.js +182 -0
  80. package/dist/options.js.map +1 -0
  81. package/dist/plugins/browser-console.d.ts +5 -4
  82. package/dist/plugins/browser-console.d.ts.map +1 -1
  83. package/dist/plugins/browser-console.js +27 -8
  84. package/dist/plugins/browser-console.js.map +1 -1
  85. package/dist/plugins/index.js +5 -1
  86. package/dist/plugins/index.js.map +1 -1
  87. package/dist/plugins/network.d.ts +20 -33
  88. package/dist/plugins/network.d.ts.map +1 -1
  89. package/dist/plugins/network.js +173 -214
  90. package/dist/plugins/network.js.map +1 -1
  91. package/dist/plugins/performance.d.ts +4 -19
  92. package/dist/plugins/performance.d.ts.map +1 -1
  93. package/dist/plugins/performance.js +5 -5
  94. package/dist/plugins/performance.js.map +1 -1
  95. package/dist/plugins/plugin-manager.d.ts +9 -5
  96. package/dist/plugins/plugin-manager.d.ts.map +1 -1
  97. package/dist/plugins/plugin-manager.js +44 -29
  98. package/dist/plugins/plugin-manager.js.map +1 -1
  99. package/dist/plugins/tracing.d.ts +6 -6
  100. package/dist/plugins/tracing.d.ts.map +1 -1
  101. package/dist/plugins/tracing.js +8 -7
  102. package/dist/plugins/tracing.js.map +1 -1
  103. package/dist/push/bundler.d.ts +34 -0
  104. package/dist/push/bundler.d.ts.map +1 -0
  105. package/dist/push/bundler.js +123 -0
  106. package/dist/push/bundler.js.map +1 -0
  107. package/dist/push/index.d.ts +33 -0
  108. package/dist/push/index.d.ts.map +1 -0
  109. package/dist/push/index.js +174 -0
  110. package/dist/push/index.js.map +1 -0
  111. package/dist/push/monitor.d.ts +34 -0
  112. package/dist/push/monitor.d.ts.map +1 -0
  113. package/dist/push/monitor.js +78 -0
  114. package/dist/push/monitor.js.map +1 -0
  115. package/{src/reporters/reporter.ts → dist/push/plugin.d.ts} +8 -10
  116. package/dist/push/plugin.d.ts.map +1 -0
  117. package/dist/push/plugin.js +133 -0
  118. package/dist/push/plugin.js.map +1 -0
  119. package/dist/push/request.d.ts +43 -0
  120. package/dist/push/request.d.ts.map +1 -0
  121. package/dist/push/request.js +83 -0
  122. package/dist/push/request.js.map +1 -0
  123. package/dist/reporters/base.d.ts +14 -6
  124. package/dist/reporters/base.d.ts.map +1 -1
  125. package/dist/reporters/base.js +54 -48
  126. package/dist/reporters/base.js.map +1 -1
  127. package/dist/reporters/index.d.ts +18 -8
  128. package/dist/reporters/index.d.ts.map +1 -1
  129. package/dist/reporters/index.js.map +1 -1
  130. package/dist/reporters/json.d.ts +18 -67
  131. package/dist/reporters/json.d.ts.map +1 -1
  132. package/dist/reporters/json.js +153 -175
  133. package/dist/reporters/json.js.map +1 -1
  134. package/dist/reporters/junit.d.ts +7 -1
  135. package/dist/reporters/junit.d.ts.map +1 -1
  136. package/dist/reporters/junit.js +94 -89
  137. package/dist/reporters/junit.js.map +1 -1
  138. package/dist/sdk/lh-trace-processor.d.ts +35 -9
  139. package/dist/sdk/lh-trace-processor.d.ts.map +1 -1
  140. package/dist/sdk/lh-trace-processor.js +114 -53
  141. package/dist/sdk/lh-trace-processor.js.map +1 -1
  142. package/dist/sdk/trace-metrics.d.ts +4 -4
  143. package/dist/sdk/trace-metrics.d.ts.map +1 -1
  144. package/dist/sdk/trace-metrics.js +5 -6
  145. package/dist/sdk/trace-metrics.js.map +1 -1
  146. package/dist/sdk/trace-processor.d.ts +11 -3
  147. package/dist/sdk/trace-processor.d.ts.map +1 -1
  148. package/dist/sdk/trace-processor.js +17 -9
  149. package/dist/sdk/trace-processor.js.map +1 -1
  150. package/dist/tsconfig.tsbuildinfo +1 -1888
  151. package/package.json +32 -20
  152. package/src/cli.ts +205 -152
  153. package/src/common_types.ts +192 -34
  154. package/src/config.ts +2 -5
  155. package/src/core/expect.ts +58 -24
  156. package/src/core/gatherer.ts +59 -24
  157. package/src/core/index.ts +36 -15
  158. package/src/core/logger.ts +1 -12
  159. package/src/core/runner.ts +215 -152
  160. package/src/dsl/journey.ts +37 -6
  161. package/src/dsl/monitor.ts +88 -0
  162. package/src/dsl/step.ts +9 -2
  163. package/src/formatter/javascript.ts +367 -0
  164. package/src/generator/index.ts +316 -0
  165. package/src/generator/utils.ts +80 -0
  166. package/src/helpers.ts +132 -12
  167. package/src/index.ts +22 -22
  168. package/src/loader.ts +171 -0
  169. package/src/locations/index.ts +108 -0
  170. package/src/locations/public-locations.ts +38 -0
  171. package/src/options.ts +211 -0
  172. package/src/plugins/browser-console.ts +30 -8
  173. package/src/plugins/network.ts +208 -267
  174. package/src/plugins/performance.ts +6 -22
  175. package/src/plugins/plugin-manager.ts +49 -31
  176. package/src/plugins/tracing.ts +8 -9
  177. package/src/push/bundler.ts +100 -0
  178. package/src/push/index.ts +202 -0
  179. package/src/push/monitor.ts +96 -0
  180. package/src/push/plugin.ts +119 -0
  181. package/src/push/request.ts +103 -0
  182. package/src/reporters/base.ts +63 -52
  183. package/src/reporters/index.ts +26 -3
  184. package/src/reporters/json.ts +203 -206
  185. package/src/reporters/junit.ts +98 -93
  186. package/src/sdk/lh-trace-processor.ts +132 -68
  187. package/src/sdk/trace-metrics.ts +10 -6
  188. package/src/sdk/trace-processor.ts +28 -13
  189. package/templates/.github/workflows/run-synthetics.yml +26 -0
  190. package/templates/README.md +21 -0
  191. package/templates/journeys/advanced-example-helpers.ts +54 -0
  192. package/templates/journeys/advanced-example.journey.ts +43 -0
  193. package/templates/journeys/example.journey.ts +18 -0
  194. package/templates/synthetics.config.ts +27 -0
  195. package/CHANGELOG.md +0 -102
  196. package/NOTICE.txt +0 -221
  197. package/dist/parse_args.d.ts.map +0 -1
  198. package/dist/parse_args.js +0 -89
  199. package/dist/parse_args.js.map +0 -1
  200. package/dist/reporters/reporter.d.ts.map +0 -1
  201. package/dist/reporters/reporter.js.map +0 -1
  202. package/src/parse_args.ts +0 -127
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@elastic/synthetics",
3
- "version": "1.0.0-beta.3",
3
+ "version": "1.0.0-beta.32",
4
4
  "description": "Elastic synthetic monitoring agent",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
- "clean": "rm -rf dist",
8
+ "clean": "rimraf dist",
9
9
  "prepublish": "npm run clean && npm run build",
10
10
  "build": "tsc",
11
+ "build:locations": "sh utils/update_locations.sh",
11
12
  "watch": "tsc -w",
12
13
  "lint": "eslint . --rulesdir utils/eslint-rules",
13
14
  "lint:fix": "npm run lint -- --fix",
@@ -22,7 +23,8 @@
22
23
  },
23
24
  "files": [
24
25
  "dist",
25
- "src"
26
+ "src",
27
+ "templates"
26
28
  ],
27
29
  "lint-staged": {
28
30
  "*.{js,ts}": [
@@ -38,32 +40,42 @@
38
40
  "author": "",
39
41
  "license": "MIT",
40
42
  "dependencies": {
41
- "commander": "^7.0.0",
43
+ "@cspotcode/source-map-support": "^0.8.1",
44
+ "archiver": "^5.3.0",
45
+ "commander": "^9.0.0",
42
46
  "deepmerge": "^4.2.2",
43
- "expect": "^27.0.2",
47
+ "enquirer": "^2.3.6",
48
+ "esbuild": "^0.14.27",
49
+ "expect": "^28.1.3",
44
50
  "http-proxy": "^1.18.1",
45
- "kleur": "^4.1.3",
51
+ "kleur": "^4.1.4",
46
52
  "micromatch": "^4.0.4",
47
- "playwright-chromium": "=1.11.0",
48
- "sharp": "^0.28.3",
53
+ "playwright-chromium": "=1.20.1",
54
+ "playwright-core": "=1.20.1",
55
+ "sharp": "^0.30.6",
49
56
  "snakecase-keys": "^3.2.1",
50
- "sonic-boom": "^1.3.0",
51
- "source-map-support": "^0.5.19",
52
- "ts-node": "^9.1.1",
53
- "typescript": "^4.1.3"
57
+ "sonic-boom": "^2.6.0",
58
+ "ts-node": "^10.9.0",
59
+ "typescript": "^4.7.4",
60
+ "undici": "^5.7.0"
54
61
  },
55
62
  "devDependencies": {
56
- "@types/jest": "^26.0.19",
63
+ "@types/jest": "^28.1.3",
57
64
  "@types/micromatch": "^4.0.1",
58
- "@types/node": "^14.14.14",
65
+ "@types/node": "^16.11.44",
59
66
  "@types/sharp": "^0.28.2",
60
- "@typescript-eslint/eslint-plugin": "^3.10.1",
61
- "@typescript-eslint/parser": "^3.10.1",
62
- "eslint": "^7.15.0",
67
+ "@typescript-eslint/eslint-plugin": "^5.0.0",
68
+ "@typescript-eslint/parser": "^5.0.0",
69
+ "eslint": "^8.0.1",
63
70
  "husky": "^4.3.6",
64
- "jest": "^26.6.3",
71
+ "jest": "^28.1.3",
65
72
  "lint-staged": "^10.5.3",
66
- "prettier": "^2.2.1",
67
- "ts-jest": "^26.4.4"
73
+ "prettier": "^2.4.1",
74
+ "rimraf": "^3.0.2",
75
+ "ts-jest": "^28.0.5",
76
+ "unzipper": "^0.10.11"
77
+ },
78
+ "engines": {
79
+ "node": ">14.14.0"
68
80
  }
69
81
  }
package/src/cli.ts CHANGED
@@ -25,169 +25,222 @@
25
25
  *
26
26
  */
27
27
 
28
- import { stdin, cwd } from 'process';
29
- import { resolve } from 'path';
30
- import merge from 'deepmerge';
31
- import { step, journey } from './core';
32
- import { log } from './core/logger';
33
- import program, { options } from './parse_args';
28
+ import { program, Option } from 'commander';
29
+ import { cwd } from 'process';
30
+ import { CliArgs, PushOptions } from './common_types';
31
+ import { reporters } from './reporters';
34
32
  import {
35
- findPkgJsonByTraversing,
36
- isDepInstalled,
37
- isDirectory,
38
- totalist,
39
- } from './helpers';
33
+ normalizeOptions,
34
+ parseThrottling,
35
+ getCommonCommandOpts,
36
+ } from './options';
37
+ import { loadTestFiles } from './loader';
40
38
  import { run } from './';
41
- import { readConfig } from './config';
42
-
43
- const resolvedCwd = cwd();
44
- /**
45
- * Set debug based on DEBUG ENV and -d flags
46
- * namespace - synthetics
47
- */
48
- const namespace = 'synthetics';
49
- if (process.env.DEBUG === namespace || Boolean(options.debug)) {
50
- process.env.DEBUG = '1';
51
- }
52
-
53
- const loadInlineScript = source => {
54
- const scriptFn = new Function('step', 'page', 'browser', 'params', source);
55
- journey('inline', async ({ page, browser, params }) => {
56
- scriptFn.apply(null, [step, page, browser, params]);
57
- });
58
- };
59
-
60
- async function readStdin() {
61
- const chunks = [];
62
- stdin.resume();
63
- stdin.setEncoding('utf-8');
64
- for await (const chunk of stdin) {
65
- chunks.push(chunk);
66
- }
67
- return chunks.join();
68
- }
39
+ import { runner } from './core';
40
+ import { SyntheticsLocations } from './dsl/monitor';
41
+ import {
42
+ push,
43
+ loadSettings,
44
+ validateSettings,
45
+ catchIncorrectSettings,
46
+ } from './push';
47
+ import {
48
+ formatLocations,
49
+ getLocations,
50
+ renderLocations,
51
+ LocationCmdOptions,
52
+ } from './locations';
53
+ import { resolve } from 'path';
54
+ import { Generator } from './generator';
55
+ import { error } from './helpers';
56
+ import { LocationsMap } from './locations/public-locations';
69
57
 
70
- function requireSuites(suites: Iterable<string>) {
71
- for (const suite of suites) {
72
- require(suite);
73
- }
74
- }
58
+ /* eslint-disable-next-line @typescript-eslint/no-var-requires */
59
+ const { name, version } = require('../package.json');
75
60
 
76
- /**
77
- * Handle both directory and files that are passed through TTY
78
- * and add them to suites
79
- */
80
- async function prepareSuites(inputs: string[]) {
81
- const suites = new Set<string>();
82
- const addSuite = absPath => {
83
- log(`Processing file: ${absPath}`);
84
- suites.add(require.resolve(absPath));
85
- };
86
- /**
87
- * Match all files inside the directory with the
88
- * .journey.{mjs|cjs|js|ts) extensions
89
- */
90
- const pattern = options.pattern
91
- ? new RegExp(options.pattern, 'i')
92
- : /.+\.journey\.([mc]js|[jt]s?)$/;
93
- /**
94
- * Ignore node_modules by default when running suites
95
- */
96
- const ignored = /node_modules/i;
61
+ const { params, pattern, tags, match, playwrightOpts } = getCommonCommandOpts();
97
62
 
98
- for (const input of inputs) {
99
- const absPath = resolve(resolvedCwd, input);
100
- /**
101
- * Validate for package.json file before running
102
- * the suites
103
- */
104
- findPkgJsonByTraversing(absPath, resolvedCwd);
105
- if (isDirectory(absPath)) {
106
- await totalist(absPath, (rel, abs) => {
107
- if (pattern.test(rel) && !ignored.test(rel)) {
108
- addSuite(abs);
63
+ program
64
+ .name(`npx ${name}`)
65
+ .usage('[options] [dir] [files] file')
66
+ .option(
67
+ '-c, --config <path>',
68
+ 'configuration path (default: synthetics.config.js)'
69
+ )
70
+ .addOption(pattern)
71
+ .addOption(tags)
72
+ .addOption(match)
73
+ .addOption(params)
74
+ .addOption(
75
+ new Option('--reporter <value>', `output repoter format`).choices(
76
+ Object.keys(reporters)
77
+ )
78
+ )
79
+ .option('--inline', 'Run inline journeys from heartbeat')
80
+ .option('-r, --require <modules...>', 'module(s) to preload')
81
+ .option('--no-headless', 'run browser in headful mode')
82
+ .option('--sandbox', 'enable chromium sandboxing')
83
+ .option('--rich-events', 'Mimics a heartbeat run')
84
+ .option(
85
+ '--capability <features...>',
86
+ 'Enable capabilities through feature flags'
87
+ )
88
+ .addOption(
89
+ new Option('--screenshots [flag]', 'take screenshots at end of each step')
90
+ .choices(['on', 'off', 'only-on-failure'])
91
+ .default('on')
92
+ )
93
+ .option(
94
+ '--dry-run',
95
+ "don't actually execute anything, report only registered journeys"
96
+ )
97
+ .option(
98
+ '--outfd <fd>',
99
+ 'specify a file descriptor for logs. Default is stdout',
100
+ parseInt
101
+ )
102
+ .option(
103
+ '--ws-endpoint <endpoint>',
104
+ 'Browser WebSocket endpoint to connect to'
105
+ )
106
+ .option(
107
+ '--pause-on-error',
108
+ 'pause on error until a keypress is made in the console. Useful during development'
109
+ )
110
+ .option(
111
+ '--ignore-https-errors',
112
+ 'ignores any HTTPS errors in sites being tested, including ones related to unrecognized certs or signatures. This can be insecure!'
113
+ )
114
+ .option(
115
+ '--quiet-exit-code',
116
+ 'always return 0 as an exit code status, regardless of test pass / fail. Only return > 0 exit codes on internal errors where the suite could not be run'
117
+ )
118
+ .option(
119
+ '--throttling <config>',
120
+ 'JSON object to throttle network conditions for download and upload throughput in megabits/second and latency in milliseconds. Ex: { "download": 10, "upload": 5, "latency": 200 }.',
121
+ parseThrottling,
122
+ {}
123
+ )
124
+ .option('--no-throttling', 'Turns off default network throttling.')
125
+ .addOption(playwrightOpts)
126
+ .version(version)
127
+ .description('Run synthetic tests')
128
+ .action(async (cliArgs: CliArgs) => {
129
+ try {
130
+ await loadTestFiles(cliArgs, program.args);
131
+ const options = normalizeOptions(cliArgs);
132
+ const results = await run(options);
133
+ /**
134
+ * Exit with error status if any journey fails
135
+ */
136
+ if (!options.quietExitCode) {
137
+ for (const result of Object.values(results)) {
138
+ if (result.status === 'failed') {
139
+ process.exit(1);
140
+ }
109
141
  }
110
- });
111
- } else {
112
- addSuite(absPath);
113
- }
114
- }
115
- return suites.values();
116
- }
117
-
118
- (async () => {
119
- if (options.inline) {
120
- const source = await readStdin();
121
- loadInlineScript(source);
122
- } else {
123
- /**
124
- * Preload modules before running the suites
125
- */
126
- const modules = [].concat(options.require || []).filter(Boolean);
127
- for (const name of modules) {
128
- if (isDepInstalled(name)) {
129
- require(name);
130
- } else {
131
- throw new Error(`cannot find module '${name}'`);
132
142
  }
143
+ } catch (e) {
144
+ console.error(e);
145
+ process.exit(1);
133
146
  }
134
- /**
135
- * Transform `.ts` files out of the box by invoking
136
- * the `ts-node` via `transpile-only` mode that compiles
137
- * TS files without doing any extensive type checks
138
- */
139
- /* eslint-disable-next-line @typescript-eslint/no-var-requires */
140
- require('ts-node').register({
141
- transpileOnly: true,
142
- compilerOptions: {
143
- esModuleInterop: true,
144
- allowJs: true,
145
- target: 'es2018',
146
- },
147
- });
148
- /**
149
- * Handle piped files by reading the STDIN
150
- * ex: ls example/suites/*.js | npx @elastic/synthetics
151
- */
152
- const files =
153
- program.args.length > 0
154
- ? program.args
155
- : (await readStdin()).split('\n').filter(Boolean);
156
- const suites = await prepareSuites(files);
157
- requireSuites(suites);
158
- }
147
+ });
159
148
 
160
- /**
161
- * Use the NODE_ENV variable to control the environment if its not explicity
162
- * passed from either CLI or through the API
163
- */
164
- const environment = options.environment || process.env['NODE_ENV'];
165
- /**
166
- * Validate and handle configs
167
- */
168
- const config = readConfig(environment, options.config);
169
- const params = merge(config.params, JSON.parse(options.suiteParams));
170
- /**
171
- * use JSON reporter if json flag is enabled
172
- */
173
- const reporter = options.json ? 'json' : options.reporter;
149
+ // Push command
150
+ program
151
+ .command('push')
152
+ .description(
153
+ 'Push all journeys in the current directory to create monitors within the Kibana monitor management UI'
154
+ )
155
+ .requiredOption(
156
+ '--auth <auth>',
157
+ 'API key used for Kibana authentication(https://www.elastic.co/guide/en/kibana/master/api-keys.html).'
158
+ )
159
+ .option(
160
+ '--schedule <time-in-minutes>',
161
+ "schedule in minutes for the pushed monitors. Setting `10`, for example, configures monitors which don't have an interval defined to run every 10 minutes.",
162
+ parseInt
163
+ )
164
+ .addOption(
165
+ new Option(
166
+ '--locations <locations...>',
167
+ 'default list of locations from which your monitors will run.'
168
+ ).choices(SyntheticsLocations)
169
+ )
170
+ .option(
171
+ '--private-locations <locations...>',
172
+ 'default list of private locations from which your monitors will run.'
173
+ )
174
+ .option('--url <url>', 'Kibana URL to upload the monitors')
175
+ .option(
176
+ '--project <id>',
177
+ 'id that will be used for logically grouping monitors'
178
+ )
179
+ .option(
180
+ '--space <space>',
181
+ 'the target Kibana spaces for the pushed monitors — spaces help you organise pushed monitors.'
182
+ )
183
+ .addOption(pattern)
184
+ .addOption(tags)
185
+ .addOption(match)
186
+ .addOption(params)
187
+ .addOption(playwrightOpts)
188
+ .action(async (cmdOpts: PushOptions) => {
189
+ try {
190
+ const settings = await loadSettings();
191
+ await loadTestFiles({ inline: false }, [cwd()]);
192
+ const options = normalizeOptions({
193
+ ...program.opts(),
194
+ ...settings,
195
+ ...cmdOpts,
196
+ }) as PushOptions;
197
+ validateSettings(options);
198
+ await catchIncorrectSettings(settings, options);
199
+ const monitors = runner.buildMonitors(options);
200
+ await push(monitors, options);
201
+ } catch (e) {
202
+ e && console.error(e);
203
+ process.exit(1);
204
+ }
205
+ });
174
206
 
175
- const results = await run({
176
- params: Object.freeze(params),
177
- environment,
178
- reporter,
179
- ...options,
207
+ // Init command
208
+ program
209
+ .command('init [dir]')
210
+ .description('Initialize Elastic synthetics project')
211
+ .action(async (dir = '') => {
212
+ try {
213
+ const generator = await new Generator(resolve(process.cwd(), dir));
214
+ await generator.setup();
215
+ } catch (e) {
216
+ e && error(e);
217
+ process.exit(1);
218
+ }
180
219
  });
181
220
 
182
- /**
183
- * Exit with error status if any journey fails
184
- */
185
- for (const result of Object.values(results)) {
186
- if (result.status === 'failed') {
221
+ // Locations command
222
+ program
223
+ .command('locations')
224
+ .description(
225
+ `List all locations to run the synthetics monitors. Pass optional '--url' and '--auth' to list private locations.`
226
+ )
227
+ .option('--url <url>', 'Kibana URL to fetch all public and private locations')
228
+ .option(
229
+ '--auth <auth>',
230
+ 'API key used for Kibana authentication(https://www.elastic.co/guide/en/kibana/master/api-keys.html).'
231
+ )
232
+ .action(async (cmdOpts: LocationCmdOptions) => {
233
+ try {
234
+ let locations = Object.keys(LocationsMap);
235
+ if (cmdOpts.auth && cmdOpts.url) {
236
+ const allLocations = await getLocations(cmdOpts);
237
+ locations = formatLocations(allLocations);
238
+ }
239
+ renderLocations(locations);
240
+ } catch (e) {
241
+ e && error(e);
187
242
  process.exit(1);
188
243
  }
189
- }
190
- })().catch(e => {
191
- console.error(e);
192
- process.exit(1);
193
- });
244
+ });
245
+
246
+ program.parse(process.argv);