bdy 1.25.1-master → 1.25.2-beta

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 (53) hide show
  1. package/distTs/package.json +2 -6
  2. package/distTs/src/command/api/info.js +224 -255
  3. package/distTs/src/command/api/list.js +14 -17
  4. package/distTs/src/command/yaml/actions/detect.js +11 -2
  5. package/distTs/src/command/yaml/actions/info.js +22 -12
  6. package/distTs/src/command/yaml/actions/list.js +11 -20
  7. package/distTs/src/command/yaml/actions/schema.js +43 -87
  8. package/distTs/src/command/yaml/pipeline.js +9 -25
  9. package/distTs/src/command/yaml/render.js +83 -71
  10. package/distTs/src/command/yaml/schemaUtils.js +12 -50
  11. package/distTs/src/command/yaml/validate.js +32 -27
  12. package/distTs/src/diskCache.js +0 -1
  13. package/distTs/src/openapi.js +16 -68
  14. package/distTs/src/texts.js +7 -9
  15. package/package.json +2 -6
  16. package/distTs/README.md +0 -181
  17. package/distTs/src/autocomplete.js +0 -90
  18. package/distTs/src/command/autocomplete/install.js +0 -16
  19. package/distTs/src/command/autocomplete/uninstall.js +0 -16
  20. package/distTs/src/command/autocomplete.js +0 -14
  21. package/distTs/src/command/environment/resolve.js +0 -47
  22. package/distTs/src/command/package/create.js +0 -64
  23. package/distTs/src/command/package/delete.js +0 -38
  24. package/distTs/src/command/package/docker/login.js +0 -26
  25. package/distTs/src/command/package/docker.js +0 -11
  26. package/distTs/src/command/package/download.js +0 -138
  27. package/distTs/src/command/package/get.js +0 -36
  28. package/distTs/src/command/package/list.js +0 -31
  29. package/distTs/src/command/package/publish.js +0 -241
  30. package/distTs/src/command/package/version/delete.js +0 -39
  31. package/distTs/src/command/package/version/get.js +0 -45
  32. package/distTs/src/command/package/version/list.js +0 -47
  33. package/distTs/src/command/package/version.js +0 -16
  34. package/distTs/src/command/package.js +0 -26
  35. package/distTs/src/command/project/get.js +0 -18
  36. package/distTs/src/command/project/set.js +0 -31
  37. package/distTs/src/command/sandbox/get/yaml.js +0 -30
  38. package/distTs/src/command/scrape/validation.js +0 -154
  39. package/distTs/src/command/scrape.js +0 -144
  40. package/distTs/src/command/ut/upload.js +0 -86
  41. package/distTs/src/command/ut.js +0 -12
  42. package/distTs/src/command/vt/close.js +0 -27
  43. package/distTs/src/command/vt/compare/validation.js +0 -46
  44. package/distTs/src/command/vt/compare.js +0 -100
  45. package/distTs/src/command/vt/exec.js +0 -82
  46. package/distTs/src/command/vt/installBrowser.js +0 -20
  47. package/distTs/src/command/vt/scrape.js +0 -193
  48. package/distTs/src/command/vt/shared/validation.js +0 -145
  49. package/distTs/src/command/vt/storybook.js +0 -138
  50. package/distTs/src/command/vt.js +0 -20
  51. package/distTs/src/main.js +0 -190
  52. package/distTs/src/types/options.js +0 -2
  53. package/distTs/src/types/scrape.js +0 -2
@@ -1,39 +0,0 @@
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 commandPackageVersionDelete = (0, utils_1.newCommand)('delete', texts_1.DESC_COMMAND_PACKAGE_VERSION_DELETE);
11
- commandPackageVersionDelete.alias('rm');
12
- commandPackageVersionDelete.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
- commandPackageVersionDelete.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
- commandPackageVersionDelete.argument('<identifier>', texts_1.OPT_COMMAND_PACKAGE_IDENTIFIER);
15
- commandPackageVersionDelete.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
16
- commandPackageVersionDelete.argument('<version>', texts_1.OPT_COMMAND_PACKAGE_VERSION);
17
- commandPackageVersionDelete.addHelpText('after', texts_1.EXAMPLE_PACKAGE_VERSION_DELETE);
18
- commandPackageVersionDelete.action(async (identifier, version, options) => {
19
- const workspace = input_1.default.restApiWorkspace(options.workspace);
20
- const project = input_1.default.restApiProject(options.project, true);
21
- const client = input_1.default.restApiTokenClient();
22
- const data = await client.getPackageVersionByIdentifier(workspace, project, identifier, version);
23
- if (!data || !data.domain) {
24
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
25
- }
26
- if (!data || !data.pkg_id) {
27
- output_1.default.exitError(texts_1.ERR_PACKAGE_NOT_FOUND);
28
- }
29
- if (!data || !data.pkg_version_id) {
30
- output_1.default.exitError(texts_1.ERR_PACKAGE_VERSION_NOT_FOUND);
31
- }
32
- const confirmed = options.force ||
33
- (await output_1.default.confirm((0, texts_1.TXT_PACKAGE_VERSION_DELETE_CONFIRM)(identifier, version)));
34
- if (!confirmed)
35
- output_1.default.exitNormal();
36
- await client.deletePackageVersion(workspace, data.pkg_id, data.pkg_version_id);
37
- output_1.default.exitSuccess(texts_1.TXT_PACKAGE_VERSION_DELETED);
38
- });
39
- exports.default = commandPackageVersionDelete;
@@ -1,45 +0,0 @@
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 commandPackageVersionGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_PACKAGE_VERSION_GET);
11
- commandPackageVersionGet.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
12
- commandPackageVersionGet.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
13
- commandPackageVersionGet.argument('<identifier>', texts_1.OPT_COMMAND_PACKAGE_IDENTIFIER);
14
- commandPackageVersionGet.argument('<version>', texts_1.OPT_COMMAND_PACKAGE_VERSION);
15
- commandPackageVersionGet.addHelpText('after', texts_1.EXAMPLE_PACKAGE_VERSION_GET);
16
- commandPackageVersionGet.action(async (identifier, version, options) => {
17
- const workspace = input_1.default.restApiWorkspace(options.workspace);
18
- const project = input_1.default.restApiProject(options.project, true);
19
- const client = input_1.default.restApiTokenClient();
20
- const data = await client.getPackageVersionByIdentifier(workspace, project, identifier, version);
21
- if (!data || !data.domain) {
22
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
23
- }
24
- if (!data || !data.pkg_id) {
25
- output_1.default.exitError(texts_1.ERR_PACKAGE_NOT_FOUND);
26
- }
27
- if (!data || !data.pkg_version_id) {
28
- output_1.default.exitError(texts_1.ERR_PACKAGE_VERSION_NOT_FOUND);
29
- }
30
- const result = await client.getPackageVersion(workspace, data.pkg_id, data.pkg_version_id);
31
- const obj = {
32
- Version: result.version,
33
- Size: (0, utils_1.formatBytes)(result.size),
34
- Created: result.created_date,
35
- 'App url': result.html_url,
36
- Url: result.version_url,
37
- };
38
- output_1.default.object(obj);
39
- output_1.default.normal('');
40
- const type = result.version_url.startsWith('https://')
41
- ? utils_1.PACKAGE_TYPE.FILE
42
- : utils_1.PACKAGE_TYPE.CONTAINER;
43
- output_1.default.exitNormal((0, texts_1.TXT_PACKAGE_VERSION_DOWNLOAD)(type, identifier, version, result.version_url));
44
- });
45
- exports.default = commandPackageVersionGet;
@@ -1,47 +0,0 @@
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 commandPackageVersionList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_PACKAGE_VERSION_LIST);
11
- commandPackageVersionList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
12
- commandPackageVersionList.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
13
- commandPackageVersionList.option('--page <number>', texts_1.OPTION_REST_API_PAGE, '1');
14
- commandPackageVersionList.option('--per-page <number>', texts_1.OPTION_REST_API_PER_PAGE, '10');
15
- commandPackageVersionList.alias('ls');
16
- commandPackageVersionList.argument('<identifier>', texts_1.OPT_COMMAND_PACKAGE_IDENTIFIER);
17
- commandPackageVersionList.addHelpText('after', texts_1.EXAMPLE_PACKAGE_VERSION_LIST);
18
- commandPackageVersionList.action(async (identifier, options) => {
19
- const page = input_1.default.restApiPage(options.page);
20
- const perPage = input_1.default.restApiPerPage(options.perPage);
21
- const workspace = input_1.default.restApiWorkspace(options.workspace);
22
- const project = input_1.default.restApiProject(options.project, true);
23
- const client = input_1.default.restApiTokenClient();
24
- const data = await client.getPackageVersionByIdentifier(workspace, project, identifier);
25
- if (!data || !data.domain) {
26
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
27
- }
28
- if (!data || !data.pkg_id) {
29
- output_1.default.exitError(texts_1.ERR_PACKAGE_NOT_FOUND);
30
- }
31
- const result = await client.getPackageVersions(workspace, data.pkg_id, page, perPage);
32
- const table = [['VERSION', 'SIZE', 'CREATED', 'URL']];
33
- if (!result.versions.length) {
34
- output_1.default.exitError(texts_1.ERR_PACKAGE_VERSIONS_NOT_FOUND);
35
- }
36
- result.versions.forEach((ver) => {
37
- table.push([
38
- ver.version,
39
- (0, utils_1.formatBytes)(ver.size),
40
- ver.created_date,
41
- ver.version_url,
42
- ]);
43
- });
44
- output_1.default.table(table);
45
- output_1.default.exitNormal();
46
- });
47
- exports.default = commandPackageVersionList;
@@ -1,16 +0,0 @@
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 list_1 = __importDefault(require("./version/list"));
8
- const texts_1 = require("../../texts");
9
- const get_1 = __importDefault(require("./version/get"));
10
- const delete_1 = __importDefault(require("./version/delete"));
11
- const commandPackageVersion = (0, utils_1.newCommand)('version', texts_1.DESC_COMMAND_PACKAGE_VERSION);
12
- commandPackageVersion.alias('ver');
13
- commandPackageVersion.addCommand(list_1.default);
14
- commandPackageVersion.addCommand(get_1.default);
15
- commandPackageVersion.addCommand(delete_1.default);
16
- exports.default = commandPackageVersion;
@@ -1,26 +0,0 @@
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 publish_1 = __importDefault(require("./package/publish"));
9
- const download_1 = __importDefault(require("./package/download"));
10
- const list_1 = __importDefault(require("./package/list"));
11
- const create_1 = __importDefault(require("./package/create"));
12
- const delete_1 = __importDefault(require("./package/delete"));
13
- const get_1 = __importDefault(require("./package/get"));
14
- const version_1 = __importDefault(require("./package/version"));
15
- const docker_1 = __importDefault(require("./package/docker"));
16
- const commandPackage = (0, utils_1.newCommand)('package', texts_1.DESC_COMMAND_PACKAGE);
17
- commandPackage.alias('pkg');
18
- commandPackage.addCommand(list_1.default);
19
- commandPackage.addCommand(create_1.default);
20
- commandPackage.addCommand(get_1.default);
21
- commandPackage.addCommand(delete_1.default);
22
- commandPackage.addCommand(publish_1.default);
23
- commandPackage.addCommand(download_1.default);
24
- commandPackage.addCommand(version_1.default);
25
- commandPackage.addCommand(docker_1.default);
26
- exports.default = commandPackage;
@@ -1,18 +0,0 @@
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 commandProjectGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_PROJECT_GET);
11
- commandProjectGet.action(async () => {
12
- const project = cfg_1.default.getProject();
13
- if (!project) {
14
- output_1.default.exitError(texts_1.TXT_PROJECT_NONE);
15
- }
16
- output_1.default.exitNormal(project);
17
- });
18
- exports.default = commandProjectGet;
@@ -1,31 +0,0 @@
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;
@@ -1,30 +0,0 @@
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;
@@ -1,154 +0,0 @@
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.validateInputAndOptions = validateInputAndOptions;
7
- const zod_1 = require("zod");
8
- const output_1 = __importDefault(require("../../output"));
9
- const validation_1 = require("../vt/shared/validation");
10
- const urlSchema = zod_1.z.string().url().optional();
11
- const browserSchema = zod_1.z.enum(['chrome', 'firefox', 'safari']);
12
- const browsersListSchema = zod_1.z
13
- .string()
14
- .transform((value) => value
15
- .split(',')
16
- .map((browser) => browser.trim().toLowerCase())
17
- .filter((browser) => browser.length > 0))
18
- .refine((browsers) => browsers.length > 0, {
19
- message: 'Invalid browsers list. Supported values: chrome,firefox,safari',
20
- })
21
- .pipe(zod_1.z.array(browserSchema))
22
- .transform((browsers) => Array.from(new Set(browsers.map((browser) => browser === 'chrome'
23
- ? 'CHROMIUM'
24
- : browser === 'firefox'
25
- ? 'FIREFOX'
26
- : 'WEBKIT'))));
27
- const optionsSchema = zod_1.z.object({
28
- follow: zod_1.z.boolean(),
29
- respectRobots: zod_1.z.boolean().optional(),
30
- outputType: zod_1.z.enum(['jpeg', 'png', 'md', 'html']).optional(),
31
- outputTypes: zod_1.z.string().optional(),
32
- quality: zod_1.z.coerce.number().min(1).max(100).optional(),
33
- outputDir: zod_1.z.string().default('.'),
34
- fullPage: zod_1.z.boolean().optional(),
35
- cssSelector: zod_1.z.string().optional(),
36
- xpathSelector: zod_1.z.string().optional(),
37
- colorScheme: zod_1.z.enum(['LIGHT', 'DARK', 'LIGHT_AND_DARK']).optional(),
38
- browsers: browsersListSchema.optional(),
39
- devices: zod_1.z.string().optional(),
40
- delay: validation_1.delaySchema,
41
- waitFor: validation_1.waitForSchema,
42
- cookie: validation_1.cookieSchema,
43
- header: validation_1.headerSchema,
44
- localStorage: zod_1.z
45
- .array(zod_1.z.string().regex(/^(?:([^:]+)::)?([^=]+)=(.*)$/, {
46
- message: "LocalStorage option must follow pattern '[scope::]key=value' (scope is optional)",
47
- }))
48
- .optional()
49
- .transform((value) => value?.map((v) => {
50
- const { scope, key, value } = (0, validation_1.parseScopedKeyValue)(v);
51
- return { scope, key, value };
52
- })),
53
- });
54
- function validateInputAndOptions(input, options) {
55
- try {
56
- const url = urlSchema.parse(input);
57
- const { follow, respectRobots, outputType, outputTypes: rawOutputTypes, quality, outputDir, fullPage, cssSelector, xpathSelector, colorScheme, browsers: parsedBrowsers, devices: rawDevices, delay, waitFor, cookie, header, localStorage, } = optionsSchema.parse(options);
58
- let parsedOutputTypes;
59
- if (rawOutputTypes) {
60
- try {
61
- const outputTypeEntrySchema = zod_1.z.array(zod_1.z
62
- .object({
63
- type: zod_1.z.string().transform((v) => v.toUpperCase()),
64
- selector: zod_1.z
65
- .object({
66
- type: zod_1.z.enum(['CSS', 'XPATH']).optional(),
67
- value: zod_1.z.string().optional(),
68
- })
69
- .optional(),
70
- quality: zod_1.z.number().min(1).max(100).optional(),
71
- fullPage: zod_1.z.boolean().optional(),
72
- })
73
- .transform((data) => ({
74
- ...data,
75
- type: data.type,
76
- })));
77
- parsedOutputTypes = outputTypeEntrySchema.parse(JSON.parse(rawOutputTypes));
78
- }
79
- catch {
80
- output_1.default.exitError("Invalid --outputTypes value. Use JSON array, e.g. --outputTypes '[{\"type\":\"png\"},{\"type\":\"jpeg\",\"quality\":80}]'");
81
- }
82
- }
83
- else if (outputType) {
84
- if (typeof quality === 'number' && outputType !== 'jpeg') {
85
- output_1.default.exitError('Quality is only supported for jpeg output type, use --outputType jpeg');
86
- }
87
- if (cssSelector && xpathSelector) {
88
- output_1.default.exitError('Only one of --cssSelector or --xpathSelector can be used');
89
- }
90
- const entry = {
91
- type: outputType.toUpperCase(),
92
- };
93
- if (cssSelector) {
94
- entry.selector = { type: 'CSS', value: cssSelector };
95
- }
96
- else if (xpathSelector) {
97
- entry.selector = { type: 'XPATH', value: xpathSelector };
98
- }
99
- if (typeof quality === 'number') {
100
- entry.quality = quality;
101
- }
102
- if (fullPage) {
103
- entry.fullPage = fullPage;
104
- }
105
- parsedOutputTypes = [entry];
106
- }
107
- let parsedDevices;
108
- if (rawDevices) {
109
- try {
110
- const dimensionSchema = zod_1.z
111
- .string()
112
- .regex(/^\d+x\d+$/, 'Must be in format "widthxheight"')
113
- .transform((val) => {
114
- const [width, height] = val.split('x').map(Number);
115
- return { width, height };
116
- });
117
- const deviceSchema = zod_1.z.array(zod_1.z.object({
118
- name: zod_1.z.string().optional(),
119
- viewport: dimensionSchema,
120
- screen: dimensionSchema,
121
- devicePixelRatio: zod_1.z.number().positive(),
122
- isMobile: zod_1.z.boolean(),
123
- }));
124
- parsedDevices = deviceSchema.parse(JSON.parse(rawDevices));
125
- }
126
- catch {
127
- output_1.default.exitError('Invalid --devices value. Use JSON array, e.g. --devices \'[{"viewport":"1920x1080","screen":"1920x1080","devicePixelRatio":1,"isMobile":false}]\'');
128
- }
129
- }
130
- return {
131
- url,
132
- follow,
133
- respectRobots,
134
- outputTypes: parsedOutputTypes,
135
- outputDir,
136
- colorScheme,
137
- browsers: parsedBrowsers,
138
- devices: parsedDevices,
139
- cookies: cookie,
140
- requestHeaders: header,
141
- delays: delay ?? [],
142
- waitForSelectors: waitFor,
143
- localStorage,
144
- };
145
- }
146
- catch (error) {
147
- if (error instanceof zod_1.ZodError) {
148
- output_1.default.exitError(error.errors.map((e) => `${e.path}: ${e.message}`).join(', '));
149
- }
150
- else {
151
- throw error;
152
- }
153
- }
154
- }
@@ -1,144 +0,0 @@
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 output_1 = __importDefault(require("../output"));
10
- const node_zlib_1 = require("node:zlib");
11
- const promises_1 = require("node:stream/promises");
12
- const node_fs_1 = require("node:fs");
13
- const node_path_1 = __importDefault(require("node:path"));
14
- const promises_2 = require("node:fs/promises");
15
- const commandScrape = (0, utils_1.newCommand)('scrape', texts_1.DESC_COMMAND_VT_SCRAPE);
16
- commandScrape.argument('[url]', texts_1.OPTION_SCRAPE_URL);
17
- commandScrape.option('--follow', texts_1.OPTION_SCRAPE_FOLLOW, false);
18
- commandScrape.option('--respectRobots', texts_1.OPTION_COMPARE_RESPECT_ROBOTS);
19
- commandScrape.addOption(new commander_1.Option('--outputType <type>', texts_1.OPTION_SCRAPE_OUTPUT_TYPE).choices([
20
- 'jpeg',
21
- 'png',
22
- 'md',
23
- 'html',
24
- ]));
25
- commandScrape.option('--outputTypes <json>', texts_1.OPTION_SCRAPE_OUTPUT_TYPES);
26
- commandScrape.option('--quality <quality>', texts_1.OPTION_SCRAPE_QUALITY);
27
- commandScrape.option('--fullPage', texts_1.OPTION_SCRAPE_FULL_PAGE, false);
28
- commandScrape.option('--cssSelector <selector>', texts_1.OPTION_SCRAPE_CSS_SELECTOR);
29
- commandScrape.option('--xpathSelector <selector>', texts_1.OPTION_SCRAPE_XPATH_SELECTOR);
30
- commandScrape.addOption(new commander_1.Option('--colorScheme <scheme>', texts_1.OPTION_SCRAPE_COLOR_SCHEME).choices([
31
- 'LIGHT',
32
- 'DARK',
33
- 'LIGHT_AND_DARK',
34
- ]));
35
- commandScrape.option('--browsers <browsers>', texts_1.OPTION_SCRAPE_BROWSERS);
36
- commandScrape.option('--devices <devices>', texts_1.OPTION_SCRAPE_DEVICES);
37
- commandScrape.option('--waitFor <waitFors...>', texts_1.OPTION_COMPARE_WAIT_FOR);
38
- commandScrape.option('--cookie <cookies...>', texts_1.OPTION_COMPARE_COOKIE);
39
- commandScrape.option('--header <headers...>', texts_1.OPTION_COMPARE_HEADER);
40
- commandScrape.option('--localStorage <items...>', texts_1.OPTION_SCRAPE_LOCAL_STORAGE);
41
- commandScrape.option('--delay <delays...>', texts_1.OPTION_COMPARE_DELAY);
42
- commandScrape.option('--outputDir <dir>', texts_1.OPTION_SCRAPE_OUTPUT_DIR, '.');
43
- commandScrape.action(async (inputUrl, options) => {
44
- const { checkToken } = require('../visualTest/validation');
45
- const { downloadScrapPackage, sendScrap } = require('../visualTest/requests');
46
- const { setCiAndCommitInfo } = require('../visualTest/context');
47
- const { validateInputAndOptions } = require('./scrape/validation');
48
- const { getCiAndGitInfo } = require('@buddy-works/ci-info');
49
- const tar = require('tar-stream');
50
- if (!checkToken('scrape')) {
51
- output_1.default.exitError(texts_1.ERR_MISSING_SCRAPE_TOKEN);
52
- }
53
- const { url, follow, respectRobots, outputTypes, outputDir, colorScheme, browsers, devices, cookies, requestHeaders, delays, waitForSelectors, localStorage, } = validateInputAndOptions(inputUrl, options);
54
- try {
55
- const ciAndGitInfo = await getCiAndGitInfo({});
56
- setCiAndCommitInfo(ciAndGitInfo);
57
- const { buildId } = await sendScrap(url, follow, respectRobots, outputTypes, colorScheme, browsers, devices, cookies, requestHeaders, delays, waitForSelectors, localStorage);
58
- const status = await watchSessionStatus(buildId);
59
- if (!status.ok) {
60
- output_1.default.exitError(`Scrape session failed: ${status.error}`);
61
- }
62
- output_1.default.normal('Downloading scrape package');
63
- const scrapPackageStream = await downloadScrapPackage(buildId);
64
- const brotliDecompressor = (0, node_zlib_1.createBrotliDecompress)();
65
- const unpack = tar.extract();
66
- unpack.on('entry', async (header, stream, next) => {
67
- const currentDir = process.cwd();
68
- const preparedOutputDir = node_path_1.default.isAbsolute(outputDir)
69
- ? outputDir
70
- : node_path_1.default.join(currentDir, outputDir);
71
- const newFilePath = node_path_1.default.join(preparedOutputDir, header.name);
72
- try {
73
- if (header.type === 'file') {
74
- await (0, promises_2.mkdir)(node_path_1.default.dirname(newFilePath), { recursive: true });
75
- const fileWriteStream = (0, node_fs_1.createWriteStream)(newFilePath);
76
- await (0, promises_1.pipeline)(stream, fileWriteStream);
77
- next();
78
- }
79
- else {
80
- stream.resume();
81
- next();
82
- }
83
- }
84
- catch (entryError) {
85
- output_1.default.error(`Error processing entry ${header.name}: ${entryError}`);
86
- next(entryError);
87
- }
88
- });
89
- await (0, promises_1.pipeline)(scrapPackageStream, brotliDecompressor, unpack);
90
- output_1.default.exitSuccess('Downloading scrape package finished');
91
- }
92
- catch (error) {
93
- output_1.default.exitError(`${error}`);
94
- }
95
- });
96
- async function watchSessionStatus(buildId) {
97
- const { connectToScrapSession } = require('../visualTest/requests');
98
- return new Promise((resolve) => {
99
- const eventSource = connectToScrapSession(buildId);
100
- eventSource.addEventListener('SESSION_STATUS', (event) => {
101
- const data = JSON.parse(event.data);
102
- if (data.status === 'STARTED') {
103
- output_1.default.normal('Scrape session started');
104
- }
105
- else if (data.status === 'GATHER_URLS_COMPLETED') {
106
- output_1.default.normal(`Gathering URLs completed, found ${data.text} URLs`);
107
- }
108
- else if (data.status === 'GATHER_URLS_FAILED') {
109
- output_1.default.error('Gathering URLs failed');
110
- }
111
- else if (data.status === 'SCRAPE_URL_COMPLETED') {
112
- output_1.default.normal(`Scraping ${data.text} completed`);
113
- }
114
- else if (data.status === 'SCRAPE_URL_FAILED') {
115
- output_1.default.error(`Scraping ${data.text} failed`);
116
- }
117
- else if (data.status === 'CREATE_PACKAGE_COMPLETED') {
118
- output_1.default.normal('Package created');
119
- }
120
- else if (data.status === 'CREATE_PACKAGE_FAILED') {
121
- output_1.default.error('Package creation failed');
122
- }
123
- else if (data.status === 'ERROR') {
124
- eventSource.close();
125
- resolve({ ok: false, error: data.text });
126
- }
127
- else if (data.status === 'FINISHED') {
128
- eventSource.close();
129
- output_1.default.normal('Scrape session finished');
130
- resolve({ ok: true });
131
- }
132
- });
133
- eventSource.addEventListener('error', (event) => {
134
- if (event.code) {
135
- eventSource.close();
136
- if (event.code === 410) {
137
- output_1.default.normal('Scrape session finished');
138
- }
139
- resolve({ ok: event.code === 410, error: event.code });
140
- }
141
- });
142
- });
143
- }
144
- exports.default = commandScrape;
@@ -1,86 +0,0 @@
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 commander_1 = require("commander");
10
- const node_path_1 = __importDefault(require("node:path"));
11
- const token = process.env.BUDDY_UT_TOKEN || '';
12
- const commandUtUpload = (0, utils_1.newCommand)('upload', texts_1.DESC_COMMAND_UT_UPLOAD);
13
- commandUtUpload.argument('<glob>', texts_1.OPTION_UPLOAD_REPORT_GLOB);
14
- commandUtUpload.addOption(new commander_1.Option('--format <format>', texts_1.OPTION_UPLOAD_REPORT_FORMAT)
15
- .choices(['junit-xml'])
16
- .makeOptionMandatory());
17
- commandUtUpload.option('--dryRun', texts_1.OPTION_UPLOAD_DRY_RUN);
18
- commandUtUpload.action(async (input, options) => {
19
- const { getCiInfo } = require('../../unitTest/ci');
20
- const { sendUploadRequest } = require('../../unitTest/requests');
21
- if (!token) {
22
- output_1.default.exitError(texts_1.ERR_MISSING_UT_TOKEN);
23
- }
24
- const { glob, dryRun } = validateInputAndOptions(input, options);
25
- const ciInfo = await getCiInfo();
26
- const { absolutePattern, files } = findFilesByGlob(glob);
27
- if (files.length === 0) {
28
- output_1.default.exitError(`No files matched the provided glob: ${absolutePattern}`);
29
- }
30
- if (dryRun) {
31
- output_1.default.normal(`Found ${files.length} report file(s) using pattern: ${absolutePattern}`);
32
- files.forEach((file) => {
33
- output_1.default.normal(file);
34
- });
35
- output_1.default.exitSuccess('Dry run completed');
36
- }
37
- await sendUploadRequest(files, ciInfo);
38
- output_1.default.exitSuccess('Upload completed');
39
- });
40
- exports.default = commandUtUpload;
41
- function validateInputAndOptions(input, options) {
42
- const z = require('zod');
43
- const { ZodError } = require('zod');
44
- const globSchema = z.string();
45
- const optionsSchema = z.object({
46
- format: z.enum(['junit-xml']),
47
- dryRun: z.boolean().optional(),
48
- });
49
- try {
50
- const glob = globSchema.parse(input);
51
- const { format, dryRun } = optionsSchema.parse(options);
52
- return {
53
- glob,
54
- format,
55
- dryRun,
56
- };
57
- }
58
- catch (error) {
59
- if (error instanceof ZodError) {
60
- output_1.default.exitError(error.errors.map((e) => `${e.path}: ${e.message}`).join(', '));
61
- }
62
- else {
63
- throw error;
64
- }
65
- }
66
- }
67
- function findFilesByGlob(pattern) {
68
- const { fdir } = require('fdir');
69
- const picomatch = require('picomatch');
70
- const cwd = process.cwd();
71
- const scan = picomatch.scan(pattern);
72
- if (!scan.isGlob) {
73
- return {
74
- absolutePattern: pattern,
75
- files: (0, utils_1.isFile)(pattern) ? [pattern] : [],
76
- };
77
- }
78
- if (node_path_1.default.isAbsolute(pattern)) {
79
- const root = scan.base;
80
- const files = new fdir().withFullPaths().glob(pattern).crawl(root).sync();
81
- return { absolutePattern: pattern, files };
82
- }
83
- const preparedPattern = node_path_1.default.resolve(cwd, pattern);
84
- const files = new fdir().withFullPaths().glob(preparedPattern).crawl().sync();
85
- return { absolutePattern: preparedPattern, files };
86
- }
@@ -1,12 +0,0 @@
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 upload_1 = __importDefault(require("./ut/upload"));
9
- const commandUt = (0, utils_1.newCommand)('tests', texts_1.DESC_COMMAND_UT);
10
- commandUt.alias('ut');
11
- commandUt.addCommand(upload_1.default);
12
- exports.default = commandUt;