bdy 1.18.33-dev → 1.18.33-dev-pipeline
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/distTs/package.json +1 -1
- package/distTs/src/api/client.js +61 -2
- package/distTs/src/command/crawl/link.js +61 -0
- package/distTs/src/command/crawl/run.js +147 -0
- package/distTs/src/command/crawl/validation.js +154 -0
- package/distTs/src/command/crawl.js +13 -0
- package/distTs/src/command/pipeline/run/apply.js +62 -0
- package/distTs/src/command/pipeline/run/cancel.js +36 -0
- package/distTs/src/command/pipeline/run/list.js +52 -0
- package/distTs/src/command/pipeline/run/logs.js +37 -0
- package/distTs/src/command/pipeline/run/retry.js +36 -0
- package/distTs/src/command/pipeline/run/start.js +101 -0
- package/distTs/src/command/pipeline/run/status.js +35 -0
- package/distTs/src/command/pipeline/run.js +22 -125
- package/distTs/src/command/project/link.js +11 -11
- package/distTs/src/command/tests/capture/validation.js +46 -0
- package/distTs/src/command/tests/capture.js +103 -0
- package/distTs/src/command/tests/unit/link.js +61 -0
- package/distTs/src/command/tests/unit/upload.js +91 -0
- package/distTs/src/command/tests/unit.js +13 -0
- package/distTs/src/command/tests/visual/link.js +61 -0
- package/distTs/src/command/tests/visual/session/close.js +32 -0
- package/distTs/src/command/tests/visual/session/create.js +86 -0
- package/distTs/src/command/tests/visual/session.js +13 -0
- package/distTs/src/command/tests/visual/setup.js +20 -0
- package/distTs/src/command/tests/visual/shared/validation.js +145 -0
- package/distTs/src/command/tests/visual/upload.js +141 -0
- package/distTs/src/command/tests/visual.js +17 -0
- package/distTs/src/command/tests.js +15 -0
- package/distTs/src/crawl/requests.js +141 -0
- package/distTs/src/input.js +11 -10
- package/distTs/src/output/pipeline.js +1383 -0
- package/distTs/src/output.js +149 -31
- package/distTs/src/texts.js +56 -38
- package/distTs/src/tunnel/output/interactive/tunnel.js +2 -2
- package/distTs/src/types/crawl.js +2 -0
- package/distTs/src/types/pipeline.js +424 -0
- package/distTs/src/unitTest/context.js +26 -0
- package/package.json +1 -1
- package/distTs/src/command/project/get.js +0 -18
- package/distTs/src/command/project/set.js +0 -31
- package/distTs/src/command/sandbox/get/yaml.js +0 -30
- package/distTs/src/command/vt/scrape.js +0 -193
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../../../utils");
|
|
7
|
+
const texts_1 = require("../../../texts");
|
|
8
|
+
const input_1 = __importDefault(require("../../../input"));
|
|
9
|
+
const output_1 = __importDefault(require("../../../output"));
|
|
10
|
+
const commandPipelineRunLogs = (0, utils_1.newCommand)('logs', texts_1.DESC_COMMAND_PIPELINE_RUN_LOGS);
|
|
11
|
+
commandPipelineRunLogs.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
12
|
+
commandPipelineRunLogs.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
|
|
13
|
+
commandPipelineRunLogs.option('-n, --no-wait', texts_1.OPTION_PIPELINE_RUN_NO_WAIT);
|
|
14
|
+
commandPipelineRunLogs.argument('<identifier>', texts_1.OPTION_PIPELINE_RUN_ARGUMENT);
|
|
15
|
+
commandPipelineRunLogs.argument('<run-id>', texts_1.OPTION_PIPELINE_RUN_ID);
|
|
16
|
+
commandPipelineRunLogs.argument('<run-action-id>', texts_1.OPTION_PIPELINE_RUN_ACTION_ID);
|
|
17
|
+
commandPipelineRunLogs.addHelpText('after', texts_1.EXAMPLE_PIPELINE_RUN_LOGS);
|
|
18
|
+
commandPipelineRunLogs.action(async (identifier, runId, runActionId, options) => {
|
|
19
|
+
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
20
|
+
const project = input_1.default.restApiProject(options.project);
|
|
21
|
+
const client = input_1.default.restApiTokenClient();
|
|
22
|
+
const rid = input_1.default.pipelineRunId(runId);
|
|
23
|
+
const raid = input_1.default.pipelineRunActionId(runActionId);
|
|
24
|
+
const data = await client.getPipelineByIdentifier(workspace, project, identifier);
|
|
25
|
+
if (!data || !data.domain) {
|
|
26
|
+
output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
|
|
27
|
+
}
|
|
28
|
+
if (!data.project_identifier) {
|
|
29
|
+
output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
|
|
30
|
+
}
|
|
31
|
+
if (!data.pipeline_id) {
|
|
32
|
+
output_1.default.exitError(texts_1.ERR_PIPELINE_NOT_FOUND);
|
|
33
|
+
}
|
|
34
|
+
const OutputPipeline = require('../../../output/pipeline').default;
|
|
35
|
+
await OutputPipeline.runLogs(client, workspace, project, data.pipeline_id, rid, raid, !options.wait);
|
|
36
|
+
});
|
|
37
|
+
exports.default = commandPipelineRunLogs;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../../../utils");
|
|
7
|
+
const texts_1 = require("../../../texts");
|
|
8
|
+
const input_1 = __importDefault(require("../../../input"));
|
|
9
|
+
const output_1 = __importDefault(require("../../../output"));
|
|
10
|
+
const commandPipelineRunRetry = (0, utils_1.newCommand)('retry', texts_1.DESC_COMMAND_PIPELINE_RUN_RETRY);
|
|
11
|
+
commandPipelineRunRetry.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
12
|
+
commandPipelineRunRetry.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
|
|
13
|
+
commandPipelineRunRetry.option('-n, --no-wait', texts_1.OPTION_PIPELINE_RUN_NO_WAIT);
|
|
14
|
+
commandPipelineRunRetry.argument('<identifier>', texts_1.OPTION_PIPELINE_RUN_ARGUMENT);
|
|
15
|
+
commandPipelineRunRetry.argument('<run-id>', texts_1.OPTION_PIPELINE_RUN_ID);
|
|
16
|
+
commandPipelineRunRetry.addHelpText('after', texts_1.EXAMPLE_PIPELINE_RUN_RETRY);
|
|
17
|
+
commandPipelineRunRetry.action(async (identifier, runId, options) => {
|
|
18
|
+
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
19
|
+
const project = input_1.default.restApiProject(options.project);
|
|
20
|
+
const client = input_1.default.restApiTokenClient();
|
|
21
|
+
const rid = input_1.default.pipelineRunId(runId);
|
|
22
|
+
const data = await client.getPipelineByIdentifier(workspace, project, identifier);
|
|
23
|
+
if (!data || !data.domain) {
|
|
24
|
+
output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
|
|
25
|
+
}
|
|
26
|
+
if (!data.project_identifier) {
|
|
27
|
+
output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
|
|
28
|
+
}
|
|
29
|
+
if (!data.pipeline_id) {
|
|
30
|
+
output_1.default.exitError(texts_1.ERR_PIPELINE_NOT_FOUND);
|
|
31
|
+
}
|
|
32
|
+
await client.pipelineRunRetry(workspace, project, data.pipeline_id, rid);
|
|
33
|
+
const OutputPipeline = require('../../../output/pipeline').default;
|
|
34
|
+
await OutputPipeline.runStatus(client, workspace, project, data.pipeline_id, rid, !options.wait);
|
|
35
|
+
});
|
|
36
|
+
exports.default = commandPipelineRunRetry;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../../../utils");
|
|
7
|
+
const texts_1 = require("../../../texts");
|
|
8
|
+
const output_1 = __importDefault(require("../../../output"));
|
|
9
|
+
const input_1 = __importDefault(require("../../../input"));
|
|
10
|
+
const commandPipelineRunStart = (0, utils_1.newCommand)('start', texts_1.DESC_COMMAND_PIPELINE_RUN_START);
|
|
11
|
+
commandPipelineRunStart.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
12
|
+
commandPipelineRunStart.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
|
|
13
|
+
commandPipelineRunStart.option('-b, --branch <branch>', texts_1.OPTION_PIPELINE_RUN_BRANCH);
|
|
14
|
+
commandPipelineRunStart.option('-t, --tag <tag>', texts_1.OPTION_PIPELINE_RUN_TAG);
|
|
15
|
+
commandPipelineRunStart.option('-pr, --pull-request <pull request>', texts_1.OPTION_PIPELINE_RUN_PULL_REQUEST);
|
|
16
|
+
commandPipelineRunStart.option('-r, --revision <revision>', texts_1.OPTION_PIPELINE_RUN_REVISION);
|
|
17
|
+
commandPipelineRunStart.option('--comment <comment>', texts_1.OPTION_PIPELINE_RUN_COMMENT);
|
|
18
|
+
commandPipelineRunStart.option('-f, --refresh', texts_1.OPTION_PIPELINE_RUN_REFRESH);
|
|
19
|
+
commandPipelineRunStart.option('-c, --clear-cache', texts_1.OPTION_PIPELINE_RUN_CLEAR_CACHE);
|
|
20
|
+
commandPipelineRunStart.option('--priority <priority>', texts_1.OPTION_PIPELINE_RUN_PRIORITY);
|
|
21
|
+
commandPipelineRunStart.option('-v, --variable <variables...>', texts_1.OPTION_PIPELINE_RUN_VAR);
|
|
22
|
+
commandPipelineRunStart.option('-vm, --variable-masked <variables...>', texts_1.OPTION_PIPELINE_RUN_VAR);
|
|
23
|
+
commandPipelineRunStart.option('--schedule <date>', texts_1.OPTION_PIPELINE_RUN_DELAY);
|
|
24
|
+
commandPipelineRunStart.option('--action <actions...>', texts_1.OPTION_PIPELINE_RUN_ACTION);
|
|
25
|
+
commandPipelineRunStart.option('--no-wait', texts_1.OPTION_PIPELINE_RUN_NO_WAIT);
|
|
26
|
+
commandPipelineRunStart.argument('<identifier>', texts_1.OPTION_PIPELINE_RUN_ARGUMENT);
|
|
27
|
+
commandPipelineRunStart.usage('<identifier> [options]');
|
|
28
|
+
commandPipelineRunStart.addHelpText('after', texts_1.EXAMPLE_PIPELINE_RUN_START);
|
|
29
|
+
commandPipelineRunStart.action(async (identifier, options) => {
|
|
30
|
+
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
31
|
+
const project = input_1.default.restApiProject(options.project);
|
|
32
|
+
const client = input_1.default.restApiTokenClient();
|
|
33
|
+
const data = await client.getPipelineByIdentifier(workspace, project, identifier);
|
|
34
|
+
if (!data || !data.domain) {
|
|
35
|
+
output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
|
|
36
|
+
}
|
|
37
|
+
if (!data.project_identifier) {
|
|
38
|
+
output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
|
|
39
|
+
}
|
|
40
|
+
if (!data.pipeline_id) {
|
|
41
|
+
output_1.default.exitError(texts_1.ERR_PIPELINE_NOT_FOUND);
|
|
42
|
+
}
|
|
43
|
+
const body = {};
|
|
44
|
+
if (options.branch) {
|
|
45
|
+
body.branch = {
|
|
46
|
+
name: options.branch,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (options.tag) {
|
|
50
|
+
body.tag = {
|
|
51
|
+
name: options.tag,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (options.pullRequest) {
|
|
55
|
+
body.pull_request = {
|
|
56
|
+
name: `pull/${options.pullRequest}`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (options.revision) {
|
|
60
|
+
body.to_revision = {
|
|
61
|
+
revision: options.revision,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (options.comment) {
|
|
65
|
+
body.comment = options.comment;
|
|
66
|
+
}
|
|
67
|
+
if (options.refresh) {
|
|
68
|
+
body.refresh = true;
|
|
69
|
+
}
|
|
70
|
+
if (options.clearCache) {
|
|
71
|
+
body.clear_cache = true;
|
|
72
|
+
}
|
|
73
|
+
const priority = input_1.default.pipelineRunPriority(options.priority);
|
|
74
|
+
if (priority) {
|
|
75
|
+
body.priority = priority;
|
|
76
|
+
}
|
|
77
|
+
body.variables = [];
|
|
78
|
+
if (options.variable) {
|
|
79
|
+
body.variables = body.variables.concat(input_1.default.pipelineRunVariable(options.variable, false));
|
|
80
|
+
}
|
|
81
|
+
if (options.variableMasked) {
|
|
82
|
+
body.variables = body.variables.concat(input_1.default.pipelineRunVariable(options.variableMasked, true));
|
|
83
|
+
}
|
|
84
|
+
const delay = input_1.default.pipelineRunDelay(options.schedule);
|
|
85
|
+
if (delay) {
|
|
86
|
+
body.delay_until = delay;
|
|
87
|
+
}
|
|
88
|
+
const actions = input_1.default.pipelineRunAction(options.action);
|
|
89
|
+
if (actions) {
|
|
90
|
+
body.actions_to_run = actions;
|
|
91
|
+
}
|
|
92
|
+
const result = await client.pipelineRun(workspace, project, data.pipeline_id, body);
|
|
93
|
+
if (!options.wait) {
|
|
94
|
+
output_1.default.exitSuccess((0, texts_1.TXT_PIPELINE_RUN_SUCCESS)(result.id, result.html_url));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const OutputPipeline = require('../../../output/pipeline').default;
|
|
98
|
+
await OutputPipeline.runStatus(client, workspace, project, data.pipeline_id, result.id, false);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
exports.default = commandPipelineRunStart;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../../../utils");
|
|
7
|
+
const texts_1 = require("../../../texts");
|
|
8
|
+
const input_1 = __importDefault(require("../../../input"));
|
|
9
|
+
const output_1 = __importDefault(require("../../../output"));
|
|
10
|
+
const commandPipelineRunStatus = (0, utils_1.newCommand)('status', texts_1.DESC_COMMAND_PIPELINE_RUN_STATUS);
|
|
11
|
+
commandPipelineRunStatus.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
12
|
+
commandPipelineRunStatus.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
|
|
13
|
+
commandPipelineRunStatus.option('-n, --no-wait', texts_1.OPTION_PIPELINE_RUN_NO_WAIT);
|
|
14
|
+
commandPipelineRunStatus.argument('<identifier>', texts_1.OPTION_PIPELINE_RUN_ARGUMENT);
|
|
15
|
+
commandPipelineRunStatus.argument('<run-id>', texts_1.OPTION_PIPELINE_RUN_ID);
|
|
16
|
+
commandPipelineRunStatus.addHelpText('after', texts_1.EXAMPLE_PIPELINE_RUN_STATUS);
|
|
17
|
+
commandPipelineRunStatus.action(async (identifier, runId, options) => {
|
|
18
|
+
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
19
|
+
const project = input_1.default.restApiProject(options.project);
|
|
20
|
+
const client = input_1.default.restApiTokenClient();
|
|
21
|
+
const rid = input_1.default.pipelineRunId(runId);
|
|
22
|
+
const data = await client.getPipelineByIdentifier(workspace, project, identifier);
|
|
23
|
+
if (!data || !data.domain) {
|
|
24
|
+
output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
|
|
25
|
+
}
|
|
26
|
+
if (!data.project_identifier) {
|
|
27
|
+
output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
|
|
28
|
+
}
|
|
29
|
+
if (!data.pipeline_id) {
|
|
30
|
+
output_1.default.exitError(texts_1.ERR_PIPELINE_NOT_FOUND);
|
|
31
|
+
}
|
|
32
|
+
const OutputPipeline = require('../../../output/pipeline').default;
|
|
33
|
+
await OutputPipeline.runStatus(client, workspace, project, data.pipeline_id, rid, !options.wait);
|
|
34
|
+
});
|
|
35
|
+
exports.default = commandPipelineRunStatus;
|
|
@@ -5,130 +5,27 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const utils_1 = require("../../utils");
|
|
7
7
|
const texts_1 = require("../../texts");
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
const
|
|
8
|
+
const status_1 = __importDefault(require("./run/status"));
|
|
9
|
+
const start_1 = __importDefault(require("./run/start"));
|
|
10
|
+
const logs_1 = __importDefault(require("./run/logs"));
|
|
11
|
+
const cancel_1 = __importDefault(require("./run/cancel"));
|
|
12
|
+
const retry_1 = __importDefault(require("./run/retry"));
|
|
13
|
+
const list_1 = __importDefault(require("./run/list"));
|
|
14
|
+
const apply_1 = __importDefault(require("./run/apply"));
|
|
11
15
|
const commandPipelineRun = (0, utils_1.newCommand)('run', texts_1.DESC_COMMAND_PIPELINE_RUN);
|
|
12
|
-
commandPipelineRun.
|
|
13
|
-
commandPipelineRun.
|
|
14
|
-
commandPipelineRun.
|
|
15
|
-
commandPipelineRun.
|
|
16
|
-
commandPipelineRun.
|
|
17
|
-
commandPipelineRun.
|
|
18
|
-
commandPipelineRun.
|
|
19
|
-
commandPipelineRun.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
commandPipelineRun.argument('<identifier>', texts_1.OPTION_PIPELINE_RUN_ARGUMENT);
|
|
28
|
-
commandPipelineRun.usage('<identifier> [options]');
|
|
29
|
-
commandPipelineRun.addHelpText('after', texts_1.EXAMPLE_PIPELINE_RUN);
|
|
30
|
-
commandPipelineRun.action(async (identifier, options) => {
|
|
31
|
-
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
32
|
-
const project = input_1.default.restApiProject(options.project);
|
|
33
|
-
const client = input_1.default.restApiTokenClient();
|
|
34
|
-
const data = await client.getPipelineByIdentifier(workspace, project, identifier);
|
|
35
|
-
if (!data || !data.domain) {
|
|
36
|
-
output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
|
|
37
|
-
}
|
|
38
|
-
if (!data.project_identifier) {
|
|
39
|
-
output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
|
|
40
|
-
}
|
|
41
|
-
if (!data.pipeline_id) {
|
|
42
|
-
output_1.default.exitError(texts_1.ERR_PIPELINE_NOT_FOUND);
|
|
43
|
-
}
|
|
44
|
-
const body = {};
|
|
45
|
-
if (options.branch) {
|
|
46
|
-
body.branch = {
|
|
47
|
-
name: options.branch,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
if (options.tag) {
|
|
51
|
-
body.tag = {
|
|
52
|
-
name: options.tag,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
if (options.pullRequest) {
|
|
56
|
-
body.pull_request = {
|
|
57
|
-
name: `pull/${options.pullRequest}`,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
if (options.revision) {
|
|
61
|
-
body.to_revision = {
|
|
62
|
-
revision: options.revision,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
if (options.comment) {
|
|
66
|
-
body.comment = options.comment;
|
|
67
|
-
}
|
|
68
|
-
if (options.refresh) {
|
|
69
|
-
body.refresh = true;
|
|
70
|
-
}
|
|
71
|
-
if (options.clearCache) {
|
|
72
|
-
body.clear_cache = true;
|
|
73
|
-
}
|
|
74
|
-
const priority = input_1.default.pipelineRunPriority(options.priority);
|
|
75
|
-
if (priority) {
|
|
76
|
-
body.priority = priority;
|
|
77
|
-
}
|
|
78
|
-
body.variables = [];
|
|
79
|
-
if (options.variable) {
|
|
80
|
-
body.variables = body.variables.concat(input_1.default.pipelineRunVariable(options.variable, false));
|
|
81
|
-
}
|
|
82
|
-
if (options.variableMasked) {
|
|
83
|
-
body.variables = body.variables.concat(input_1.default.pipelineRunVariable(options.variableMasked, true));
|
|
84
|
-
}
|
|
85
|
-
const delay = input_1.default.pipelineRunDelay(options.schedule);
|
|
86
|
-
if (delay) {
|
|
87
|
-
body.delay_until = delay;
|
|
88
|
-
}
|
|
89
|
-
const actions = input_1.default.pipelineRunAction(options.action);
|
|
90
|
-
if (actions) {
|
|
91
|
-
body.actions_to_run = actions;
|
|
92
|
-
}
|
|
93
|
-
const result = await client.pipelineRun(workspace, project, data.pipeline_id, body);
|
|
94
|
-
if (options.wait) {
|
|
95
|
-
const minutes = input_1.default.pipelineRunWaitTime(options.wait);
|
|
96
|
-
wait(minutes, workspace, project, data.pipeline_id, result.id, result.html_url, client);
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
output_1.default.exitSuccess((0, texts_1.TXT_PIPELINE_RUN_SUCCESS)(result.html_url));
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
const wait = (minutes, workspace, project, pipelineId, runId, htmlUrl, client) => {
|
|
103
|
-
const start = Date.now();
|
|
104
|
-
output_1.default.normal((0, texts_1.TXT_PIPELINE_RUN_WAIT)(minutes));
|
|
105
|
-
let fetchCounter = 1;
|
|
106
|
-
const ts1 = setTimeout(() => {
|
|
107
|
-
output_1.default.exitError(texts_1.ERR_RUN_PIPELINE_WAIT_TIMEOUT);
|
|
108
|
-
}, minutes * 60 * 1000);
|
|
109
|
-
const ts2 = setInterval(async () => {
|
|
110
|
-
output_1.default.clearPreviousLine();
|
|
111
|
-
output_1.default.normal((0, texts_1.TXT_PIPELINE_RUN_STILL_WAITING)(formatWaitTime(start)));
|
|
112
|
-
if (fetchCounter >= 3) {
|
|
113
|
-
const run = await client.getPipelineRun(workspace, project, pipelineId, runId);
|
|
114
|
-
if (!['INPROGRESS', 'ENQUEUED', 'TERMINATING'].includes(run.status)) {
|
|
115
|
-
clearTimeout(ts1);
|
|
116
|
-
clearInterval(ts2);
|
|
117
|
-
output_1.default.clearPreviousLine();
|
|
118
|
-
if (run.status === 'SUCCESSFUL') {
|
|
119
|
-
output_1.default.exitSuccess((0, texts_1.TXT_PIPELINE_RUN_FINISH_SUCCESSFULLY)(htmlUrl));
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
output_1.default.exitError((0, texts_1.TXT_PIPELINE_RUN_FINISH_FAILED)(run.status, htmlUrl));
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
fetchCounter = 0;
|
|
126
|
-
}
|
|
127
|
-
fetchCounter += 1;
|
|
128
|
-
}, 1000);
|
|
129
|
-
};
|
|
130
|
-
const formatWaitTime = (start) => {
|
|
131
|
-
const elapsed = Math.floor((Date.now() - start) / 1000);
|
|
132
|
-
return format_1.default.pipelineRunWaitTime(elapsed);
|
|
133
|
-
};
|
|
16
|
+
commandPipelineRun.addCommand(start_1.default);
|
|
17
|
+
commandPipelineRun.addCommand(status_1.default);
|
|
18
|
+
commandPipelineRun.addCommand(logs_1.default);
|
|
19
|
+
commandPipelineRun.addCommand(cancel_1.default);
|
|
20
|
+
commandPipelineRun.addCommand(retry_1.default);
|
|
21
|
+
commandPipelineRun.addCommand(apply_1.default);
|
|
22
|
+
commandPipelineRun.addCommand(list_1.default);
|
|
23
|
+
commandPipelineRun.addHelpText('after', `
|
|
24
|
+
EXAMPLES:${texts_1.EXAMPLE_PIPELINE_RUN_START}
|
|
25
|
+
${texts_1.EXAMPLE_PIPELINE_RUN_STATUS}
|
|
26
|
+
${texts_1.EXAMPLE_PIPELINE_RUN_LOGS}
|
|
27
|
+
${texts_1.EXAMPLE_PIPELINE_RUN_CANCEL}
|
|
28
|
+
${texts_1.EXAMPLE_PIPELINE_RUN_RETRY}
|
|
29
|
+
${texts_1.EXAMPLE_PIPELINE_RUN_APPLY}
|
|
30
|
+
${texts_1.EXAMPLE_PIPELINE_RUN_LIST}`);
|
|
134
31
|
exports.default = commandPipelineRun;
|
|
@@ -23,7 +23,7 @@ commandProjectLink.action(async (dir, options) => {
|
|
|
23
23
|
ProjectCfg.init(path, workspace, project);
|
|
24
24
|
output_1.default.okSign();
|
|
25
25
|
output_1.default.normal(texts_1.TXT_COMMAND_PROJECT_LINK_TO, false);
|
|
26
|
-
output_1.default.
|
|
26
|
+
output_1.default.cyan(` ${url}`);
|
|
27
27
|
await initRepo(workspace, project, path, git, options);
|
|
28
28
|
tryNow();
|
|
29
29
|
output_1.default.exitNormal();
|
|
@@ -54,13 +54,13 @@ const tryNow = () => {
|
|
|
54
54
|
output_1.default.arrowSign();
|
|
55
55
|
output_1.default.label(texts_1.OPT_COMMAND_PROJECT_LINK_TRY_NOW);
|
|
56
56
|
output_1.default.dim('$ ', false);
|
|
57
|
-
output_1.default.
|
|
57
|
+
output_1.default.cyan('bdy tunnel http 3000 ', false);
|
|
58
58
|
output_1.default.muted(' Expose localhost:3000 to the internet');
|
|
59
59
|
output_1.default.dim('$ ', false);
|
|
60
|
-
output_1.default.
|
|
60
|
+
output_1.default.cyan('bdy package publish . ', false);
|
|
61
61
|
output_1.default.muted(' Publish a package from the current project');
|
|
62
62
|
output_1.default.dim('$ ', false);
|
|
63
|
-
output_1.default.
|
|
63
|
+
output_1.default.cyan('bdy sandbox create --run "npm start" ', false);
|
|
64
64
|
output_1.default.muted(' Spin up a cloud sandbox and run your app');
|
|
65
65
|
};
|
|
66
66
|
const initRepo = async (workspace, project, path, git, options) => {
|
|
@@ -89,16 +89,16 @@ const initRepo = async (workspace, project, path, git, options) => {
|
|
|
89
89
|
});
|
|
90
90
|
output_1.default.okSign();
|
|
91
91
|
output_1.default.normal('Remote ', false);
|
|
92
|
-
output_1.default.
|
|
92
|
+
output_1.default.cyan('origin ', false);
|
|
93
93
|
output_1.default.normal('set to ', false);
|
|
94
|
-
output_1.default.
|
|
94
|
+
output_1.default.cyan(remote);
|
|
95
95
|
}
|
|
96
96
|
else if (remotes.origin !== remote) {
|
|
97
97
|
output_1.default.yellow(texts_1.OPT_COMMAND_PROJECT_LINK_HAS_REMOTE);
|
|
98
98
|
output_1.default.normal('Current origin: ', false);
|
|
99
|
-
output_1.default.
|
|
99
|
+
output_1.default.cyan(remotes.origin);
|
|
100
100
|
output_1.default.normal('Buddy project: ', false);
|
|
101
|
-
output_1.default.
|
|
101
|
+
output_1.default.cyan(remote);
|
|
102
102
|
const opt = await output_1.default.inputMenuAdv(texts_1.OPT_COMMAND_PROJECT_LINK_SET_GIT_REMOTE, [
|
|
103
103
|
{
|
|
104
104
|
name: 'Add buddy remote',
|
|
@@ -127,9 +127,9 @@ const initRepo = async (workspace, project, path, git, options) => {
|
|
|
127
127
|
});
|
|
128
128
|
output_1.default.okSign();
|
|
129
129
|
output_1.default.normal('Remote ', false);
|
|
130
|
-
output_1.default.
|
|
130
|
+
output_1.default.cyan('buddy ', false);
|
|
131
131
|
output_1.default.normal('set to ', false);
|
|
132
|
-
output_1.default.
|
|
132
|
+
output_1.default.cyan(remote);
|
|
133
133
|
}
|
|
134
134
|
else if (opt === 'origin') {
|
|
135
135
|
await (0, utils_1.execLocally)(`git remote rm origin`, {
|
|
@@ -140,7 +140,7 @@ const initRepo = async (workspace, project, path, git, options) => {
|
|
|
140
140
|
});
|
|
141
141
|
output_1.default.okSign();
|
|
142
142
|
output_1.default.normal('Origin replaced with ', false);
|
|
143
|
-
output_1.default.
|
|
143
|
+
output_1.default.cyan(remote);
|
|
144
144
|
}
|
|
145
145
|
else {
|
|
146
146
|
return;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validateOptions = validateOptions;
|
|
7
|
+
exports.checkIfMinimalOptionsAreProvided = checkIfMinimalOptionsAreProvided;
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const output_1 = __importDefault(require("../../../output"));
|
|
10
|
+
const validation_1 = require("../visual/shared/validation");
|
|
11
|
+
const optionsSchema = zod_1.z.object({
|
|
12
|
+
urls: zod_1.z.string().optional(),
|
|
13
|
+
sitemap: zod_1.z.string().optional(),
|
|
14
|
+
urlsFile: zod_1.z.string().optional(),
|
|
15
|
+
follow: zod_1.z.boolean(),
|
|
16
|
+
respectRobots: zod_1.z.boolean(),
|
|
17
|
+
ignore: zod_1.z
|
|
18
|
+
.array(zod_1.z.string().regex(/^(?:([^:]+)::)?(?:(CSS|XPATH))=(.+)$/, {
|
|
19
|
+
message: "Ignore option must follow pattern '[scope::]type=value' where type must be CSS or XPATH (scope is optional)",
|
|
20
|
+
}))
|
|
21
|
+
.optional()
|
|
22
|
+
.transform(validation_1.parseScopedSelector),
|
|
23
|
+
cookie: validation_1.cookieSchema,
|
|
24
|
+
header: validation_1.headerSchema,
|
|
25
|
+
delay: validation_1.delaySchema,
|
|
26
|
+
waitFor: validation_1.waitForSchema,
|
|
27
|
+
ignoreUrls: zod_1.z.array(zod_1.z.string()).optional(),
|
|
28
|
+
dryRun: zod_1.z.boolean().optional(),
|
|
29
|
+
});
|
|
30
|
+
function validateOptions(options) {
|
|
31
|
+
try {
|
|
32
|
+
const validatedOptions = optionsSchema.parse(options);
|
|
33
|
+
return validatedOptions;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (error instanceof zod_1.ZodError) {
|
|
37
|
+
output_1.default.exitError(error.errors.map((e) => e.message).join(', '));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function checkIfMinimalOptionsAreProvided(options) {
|
|
45
|
+
return !!options.urls || !!options.sitemap || !!options.urlsFile;
|
|
46
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../../utils");
|
|
7
|
+
const texts_1 = require("../../texts");
|
|
8
|
+
const output_1 = __importDefault(require("../../output"));
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const commandCapture = (0, utils_1.newCommand)('capture', texts_1.DESC_COMMAND_CAPTURE);
|
|
11
|
+
commandCapture.option('--urls <urls>', texts_1.OPTION_COMPARE_URLS);
|
|
12
|
+
commandCapture.option('--sitemap <sitemap>', texts_1.OPTION_COMPARE_SITEMAP);
|
|
13
|
+
commandCapture.option('--urlsFile <urlsFile>', texts_1.OPTION_COMPARE_URLS_FILE);
|
|
14
|
+
commandCapture.option('--dryRun', texts_1.OPTION_COMPARE_DRY_RUN);
|
|
15
|
+
commandCapture.option('--follow', texts_1.OPTION_COMPARE_FOLLOW, false);
|
|
16
|
+
commandCapture.option('--respectRobots', texts_1.OPTION_COMPARE_RESPECT_ROBOTS, false);
|
|
17
|
+
commandCapture.option('--ignoreUrls <ignoreUrls...>', texts_1.OPTION_COMPARE_IGNORE_URLS);
|
|
18
|
+
commandCapture.option('--ignore <ignores...>', texts_1.OPTION_COMPARE_IGNORE);
|
|
19
|
+
commandCapture.option('--cookie <cookies...>', texts_1.OPTION_COMPARE_COOKIE);
|
|
20
|
+
commandCapture.option('--header <headers...>', texts_1.OPTION_COMPARE_HEADER);
|
|
21
|
+
commandCapture.option('--delay <delays...>', texts_1.OPTION_COMPARE_DELAY);
|
|
22
|
+
commandCapture.option('--waitFor <waitFors...>', texts_1.OPTION_COMPARE_WAIT_FOR);
|
|
23
|
+
commandCapture.action(async (options) => {
|
|
24
|
+
const { getCiAndGitInfo, formattedCiInfo } = require('@buddy-works/ci-info');
|
|
25
|
+
const { addProtocolIfMissing } = require('../../visualTest/linkUtils');
|
|
26
|
+
const { sendCompareLinks } = require('../../visualTest/requests');
|
|
27
|
+
const { checkIfMinimalOptionsAreProvided, validateOptions } = require('./capture/validation');
|
|
28
|
+
const { createVtContext, applyToken, applyCiAndCommitInfo } = require('../../visualTest/context');
|
|
29
|
+
const validatedOptions = validateOptions(options);
|
|
30
|
+
const Input = require('../../input').default;
|
|
31
|
+
const token = await Input.vtSuiteToken();
|
|
32
|
+
if (!token) {
|
|
33
|
+
output_1.default.exitError(texts_1.ERR_MISSING_VT_TOKEN);
|
|
34
|
+
}
|
|
35
|
+
const ctx = createVtContext();
|
|
36
|
+
applyToken(ctx, token);
|
|
37
|
+
if (!checkIfMinimalOptionsAreProvided(validatedOptions)) {
|
|
38
|
+
output_1.default.exitError(texts_1.ERR_MISSING_URLS);
|
|
39
|
+
}
|
|
40
|
+
let urls = [];
|
|
41
|
+
let sitemapSource;
|
|
42
|
+
if (validatedOptions.urls) {
|
|
43
|
+
const urlsList = getUrlsFromUrlOption(validatedOptions.urls);
|
|
44
|
+
urls = urls.concat(urlsList);
|
|
45
|
+
}
|
|
46
|
+
if (validatedOptions.urlsFile) {
|
|
47
|
+
const urlsList = getUrlsFromUrlFile(validatedOptions.urlsFile);
|
|
48
|
+
urls = urls.concat(urlsList);
|
|
49
|
+
}
|
|
50
|
+
if (validatedOptions.sitemap) {
|
|
51
|
+
sitemapSource = addProtocolIfMissing(validatedOptions.sitemap);
|
|
52
|
+
}
|
|
53
|
+
const { filteredUrls, duplicates } = filterDuplicates(urls);
|
|
54
|
+
if (duplicates.length > 0) {
|
|
55
|
+
output_1.default.normal(`Detected ${duplicates.length} duplicated urls:`);
|
|
56
|
+
output_1.default.normal(duplicates.join('\n'));
|
|
57
|
+
}
|
|
58
|
+
if (validatedOptions.dryRun) {
|
|
59
|
+
output_1.default.exitSuccess(`List of urls:\n${filteredUrls.join('\n')}`);
|
|
60
|
+
}
|
|
61
|
+
else if (filteredUrls.length > 1) {
|
|
62
|
+
output_1.default.normal(`List of urls:\n${filteredUrls.join('\n')}`);
|
|
63
|
+
}
|
|
64
|
+
const ciAndGitInfo = await getCiAndGitInfo({});
|
|
65
|
+
output_1.default.normal(formattedCiInfo(ciAndGitInfo));
|
|
66
|
+
applyCiAndCommitInfo(ctx, ciAndGitInfo);
|
|
67
|
+
try {
|
|
68
|
+
const { message } = await sendCompareLinks(ctx, filteredUrls, validatedOptions, sitemapSource);
|
|
69
|
+
output_1.default.exitSuccess(message);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
output_1.default.exitError(`${error}`);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
function getUrlsFromUrlOption(urls) {
|
|
76
|
+
const { addProtocolIfMissing } = require('../../visualTest/linkUtils');
|
|
77
|
+
return urls.split(',').map((url) => addProtocolIfMissing(url).trim());
|
|
78
|
+
}
|
|
79
|
+
function getUrlsFromUrlFile(urlsFile) {
|
|
80
|
+
const { addProtocolIfMissing } = require('../../visualTest/linkUtils');
|
|
81
|
+
const urlsFromFile = (0, node_fs_1.readFileSync)(urlsFile, 'utf-8');
|
|
82
|
+
return urlsFromFile
|
|
83
|
+
.split('\n')
|
|
84
|
+
.filter((url) => url.trim().length > 0)
|
|
85
|
+
.map((url) => addProtocolIfMissing(url).trim());
|
|
86
|
+
}
|
|
87
|
+
function filterDuplicates(urls) {
|
|
88
|
+
const seen = new Set();
|
|
89
|
+
const duplicates = new Set();
|
|
90
|
+
for (const url of urls) {
|
|
91
|
+
if (seen.has(url)) {
|
|
92
|
+
duplicates.add(url);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
seen.add(url);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
filteredUrls: Array.from(seen),
|
|
100
|
+
duplicates: Array.from(duplicates),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
exports.default = commandCapture;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../../../utils");
|
|
7
|
+
const texts_1 = require("../../../texts");
|
|
8
|
+
const output_1 = __importDefault(require("../../../output"));
|
|
9
|
+
const commandUtLink = (0, utils_1.newCommand)('link', texts_1.DESC_COMMAND_UT_LINK);
|
|
10
|
+
commandUtLink.option('-w, --workspace <workspace>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
11
|
+
commandUtLink.option('-p, --project <project>', texts_1.OPTION_REST_API_PROJECT);
|
|
12
|
+
commandUtLink.option('-s, --suite <suite>', texts_1.OPTION_SUITE_IDENTIFIER);
|
|
13
|
+
commandUtLink.action(async (options) => {
|
|
14
|
+
const Input = require('../../../input').default;
|
|
15
|
+
const ProjectCfg = require('../../../project/cfg').default;
|
|
16
|
+
output_1.default.handleSignals();
|
|
17
|
+
const workspace = Input.restApiWorkspace(options.workspace);
|
|
18
|
+
const project = Input.restApiProject(options.project);
|
|
19
|
+
const client = Input.restApiTokenClient(false, options.api, options.region);
|
|
20
|
+
let suiteIdentifier = options.suite;
|
|
21
|
+
if (!suiteIdentifier) {
|
|
22
|
+
const opt = await output_1.default.inputMenuAdv(texts_1.TXT_COMMAND_SUITE_SELECT, [
|
|
23
|
+
{
|
|
24
|
+
name: texts_1.TXT_COMMAND_SUITE_CREATE_NEW,
|
|
25
|
+
description: texts_1.TXT_COMMAND_SUITE_CREATE_NEW_UT_DESC,
|
|
26
|
+
value: 'new',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: texts_1.TXT_COMMAND_SUITE_LINK_EXISTING,
|
|
30
|
+
description: texts_1.TXT_COMMAND_SUITE_LINK_EXISTING_DESC,
|
|
31
|
+
value: 'existing',
|
|
32
|
+
},
|
|
33
|
+
]);
|
|
34
|
+
if (opt === 'new') {
|
|
35
|
+
const name = await output_1.default.inputString(texts_1.TXT_COMMAND_SUITE_NAME);
|
|
36
|
+
const response = await client.createUtSuite(workspace, project, { name, identifier: name });
|
|
37
|
+
output_1.default.okSign();
|
|
38
|
+
output_1.default.normal(texts_1.TXT_COMMAND_SUITE_CREATED);
|
|
39
|
+
suiteIdentifier = response.identifier;
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const result = await client.getUtSuites(workspace, project);
|
|
43
|
+
const suites = result?.suites || [];
|
|
44
|
+
if (!suites.length) {
|
|
45
|
+
output_1.default.exitError(texts_1.ERR_NO_UT_SUITES);
|
|
46
|
+
}
|
|
47
|
+
if (suites.length === 1) {
|
|
48
|
+
suiteIdentifier = suites[0].identifier;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const items = suites.map((s) => s.name || s.identifier);
|
|
52
|
+
const index = await output_1.default.inputMenu(texts_1.TXT_COMMAND_UT_LINK_SELECT, items);
|
|
53
|
+
suiteIdentifier = suites[index].identifier;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
ProjectCfg.setSuite((0, utils_1.getWorkingDir)(), 'ut', suiteIdentifier);
|
|
58
|
+
output_1.default.okSign();
|
|
59
|
+
output_1.default.exitSuccess(texts_1.TXT_COMMAND_UT_LINK_SUCCESS);
|
|
60
|
+
});
|
|
61
|
+
exports.default = commandUtLink;
|