bdy 1.23.13-dev-target-commands → 1.23.13-dev
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/README.md +181 -0
- package/distTs/package.json +3 -5
- package/distTs/src/agent/manager.js +9 -2
- package/distTs/src/api/client.js +12 -222
- package/distTs/src/cliIndex.js +0 -4
- package/distTs/src/command/artifact/list.js +6 -2
- package/distTs/src/command/distro/list.js +0 -1
- package/distTs/src/command/distro/route/update.js +1 -1
- package/distTs/src/command/distro/update.js +9 -9
- package/distTs/src/command/pre.js +9 -8
- package/distTs/src/command/project/get.js +18 -0
- package/distTs/src/command/project/set.js +31 -0
- package/distTs/src/command/sandbox/get/yaml.js +30 -0
- package/distTs/src/command/version.js +1 -1
- package/distTs/src/command/vt/scrape.js +193 -0
- package/distTs/src/input.js +0 -65
- package/distTs/src/logger.js +7 -1
- package/distTs/src/output.js +2 -21
- package/distTs/src/texts.js +27 -252
- package/distTs/src/tunnel/server/sftp.js +24 -5
- package/distTs/src/tunnel/ssh/client.js +35 -4
- package/distTs/src/utils.js +50 -31
- package/package.json +3 -5
- package/distTs/detect-rules.json +0 -351
- package/distTs/src/command/environment/create.js +0 -70
- package/distTs/src/command/environment/delete.js +0 -29
- package/distTs/src/command/environment/get.js +0 -48
- package/distTs/src/command/environment/list.js +0 -45
- package/distTs/src/command/environment/resolve.js +0 -22
- package/distTs/src/command/environment/update.js +0 -59
- package/distTs/src/command/environment.js +0 -20
- package/distTs/src/command/pipeline/run/apply.js +0 -62
- package/distTs/src/command/target/create.js +0 -33
- package/distTs/src/command/target/delete.js +0 -30
- package/distTs/src/command/target/exec/command.js +0 -103
- package/distTs/src/command/target/exec/kill.js +0 -31
- package/distTs/src/command/target/exec/list.js +0 -53
- package/distTs/src/command/target/exec/logs.js +0 -27
- package/distTs/src/command/target/exec/status.js +0 -44
- package/distTs/src/command/target/exec.js +0 -24
- package/distTs/src/command/target/get.js +0 -63
- package/distTs/src/command/target/list.js +0 -49
- package/distTs/src/command/target/scope.js +0 -108
- package/distTs/src/command/target/update.js +0 -31
- package/distTs/src/command/target.js +0 -22
- package/distTs/src/command/yaml/actions/detect.js +0 -268
- package/distTs/src/command/yaml/actions/info.js +0 -56
- package/distTs/src/command/yaml/actions/list.js +0 -70
- package/distTs/src/command/yaml/actions/schema.js +0 -104
- package/distTs/src/command/yaml/actions.js +0 -13
- package/distTs/src/command/yaml/agents.js +0 -88
- package/distTs/src/command/yaml/cache.js +0 -98
- package/distTs/src/command/yaml/init.js +0 -110
- package/distTs/src/command/yaml/pipeline.js +0 -42
- package/distTs/src/command/yaml/render.js +0 -83
- package/distTs/src/command/yaml/schemaUtils.js +0 -139
- package/distTs/src/command/yaml/validate.js +0 -259
- package/distTs/src/command/yaml.js +0 -18
- package/distTs/src/diskCache.js +0 -82
|
@@ -0,0 +1,31 @@
|
|
|
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 cfg_1 = __importDefault(require("../../tunnel/cfg"));
|
|
7
|
+
const output_1 = __importDefault(require("../../output"));
|
|
8
|
+
const texts_1 = require("../../texts");
|
|
9
|
+
const utils_1 = require("../../utils");
|
|
10
|
+
const input_1 = __importDefault(require("../../input"));
|
|
11
|
+
const commandProjectSet = (0, utils_1.newCommand)('set', texts_1.DESC_COMMAND_PROJECT_SET);
|
|
12
|
+
commandProjectSet.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
13
|
+
commandProjectSet.argument('[project]', texts_1.ARG_COMMAND_PROJECT_NAME);
|
|
14
|
+
commandProjectSet.action(async (project, options) => {
|
|
15
|
+
output_1.default.handleSignals();
|
|
16
|
+
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
17
|
+
const client = input_1.default.restApiTokenClient();
|
|
18
|
+
if (project) {
|
|
19
|
+
await client.getProject(workspace, project);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const response = await client.getProjects(workspace);
|
|
23
|
+
project = await output_1.default.selectProject(response.projects);
|
|
24
|
+
}
|
|
25
|
+
cfg_1.default.setProject(project);
|
|
26
|
+
if (!project)
|
|
27
|
+
output_1.default.exitSuccess(texts_1.TXT_PROJECT_SET_CLEARED);
|
|
28
|
+
else
|
|
29
|
+
output_1.default.exitSuccess((0, texts_1.TXT_PROJECT_SET_SUCCESS)(project));
|
|
30
|
+
});
|
|
31
|
+
exports.default = commandProjectSet;
|
|
@@ -0,0 +1,30 @@
|
|
|
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 commandSandboxGetYaml = (0, utils_1.newCommand)('yaml', texts_1.DESC_COMMAND_SANDBOX_GET_YAML);
|
|
11
|
+
commandSandboxGetYaml.hideVersionUpdate = true;
|
|
12
|
+
commandSandboxGetYaml.alias('yml');
|
|
13
|
+
commandSandboxGetYaml.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
14
|
+
commandSandboxGetYaml.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
|
|
15
|
+
commandSandboxGetYaml.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
|
|
16
|
+
commandSandboxGetYaml.action(async (identifier, options) => {
|
|
17
|
+
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
18
|
+
const project = input_1.default.restApiProject(options.project);
|
|
19
|
+
const client = input_1.default.restApiTokenClient();
|
|
20
|
+
let result = await client.listSandboxes(workspace, project);
|
|
21
|
+
const sandboxes = result.sandboxes || [];
|
|
22
|
+
const found = sandboxes.find((s) => s.identifier === identifier);
|
|
23
|
+
if (!found) {
|
|
24
|
+
output_1.default.exitError(texts_1.ERR_SANDBOX_NOT_FOUND);
|
|
25
|
+
}
|
|
26
|
+
const sandboxId = found.id;
|
|
27
|
+
result = await client.getSandboxYaml(workspace, sandboxId);
|
|
28
|
+
output_1.default.exitNormal(Buffer.from(result.yaml, 'base64').toString('utf8'));
|
|
29
|
+
});
|
|
30
|
+
exports.default = commandSandboxGetYaml;
|
|
@@ -78,7 +78,7 @@ commandVersion.action(async () => {
|
|
|
78
78
|
const currVersion = commandVersion.currentVersion || '';
|
|
79
79
|
const lastVersion = commandVersion.latestVersion || '';
|
|
80
80
|
const env = commandVersion.env || '';
|
|
81
|
-
if (
|
|
81
|
+
if ((0, utils_1.isVersionNewer)(lastVersion, currVersion)) {
|
|
82
82
|
const platform = (0, utils_1.getPlatform)();
|
|
83
83
|
const isMac = platform === 'darwin';
|
|
84
84
|
const isWin = platform === 'win32';
|
|
@@ -0,0 +1,193 @@
|
|
|
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 commander_1 = require("commander");
|
|
8
|
+
const texts_1 = require("../../texts");
|
|
9
|
+
const validation_1 = require("../../visualTest/validation");
|
|
10
|
+
const output_1 = __importDefault(require("../../output"));
|
|
11
|
+
const requests_1 = require("../../visualTest/requests");
|
|
12
|
+
const zod_1 = require("zod");
|
|
13
|
+
const node_zlib_1 = require("node:zlib");
|
|
14
|
+
const tar_stream_1 = __importDefault(require("tar-stream"));
|
|
15
|
+
const promises_1 = require("node:stream/promises");
|
|
16
|
+
const node_fs_1 = require("node:fs");
|
|
17
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
18
|
+
const promises_2 = require("node:fs/promises");
|
|
19
|
+
const commandScrape = (0, utils_1.newCommand)('scrape', texts_1.DESC_COMMAND_VT_SCRAPE);
|
|
20
|
+
commandScrape.argument('<url>', texts_1.OPTION_SCRAPE_URL);
|
|
21
|
+
commandScrape.option('--follow', texts_1.OPTION_SCRAPE_FOLLOW, false);
|
|
22
|
+
commandScrape.addOption(new commander_1.Option('--outputType <type>', texts_1.OPTION_SCRAPE_OUTPUT_TYPE)
|
|
23
|
+
.choices(['jpeg', 'png', 'md', 'html'])
|
|
24
|
+
.makeOptionMandatory());
|
|
25
|
+
commandScrape.option('--quality <quality>', texts_1.OPTION_SCRAPE_QUALITY);
|
|
26
|
+
commandScrape.option('--fullPage', texts_1.OPTION_SCRAPE_FULL_PAGE, false);
|
|
27
|
+
commandScrape.option('--cssSelector <selector>', texts_1.OPTION_SCRAPE_CSS_SELECTOR);
|
|
28
|
+
commandScrape.option('--xpathSelector <selector>', texts_1.OPTION_SCRAPE_XPATH_SELECTOR);
|
|
29
|
+
commandScrape.addOption(new commander_1.Option('--browser <browser>', texts_1.OPTION_SCRAPE_BROWSER)
|
|
30
|
+
.choices(['chrome', 'firefox', 'safari'])
|
|
31
|
+
.default('chrome'));
|
|
32
|
+
commandScrape.option('--viewport <viewport>', texts_1.OPTION_SCRAPE_VIEWPORT, '1920x1080');
|
|
33
|
+
commandScrape.option('--devicePixelRatio <ratio>', texts_1.OPTION_SCRAPE_DEVICE_PIXEL_RATIO, '1');
|
|
34
|
+
commandScrape.option('--waitForElement <selector>', texts_1.OPTION_SCRAPE_WAIT_FOR_ELEMENT);
|
|
35
|
+
commandScrape.option('--darkMode', texts_1.OPTION_SCRAPE_DARK_MODE, false);
|
|
36
|
+
commandScrape.option('--delay <delay>', texts_1.OPTION_SCRAPE_DELAY, '0');
|
|
37
|
+
commandScrape.option('--outputDir <dir>', texts_1.OPTION_SCRAPE_OUTPUT_DIR, '.');
|
|
38
|
+
commandScrape.action(async (inputUrl, options) => {
|
|
39
|
+
if (!(0, validation_1.checkToken)()) {
|
|
40
|
+
output_1.default.exitError(texts_1.ERR_MISSING_VT_TOKEN);
|
|
41
|
+
}
|
|
42
|
+
const { url, follow, outputType, quality, outputDir, fullPage, cssSelector, xpathSelector, browser, viewport, devicePixelRatio, darkMode, delay, waitForElement, } = validateInputAndOptions(inputUrl, options);
|
|
43
|
+
try {
|
|
44
|
+
const { buildId } = await (0, requests_1.sendScrap)(url, outputType, follow, quality, fullPage, cssSelector, xpathSelector, browser, viewport, devicePixelRatio, darkMode, delay, waitForElement);
|
|
45
|
+
output_1.default.normal('Starting scrape session');
|
|
46
|
+
const status = await watchSessionStatus(buildId);
|
|
47
|
+
if (!status.ok) {
|
|
48
|
+
output_1.default.exitError(`Unexpected error while watching session status: ${status.error}`);
|
|
49
|
+
}
|
|
50
|
+
output_1.default.normal('Downloading scrape package');
|
|
51
|
+
const scrapPackageStream = await (0, requests_1.downloadScrapPackage)(buildId);
|
|
52
|
+
const brotliDecompressor = (0, node_zlib_1.createBrotliDecompress)();
|
|
53
|
+
const unpack = tar_stream_1.default.extract();
|
|
54
|
+
unpack.on('entry', async (header, stream, next) => {
|
|
55
|
+
const currentDir = process.cwd();
|
|
56
|
+
const preparedOutputDir = outputDir.startsWith('.')
|
|
57
|
+
? node_path_1.default.join(currentDir, outputDir)
|
|
58
|
+
: outputDir;
|
|
59
|
+
const newFilePath = node_path_1.default.join(preparedOutputDir, header.name);
|
|
60
|
+
try {
|
|
61
|
+
if (header.type === 'file') {
|
|
62
|
+
await (0, promises_2.mkdir)(node_path_1.default.dirname(newFilePath), { recursive: true });
|
|
63
|
+
const fileWriteStream = (0, node_fs_1.createWriteStream)(newFilePath);
|
|
64
|
+
await (0, promises_1.pipeline)(stream, fileWriteStream);
|
|
65
|
+
next();
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
stream.resume();
|
|
69
|
+
next();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch (entryError) {
|
|
73
|
+
output_1.default.error(`Error processing entry ${header.name}: ${entryError}`);
|
|
74
|
+
next(entryError);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
await (0, promises_1.pipeline)(scrapPackageStream, brotliDecompressor, unpack);
|
|
78
|
+
output_1.default.exitSuccess('Downloading scrape package finished');
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
output_1.default.exitError(`${error}`);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
function validateInputAndOptions(input, options) {
|
|
85
|
+
const urlSchema = zod_1.z.string().url();
|
|
86
|
+
const optionsSchema = zod_1.z.object({
|
|
87
|
+
follow: zod_1.z.boolean(),
|
|
88
|
+
outputType: zod_1.z.enum(['jpeg', 'png', 'md', 'html']),
|
|
89
|
+
quality: zod_1.z.coerce.number().min(1).max(100).optional(),
|
|
90
|
+
outputDir: zod_1.z.string().default('.'),
|
|
91
|
+
fullPage: zod_1.z.boolean().optional(),
|
|
92
|
+
cssSelector: zod_1.z.string().optional(),
|
|
93
|
+
xpathSelector: zod_1.z.string().optional(),
|
|
94
|
+
browser: zod_1.z.enum(['chrome', 'firefox', 'safari']),
|
|
95
|
+
viewport: zod_1.z
|
|
96
|
+
.string()
|
|
97
|
+
.refine((value) => {
|
|
98
|
+
const [width, height] = value.split('x');
|
|
99
|
+
return (width &&
|
|
100
|
+
height &&
|
|
101
|
+
!isNaN(Number(width)) &&
|
|
102
|
+
!isNaN(Number(height)) &&
|
|
103
|
+
Number(width) > 0 &&
|
|
104
|
+
Number(height) > 0);
|
|
105
|
+
}, 'Invalid viewport format, example: 1920x1080')
|
|
106
|
+
.transform((value) => {
|
|
107
|
+
const [width, height] = value.split('x');
|
|
108
|
+
return {
|
|
109
|
+
width: Number(width),
|
|
110
|
+
height: Number(height),
|
|
111
|
+
};
|
|
112
|
+
}),
|
|
113
|
+
devicePixelRatio: zod_1.z.coerce.number().min(1).max(4),
|
|
114
|
+
darkMode: zod_1.z.boolean(),
|
|
115
|
+
delay: zod_1.z.coerce.number().min(0).max(10000),
|
|
116
|
+
waitForElement: zod_1.z.string().optional(),
|
|
117
|
+
});
|
|
118
|
+
try {
|
|
119
|
+
const url = urlSchema.parse(input);
|
|
120
|
+
const { follow, outputType, quality, outputDir, fullPage, cssSelector, xpathSelector, browser, viewport, devicePixelRatio, darkMode, delay, waitForElement, } = optionsSchema.parse(options);
|
|
121
|
+
if (typeof quality === 'number' && outputType !== 'jpeg') {
|
|
122
|
+
output_1.default.exitError('Quality is only supported for jpeg output type, use --outputType jpeg');
|
|
123
|
+
}
|
|
124
|
+
if (cssSelector && xpathSelector) {
|
|
125
|
+
output_1.default.exitError('Only one of --cssSelector or --xpathSelector can be used');
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
url,
|
|
129
|
+
follow,
|
|
130
|
+
outputType,
|
|
131
|
+
quality,
|
|
132
|
+
outputDir,
|
|
133
|
+
fullPage,
|
|
134
|
+
cssSelector,
|
|
135
|
+
xpathSelector,
|
|
136
|
+
browser,
|
|
137
|
+
viewport,
|
|
138
|
+
devicePixelRatio,
|
|
139
|
+
darkMode,
|
|
140
|
+
delay,
|
|
141
|
+
waitForElement,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (error instanceof zod_1.ZodError) {
|
|
146
|
+
output_1.default.exitError(error.errors.map((e) => `${e.path}: ${e.message}`).join(', '));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
async function watchSessionStatus(buildId) {
|
|
154
|
+
return new Promise((resolve) => {
|
|
155
|
+
const eventSource = (0, requests_1.connectToScrapSession)(buildId);
|
|
156
|
+
eventSource.addEventListener('SESSION_STATUS', (event) => {
|
|
157
|
+
const data = JSON.parse(event.data);
|
|
158
|
+
if (data.status === 'GATHER_URLS_COMPLETED') {
|
|
159
|
+
output_1.default.normal(`Gathering URLs completed, found ${data.text} URLs`);
|
|
160
|
+
}
|
|
161
|
+
else if (data.status === 'GATHER_URLS_FAILED') {
|
|
162
|
+
output_1.default.error('Gathering URLs failed');
|
|
163
|
+
}
|
|
164
|
+
else if (data.status === 'SCRAPE_URL_COMPLETED') {
|
|
165
|
+
output_1.default.normal(`Scraping ${data.text} completed`);
|
|
166
|
+
}
|
|
167
|
+
else if (data.status === 'SCRAPE_URL_FAILED') {
|
|
168
|
+
output_1.default.error(`Scraping ${data.text} failed`);
|
|
169
|
+
}
|
|
170
|
+
else if (data.status === 'CREATE_PACKAGE_COMPLETED') {
|
|
171
|
+
output_1.default.normal('Package created');
|
|
172
|
+
}
|
|
173
|
+
else if (data.status === 'CREATE_PACKAGE_FAILED') {
|
|
174
|
+
output_1.default.error('Package creation failed');
|
|
175
|
+
}
|
|
176
|
+
else if (data.status === 'FINISHED') {
|
|
177
|
+
eventSource.close();
|
|
178
|
+
output_1.default.normal('Scrape session finished');
|
|
179
|
+
resolve({ ok: true });
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
eventSource.addEventListener('error', (event) => {
|
|
183
|
+
if (event.code) {
|
|
184
|
+
eventSource.close();
|
|
185
|
+
if (event.code === 410) {
|
|
186
|
+
output_1.default.normal('Scrape session finished');
|
|
187
|
+
}
|
|
188
|
+
resolve({ ok: event.code === 410, error: event.code });
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
exports.default = commandScrape;
|
package/distTs/src/input.js
CHANGED
|
@@ -368,19 +368,8 @@ class Input {
|
|
|
368
368
|
const ApiClient = require('./api/client').default;
|
|
369
369
|
const { token: t, refreshToken, clientId, clientToken, clientSecret, } = this.restApiToken(allowNoToken, token);
|
|
370
370
|
const baseUrl = this.restApiBaseUrl(api, region, t);
|
|
371
|
-
ApiClient.onRateLimitLow = (remaining, reset) => output_1.default.noteWarning((0, texts_1.WARN_REST_API_RATE_LIMIT_LOW)(remaining, reset));
|
|
372
371
|
return new ApiClient(baseUrl, t, refreshToken, clientId, clientSecret, clientToken);
|
|
373
372
|
}
|
|
374
|
-
// Stderr note for list commands whose PROJECT scope was inferred (linked
|
|
375
|
-
// project / BUDDY_PROJECT) rather than requested via -p or --scope, so the
|
|
376
|
-
// narrowing is never silent.
|
|
377
|
-
static projectScopeNote(options, project, scope, resource) {
|
|
378
|
-
if (options.format === 'json' || options.scope || options.project)
|
|
379
|
-
return;
|
|
380
|
-
if (scope !== 'PROJECT' || !project)
|
|
381
|
-
return;
|
|
382
|
-
output_1.default.note((0, texts_1.TXT_LIST_PROJECT_SCOPE_NOTE)(resource, project));
|
|
383
|
-
}
|
|
384
373
|
static routeType(type) {
|
|
385
374
|
if (!type)
|
|
386
375
|
return distro_1.ROUTE_TYPE.DIRECT_PROXY;
|
|
@@ -1098,54 +1087,6 @@ class Input {
|
|
|
1098
1087
|
return distro_1.SCOPE.PROJECT;
|
|
1099
1088
|
return distro_1.SCOPE.WORKSPACE;
|
|
1100
1089
|
}
|
|
1101
|
-
static targetScope(project, pipeline, environment, scope) {
|
|
1102
|
-
Input.targetLine(project, pipeline, environment);
|
|
1103
|
-
if (scope) {
|
|
1104
|
-
scope = scope.toUpperCase();
|
|
1105
|
-
if (scope === utils_1.TARGET_SCOPE.WORKSPACE) {
|
|
1106
|
-
return scope;
|
|
1107
|
-
}
|
|
1108
|
-
if (scope === utils_1.TARGET_SCOPE.PROJECT) {
|
|
1109
|
-
if (!project)
|
|
1110
|
-
output_1.default.exitError(texts_1.ERR_COMMAND_SCOPE_NO_PROJECT);
|
|
1111
|
-
return scope;
|
|
1112
|
-
}
|
|
1113
|
-
if (scope === utils_1.TARGET_SCOPE.PIPELINE) {
|
|
1114
|
-
if (!pipeline)
|
|
1115
|
-
output_1.default.exitError(texts_1.ERR_TARGET_SCOPE_NO_PIPELINE);
|
|
1116
|
-
return scope;
|
|
1117
|
-
}
|
|
1118
|
-
if (scope === utils_1.TARGET_SCOPE.ENVIRONMENT) {
|
|
1119
|
-
if (!environment)
|
|
1120
|
-
output_1.default.exitError(texts_1.ERR_TARGET_SCOPE_NO_ENVIRONMENT);
|
|
1121
|
-
return scope;
|
|
1122
|
-
}
|
|
1123
|
-
return output_1.default.exitError(texts_1.ERR_TARGET_SCOPE);
|
|
1124
|
-
}
|
|
1125
|
-
if (pipeline)
|
|
1126
|
-
return utils_1.TARGET_SCOPE.PIPELINE;
|
|
1127
|
-
if (environment)
|
|
1128
|
-
return utils_1.TARGET_SCOPE.ENVIRONMENT;
|
|
1129
|
-
if (project)
|
|
1130
|
-
return utils_1.TARGET_SCOPE.PROJECT;
|
|
1131
|
-
return utils_1.TARGET_SCOPE.WORKSPACE;
|
|
1132
|
-
}
|
|
1133
|
-
// Line context for resolving a target identifier via /identifiers:
|
|
1134
|
-
// params describe one line from workspace down (ws -> project -> pipeline
|
|
1135
|
-
// or environment), searched from the deepest scope up.
|
|
1136
|
-
static targetLine(project, pipeline, environment) {
|
|
1137
|
-
if (pipeline && !project) {
|
|
1138
|
-
output_1.default.exitError(texts_1.ERR_TARGET_PIPELINE_REQUIRES_PROJECT);
|
|
1139
|
-
}
|
|
1140
|
-
if (pipeline && environment) {
|
|
1141
|
-
output_1.default.exitError(texts_1.ERR_TARGET_PIPELINE_ENV_CONFLICT);
|
|
1142
|
-
}
|
|
1143
|
-
return {
|
|
1144
|
-
project: project || undefined,
|
|
1145
|
-
pipeline,
|
|
1146
|
-
environment,
|
|
1147
|
-
};
|
|
1148
|
-
}
|
|
1149
1090
|
static restApiProject(project, allowNull) {
|
|
1150
1091
|
const ProjectCfg = require('./project/cfg').default;
|
|
1151
1092
|
let p = process.env.BUDDY_PROJECT;
|
|
@@ -1166,12 +1107,6 @@ class Input {
|
|
|
1166
1107
|
output_1.default.exitError(texts_1.ERR_SANDBOX_BOOT_SCRIPT_NOT_EXISTS);
|
|
1167
1108
|
return node_fs_1.default.readFileSync(p, 'utf8');
|
|
1168
1109
|
}
|
|
1169
|
-
static tags(tags) {
|
|
1170
|
-
return tags
|
|
1171
|
-
.split(',')
|
|
1172
|
-
.map((t) => t.trim())
|
|
1173
|
-
.filter(Boolean);
|
|
1174
|
-
}
|
|
1175
1110
|
static restApiYaml(yaml) {
|
|
1176
1111
|
if (!yaml)
|
|
1177
1112
|
output_1.default.exitError(texts_1.ERR_REST_API_YAML);
|
package/distTs/src/logger.js
CHANGED
|
@@ -64,7 +64,13 @@ class Logger {
|
|
|
64
64
|
this.logPath = (0, path_1.resolve)(this.rootPath, 'cli.log');
|
|
65
65
|
this.log1Path = (0, path_1.resolve)(this.rootPath, 'cli.1.log');
|
|
66
66
|
try {
|
|
67
|
-
|
|
67
|
+
// 'a', not 'w': every start used to truncate the log, so an agent that died and was
|
|
68
|
+
// restarted by its service manager came back having erased the only record of why -
|
|
69
|
+
// and a crash loop leaves nothing at all. Append also survives an external truncation
|
|
70
|
+
// (rotation, someone clearing the file) without the zero-padding a tracked write offset
|
|
71
|
+
// produces, because O_APPEND puts every write at the current end of the file.
|
|
72
|
+
// checkLogSize() below still bounds it at 5 MB.
|
|
73
|
+
this.logStream = fs_1.default.openSync(this.logPath, 'a');
|
|
68
74
|
}
|
|
69
75
|
catch {
|
|
70
76
|
// A log we cannot open is not a reason to fail the command - a read-only home, a full
|
package/distTs/src/output.js
CHANGED
|
@@ -134,23 +134,6 @@ class Output {
|
|
|
134
134
|
msg += '\n';
|
|
135
135
|
getTerminal()(msg);
|
|
136
136
|
}
|
|
137
|
-
// Payload output (command results, logs, JSON): bypasses terminal-kit,
|
|
138
|
-
// whose printf-style formatting and ^-markup corrupt data containing
|
|
139
|
-
// % or ^ sequences.
|
|
140
|
-
static data(txt) {
|
|
141
|
-
process.stdout.write(`${txt}\n`);
|
|
142
|
-
}
|
|
143
|
-
static writeStderr(txt) {
|
|
144
|
-
process.stderr.write(`${txt}\n`);
|
|
145
|
-
}
|
|
146
|
-
// Narration accompanying payload output goes to stderr so stdout stays
|
|
147
|
-
// parseable by scripts.
|
|
148
|
-
static note(txt) {
|
|
149
|
-
this.writeStderr(this.getMutedColor(txt));
|
|
150
|
-
}
|
|
151
|
-
static noteWarning(txt) {
|
|
152
|
-
this.writeStderr(this.getYellowColor(txt));
|
|
153
|
-
}
|
|
154
137
|
static gray(txt, newLine = true) {
|
|
155
138
|
this.normal(this.getMutedColor(txt), newLine);
|
|
156
139
|
}
|
|
@@ -641,7 +624,7 @@ class Output {
|
|
|
641
624
|
_terminal.grabInput(false);
|
|
642
625
|
}
|
|
643
626
|
static json(json) {
|
|
644
|
-
this.
|
|
627
|
+
this.normal(JSON.stringify(json));
|
|
645
628
|
}
|
|
646
629
|
static exitError(err) {
|
|
647
630
|
this.clearUndici();
|
|
@@ -659,9 +642,7 @@ class Output {
|
|
|
659
642
|
if (isDebug)
|
|
660
643
|
msg += `\n${e.stack}`;
|
|
661
644
|
}
|
|
662
|
-
|
|
663
|
-
// terminal-kit's %-formatting would corrupt.
|
|
664
|
-
this.writeStderr(this.getRedColor(String(msg)));
|
|
645
|
+
getTerminal().red.error(`${msg}\n`);
|
|
665
646
|
process.exit(1);
|
|
666
647
|
}
|
|
667
648
|
}
|