bdy 1.22.58 → 1.22.59-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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bdy",
3
3
  "preferGlobal": false,
4
- "version": "1.22.58",
4
+ "version": "1.22.59-dev",
5
5
  "type": "commonjs",
6
6
  "license": "MIT",
7
7
  "scripts": {
@@ -932,7 +932,27 @@ class ApiClient {
932
932
  parseResponseBody: true,
933
933
  });
934
934
  }
935
- async getProjects(workspace, page = 1, perPage = 1000) {
935
+ async getAllProjects(workspace, limit = 2000) {
936
+ let page = 1;
937
+ const perPage = 100;
938
+ const projects = [];
939
+ while (page * perPage <= limit) {
940
+ const result = await this.getProjects(workspace, page, perPage);
941
+ if (result.projects && result.projects.length > 0) {
942
+ projects.push(...result.projects);
943
+ if (result.projects.length < perPage)
944
+ break;
945
+ page += 1;
946
+ }
947
+ else {
948
+ break;
949
+ }
950
+ }
951
+ return {
952
+ projects
953
+ };
954
+ }
955
+ async getProjects(workspace, page = 1, perPage = 100) {
936
956
  const query = {
937
957
  page: page.toString(),
938
958
  per_page: perPage.toString(),
@@ -7,12 +7,14 @@ const utils_1 = require("../../utils");
7
7
  const texts_1 = require("../../texts");
8
8
  const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
+ const distro_1 = require("../../types/distro");
10
11
  const commandArtifactCreate = (0, utils_1.newCommand)('create', texts_1.DESC_COMMAND_ARTIFACT_CREATE);
11
12
  commandArtifactCreate.alias('add');
12
13
  commandArtifactCreate.option('-i, --identifier <identifier>', texts_1.OPT_COMMAND_ARTIFACT_CREATE_IDENTIFIER);
13
14
  commandArtifactCreate.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
14
15
  commandArtifactCreate.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
15
16
  commandArtifactCreate.option('-t, --type <type>', texts_1.OPT_COMMAND_ARTIFACT_TYPE, utils_1.ARTIFACT_TYPE.BUCKET);
17
+ commandArtifactCreate.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
16
18
  commandArtifactCreate.option('-b, --buddy', texts_1.OPTION_HTTP_AUTH_BUDDY);
17
19
  commandArtifactCreate.option('-a, --auth <user:pass>', texts_1.OPTION_HTTP_AUTH);
18
20
  commandArtifactCreate.argument('[name]', texts_1.OPT_COMMAND_ARTIFACT_NAME);
@@ -23,7 +25,7 @@ commandArtifactCreate.action(async (name, options) => {
23
25
  const project = input_1.default.restApiProject(options.project, true);
24
26
  const client = input_1.default.restApiTokenClient();
25
27
  const type = input_1.default.artifactType(options.type);
26
- const scope = input_1.default.artifactScope(project);
28
+ const scope = input_1.default.scope(project, options.scope);
27
29
  if (!name) {
28
30
  if (options.identifier)
29
31
  name = options.identifier;
@@ -38,7 +40,7 @@ commandArtifactCreate.action(async (name, options) => {
38
40
  type: utils_1.ARTIFACT_AUTH_TYPE.NONE,
39
41
  },
40
42
  };
41
- if (project) {
43
+ if (project && scope === distro_1.SCOPE.PROJECT) {
42
44
  data.project = {
43
45
  name: project,
44
46
  };
@@ -7,18 +7,21 @@ const utils_1 = require("../../utils");
7
7
  const texts_1 = require("../../texts");
8
8
  const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
+ const distro_1 = require("../../types/distro");
10
11
  const commandArtifactDelete = (0, utils_1.newCommand)('delete', texts_1.DESC_COMMAND_ARTIFACT_DELETE);
11
12
  commandArtifactDelete.alias('rm');
12
13
  commandArtifactDelete.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
14
+ commandArtifactDelete.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
13
15
  commandArtifactDelete.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
16
  commandArtifactDelete.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
15
17
  commandArtifactDelete.argument('<identifier>', texts_1.OPT_COMMAND_ARTIFACT_IDENTIFIER);
16
18
  commandArtifactDelete.addHelpText('after', texts_1.EXAMPLE_ARTIFACT_DELETE);
17
19
  commandArtifactDelete.action(async (identifier, options) => {
18
20
  const workspace = input_1.default.restApiWorkspace(options.workspace);
19
- const project = input_1.default.restApiProject(options.project);
21
+ const project = input_1.default.restApiProject(options.project, true);
22
+ const scope = input_1.default.scope(project, options.scope);
20
23
  const client = input_1.default.restApiTokenClient();
21
- const data = await client.getArtifactVersionByIdentifier(workspace, project, identifier);
24
+ const data = await client.getArtifactVersionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
22
25
  if (!data || !data.domain) {
23
26
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
24
27
  }
@@ -11,9 +11,11 @@ const logger_1 = __importDefault(require("../../logger"));
11
11
  const path_1 = require("path");
12
12
  const fs_1 = __importDefault(require("fs"));
13
13
  const promises_1 = __importDefault(require("node:stream/promises"));
14
+ const distro_1 = require("../../types/distro");
14
15
  const commandArtifactDownload = (0, utils_1.newCommand)('download', texts_1.DESC_COMMAND_ARTIFACT_DOWNLOAD);
15
16
  commandArtifactDownload.alias('dd');
16
17
  commandArtifactDownload.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
18
+ commandArtifactDownload.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
17
19
  commandArtifactDownload.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
18
20
  commandArtifactDownload.option('-m, --merge', texts_1.OPTION_ARTIFACT_DOWNLOAD_MERGE);
19
21
  commandArtifactDownload.option('-r, --replace', texts_1.OPTION_ARTIFACT_DOWNLOAD_REPLACE);
@@ -27,13 +29,14 @@ commandArtifactDownload.action(async (id, path, options) => {
27
29
  const client = input_1.default.restApiTokenClient();
28
30
  const workspace = input_1.default.restApiWorkspace(options.workspace);
29
31
  const project = input_1.default.restApiProject(options.project, true);
32
+ const scope = input_1.default.scope(project, options.scope);
30
33
  // eslint-disable-next-line prefer-const
31
34
  let { identifier, version, isDefault } = input_1.default.artifactSplitIdentifier(id);
32
- const data = await client.getArtifactVersionByIdentifier(workspace, project, identifier, version);
35
+ const data = await client.getArtifactVersionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier, version);
33
36
  if (!data || !data.domain) {
34
37
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
35
38
  }
36
- if (project && !data.project_identifier) {
39
+ if (project && scope === distro_1.SCOPE.PROJECT && !data.project_identifier) {
37
40
  output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
38
41
  }
39
42
  const artifactId = data.artifact_id;
@@ -7,16 +7,19 @@ const utils_1 = require("../../utils");
7
7
  const texts_1 = require("../../texts");
8
8
  const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
+ const distro_1 = require("../../types/distro");
10
11
  const commandArtifactGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_ARTIFACT_GET);
11
12
  commandArtifactGet.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
+ commandArtifactGet.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
12
14
  commandArtifactGet.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
13
15
  commandArtifactGet.option('--format <text|json>', texts_1.OPTION_FORMAT);
14
16
  commandArtifactGet.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
15
17
  commandArtifactGet.action(async (identifier, options) => {
16
18
  const workspace = input_1.default.restApiWorkspace(options.workspace);
17
19
  const project = input_1.default.restApiProject(options.project, true);
20
+ const scope = input_1.default.scope(project, options.scope);
18
21
  const client = input_1.default.restApiTokenClient();
19
- const data = await client.getArtifactVersionByIdentifier(workspace, project, identifier);
22
+ const data = await client.getArtifactVersionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
20
23
  if (!data || !data.domain) {
21
24
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
22
25
  }
@@ -7,20 +7,23 @@ const output_1 = __importDefault(require("../../output"));
7
7
  const texts_1 = require("../../texts");
8
8
  const utils_1 = require("../../utils");
9
9
  const input_1 = __importDefault(require("../../input"));
10
+ const distro_1 = require("../../types/distro");
10
11
  const commandArtifactList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_ARTIFACT_LIST);
11
12
  commandArtifactList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
+ commandArtifactList.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
12
14
  commandArtifactList.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
13
15
  commandArtifactList.option('--format <text|json>', texts_1.OPTION_FORMAT);
14
16
  commandArtifactList.alias('ls');
15
17
  commandArtifactList.action(async (options) => {
16
18
  const workspace = input_1.default.restApiWorkspace(options.workspace);
17
19
  const project = input_1.default.restApiProject(options.project, true);
20
+ const scope = input_1.default.scope(project, options.scope);
18
21
  const client = input_1.default.restApiTokenClient();
19
- const response = await client.getArtifacts(workspace, project);
22
+ const response = await client.getArtifacts(workspace, scope === distro_1.SCOPE.PROJECT ? project : null);
20
23
  const artifacts = response.artifacts || [];
21
24
  if (options.format === 'json') {
22
- const filtered = project
23
- ? artifacts.filter((a) => a.scope !== utils_1.ARTIFACT_SCOPE.WORKSPACE)
25
+ const filtered = scope === distro_1.SCOPE.PROJECT
26
+ ? artifacts.filter((a) => a.scope !== distro_1.SCOPE.WORKSPACE)
24
27
  : artifacts;
25
28
  output_1.default.json(filtered);
26
29
  }
@@ -30,7 +33,7 @@ commandArtifactList.action(async (options) => {
30
33
  }
31
34
  const data = [['NAME', 'IDENTIFIER', 'TYPE', 'URL']];
32
35
  for (const artifact of artifacts) {
33
- if (project && artifact.scope === utils_1.ARTIFACT_SCOPE.WORKSPACE)
36
+ if (scope === distro_1.SCOPE.PROJECT && artifact.scope === distro_1.SCOPE.WORKSPACE)
34
37
  continue;
35
38
  data.push([
36
39
  artifact.name,
@@ -10,9 +10,11 @@ const output_1 = __importDefault(require("../../output"));
10
10
  const logger_1 = __importDefault(require("../../logger"));
11
11
  const fs_1 = __importDefault(require("fs"));
12
12
  const path_1 = require("path");
13
+ const distro_1 = require("../../types/distro");
13
14
  const commandArtifactPublish = (0, utils_1.newCommand)('publish', texts_1.DESC_COMMAND_ARTIFACT_PUBLISH);
14
15
  commandArtifactPublish.alias('pub');
15
16
  commandArtifactPublish.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
17
+ commandArtifactPublish.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
16
18
  commandArtifactPublish.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
19
  commandArtifactPublish.option('-c, --create', texts_1.OPTION_ARTIFACT_PUBLISH_CREATE);
18
20
  commandArtifactPublish.option('-f, --force', texts_1.OPTION_ARTIFACT_PUBLISH_OVERWRITE_VERSION);
@@ -24,13 +26,14 @@ commandArtifactPublish.action(async (id, path, options) => {
24
26
  let dirPath = input_1.default.resolvePath(path);
25
27
  const workspace = input_1.default.restApiWorkspace(options.workspace);
26
28
  const project = input_1.default.restApiProject(options.project, true);
29
+ const scope = input_1.default.scope(project, options.scope);
27
30
  const { identifier, version } = input_1.default.artifactSplitIdentifier(id);
28
31
  const client = input_1.default.restApiTokenClient();
29
- const data = await client.getArtifactVersionByIdentifier(workspace, project, identifier, version);
32
+ const data = await client.getArtifactVersionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier, version);
30
33
  if (!data || !data.domain) {
31
34
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
32
35
  }
33
- if (project && !data.project_identifier) {
36
+ if (scope === distro_1.SCOPE.PROJECT && !data.project_identifier) {
34
37
  output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
35
38
  }
36
39
  let artifactId = data.artifact_id;
@@ -40,13 +43,13 @@ commandArtifactPublish.action(async (id, path, options) => {
40
43
  name: identifier,
41
44
  identifier,
42
45
  type: utils_1.ARTIFACT_TYPE.BUCKET,
43
- scope: utils_1.ARTIFACT_SCOPE.WORKSPACE,
46
+ scope: distro_1.SCOPE.WORKSPACE,
44
47
  authorization: {
45
48
  type: utils_1.ARTIFACT_AUTH_TYPE.NONE,
46
49
  },
47
50
  };
48
- if (project) {
49
- data.scope = utils_1.ARTIFACT_SCOPE.PROJECT;
51
+ if (scope === distro_1.SCOPE.PROJECT && project) {
52
+ data.scope = distro_1.SCOPE.PROJECT;
50
53
  data.project = {
51
54
  name: project,
52
55
  };
@@ -7,11 +7,13 @@ const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const input_1 = __importDefault(require("../../../input"));
9
9
  const output_1 = __importDefault(require("../../../output"));
10
+ const distro_1 = require("../../../types/distro");
10
11
  const commandArtifactVersionDelete = (0, utils_1.newCommand)('delete', texts_1.DESC_COMMAND_ARTIFACT_VERSION_DELETE);
11
12
  commandArtifactVersionDelete.alias('rm');
12
13
  commandArtifactVersionDelete.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
14
  commandArtifactVersionDelete.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
15
  commandArtifactVersionDelete.argument('<identifier>', texts_1.OPT_COMMAND_ARTIFACT_IDENTIFIER);
16
+ commandArtifactVersionDelete.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
15
17
  commandArtifactVersionDelete.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
16
18
  commandArtifactVersionDelete.argument('<version>', texts_1.OPT_COMMAND_ARTIFACT_VERSION);
17
19
  commandArtifactVersionDelete.addHelpText('after', texts_1.EXAMPLE_ARTIFACT_VERSION_DELETE);
@@ -19,7 +21,8 @@ commandArtifactVersionDelete.action(async (identifier, version, options) => {
19
21
  const workspace = input_1.default.restApiWorkspace(options.workspace);
20
22
  const project = input_1.default.restApiProject(options.project, true);
21
23
  const client = input_1.default.restApiTokenClient();
22
- const data = await client.getArtifactVersionByIdentifier(workspace, project, identifier, version);
24
+ const scope = input_1.default.scope(project, options.scope);
25
+ const data = await client.getArtifactVersionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier, version);
23
26
  if (!data || !data.domain) {
24
27
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
25
28
  }
@@ -7,18 +7,21 @@ const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const input_1 = __importDefault(require("../../../input"));
9
9
  const output_1 = __importDefault(require("../../../output"));
10
+ const distro_1 = require("../../../types/distro");
10
11
  const commandArtifactVersionGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_ARTIFACT_VERSION_GET);
11
12
  commandArtifactVersionGet.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
12
13
  commandArtifactVersionGet.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
13
14
  commandArtifactVersionGet.option('--format <text|json>', texts_1.OPTION_FORMAT);
14
15
  commandArtifactVersionGet.argument('<identifier>', texts_1.OPT_COMMAND_ARTIFACT_IDENTIFIER);
16
+ commandArtifactVersionGet.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
15
17
  commandArtifactVersionGet.argument('<version>', texts_1.OPT_COMMAND_ARTIFACT_VERSION);
16
18
  commandArtifactVersionGet.addHelpText('after', texts_1.EXAMPLE_ARTIFACT_VERSION_GET);
17
19
  commandArtifactVersionGet.action(async (identifier, version, options) => {
18
20
  const workspace = input_1.default.restApiWorkspace(options.workspace);
19
21
  const project = input_1.default.restApiProject(options.project, true);
22
+ const scope = input_1.default.scope(project, options.scope);
20
23
  const client = input_1.default.restApiTokenClient();
21
- const data = await client.getArtifactVersionByIdentifier(workspace, project, identifier, version);
24
+ const data = await client.getArtifactVersionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier, version);
22
25
  if (!data || !data.domain) {
23
26
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
24
27
  }
@@ -7,6 +7,7 @@ const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const input_1 = __importDefault(require("../../../input"));
9
9
  const output_1 = __importDefault(require("../../../output"));
10
+ const distro_1 = require("../../../types/distro");
10
11
  const commandArtifactVersionList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_ARTIFACT_VERSION_LIST);
11
12
  commandArtifactVersionList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
12
13
  commandArtifactVersionList.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
@@ -15,14 +16,16 @@ commandArtifactVersionList.option('--per-page <number>', texts_1.OPTION_REST_API
15
16
  commandArtifactVersionList.option('--format <text|json>', texts_1.OPTION_FORMAT);
16
17
  commandArtifactVersionList.alias('ls');
17
18
  commandArtifactVersionList.argument('<identifier>', texts_1.OPT_COMMAND_ARTIFACT_IDENTIFIER);
19
+ commandArtifactVersionList.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
18
20
  commandArtifactVersionList.addHelpText('after', texts_1.EXAMPLE_ARTIFACT_VERSION_LIST);
19
21
  commandArtifactVersionList.action(async (identifier, options) => {
20
22
  const page = input_1.default.restApiPage(options.page);
21
23
  const perPage = input_1.default.restApiPerPage(options.perPage);
22
24
  const workspace = input_1.default.restApiWorkspace(options.workspace);
23
25
  const project = input_1.default.restApiProject(options.project, true);
26
+ const scope = input_1.default.scope(project, options.scope);
24
27
  const client = input_1.default.restApiTokenClient();
25
- const data = await client.getArtifactVersionByIdentifier(workspace, project, identifier);
28
+ const data = await client.getArtifactVersionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
26
29
  if (!data || !data.domain) {
27
30
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
28
31
  }
@@ -7,11 +7,12 @@ const utils_1 = require("../../utils");
7
7
  const texts_1 = require("../../texts");
8
8
  const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
+ const distro_1 = require("../../types/distro");
10
11
  const commandDistroCreate = (0, utils_1.newCommand)('create', texts_1.DESC_COMMAND_DISTRO_CREATE);
11
12
  commandDistroCreate.alias('add');
12
13
  commandDistroCreate.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
14
  commandDistroCreate.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
- commandDistroCreate.option('-s, --scope <scope>', texts_1.OPT_COMMAND_DISTRO_SCOPE);
15
+ commandDistroCreate.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
15
16
  commandDistroCreate.option('-i, --identifier <identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
16
17
  commandDistroCreate.option('-n, --name <name>', texts_1.OPT_COMMAND_DISTRO_NAME);
17
18
  commandDistroCreate.addHelpText('after', `\nEXAMPLES:${texts_1.EXAMPLE_DISTRO_CREATE}`);
@@ -20,7 +21,7 @@ commandDistroCreate.action(async (options) => {
20
21
  const workspace = input_1.default.restApiWorkspace(options.workspace);
21
22
  const project = input_1.default.restApiProject(options.project, true);
22
23
  const client = input_1.default.restApiTokenClient();
23
- const scope = input_1.default.distroScope(project, options.scope);
24
+ const scope = input_1.default.scope(project, options.scope);
24
25
  const timestamp = Date.now().toString(36);
25
26
  const baseName = humanId({ separator: '-', capitalize: false });
26
27
  const defaultIdentifier = `${baseName}-${timestamp}`;
@@ -29,7 +30,7 @@ commandDistroCreate.action(async (options) => {
29
30
  identifier: options.identifier || defaultIdentifier,
30
31
  scope,
31
32
  };
32
- if (project)
33
+ if (project && scope === distro_1.SCOPE.PROJECT)
33
34
  body.project_name = project;
34
35
  const result = await client.createDistro(workspace, body);
35
36
  output_1.default.identifier(result.identifier);
@@ -7,9 +7,11 @@ const utils_1 = require("../../utils");
7
7
  const texts_1 = require("../../texts");
8
8
  const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
+ const distro_1 = require("../../types/distro");
10
11
  const commandDistroDelete = (0, utils_1.newCommand)('delete', texts_1.DESC_COMMAND_DISTRO_DELETE);
11
12
  commandDistroDelete.alias('rm');
12
13
  commandDistroDelete.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
14
+ commandDistroDelete.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
13
15
  commandDistroDelete.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
16
  commandDistroDelete.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
15
17
  commandDistroDelete.argument('<identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
@@ -17,8 +19,9 @@ commandDistroDelete.addHelpText('after', `\nEXAMPLES:${texts_1.EXAMPLE_DISTRO_DE
17
19
  commandDistroDelete.action(async (identifier, options) => {
18
20
  const workspace = input_1.default.restApiWorkspace(options.workspace);
19
21
  const project = input_1.default.restApiProject(options.project, true);
22
+ const scope = input_1.default.scope(project, options.scope);
20
23
  const client = input_1.default.restApiTokenClient();
21
- const data = await client.getDistributionByIdentifier(workspace, project, identifier);
24
+ const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
22
25
  if (!data || !data.domain) {
23
26
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
24
27
  }
@@ -28,7 +31,7 @@ commandDistroDelete.action(async (identifier, options) => {
28
31
  const confirmed = options.force ||
29
32
  (await output_1.default.confirm((0, texts_1.TXT_COMMAND_DISTRO_DELETE_CONFIRM)(identifier)));
30
33
  if (confirmed) {
31
- await client.deleteDistribution(workspace, project, data.distribution_id);
34
+ await client.deleteDistribution(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id);
32
35
  output_1.default.exitSuccess(texts_1.TXT_COMMAND_DISTRO_DELETED);
33
36
  }
34
37
  else {
@@ -7,17 +7,20 @@ const utils_1 = require("../../utils");
7
7
  const texts_1 = require("../../texts");
8
8
  const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
+ const distro_1 = require("../../types/distro");
10
11
  const commandDistroList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_DISTRO_LIST);
11
12
  commandDistroList.alias('ls');
12
13
  commandDistroList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
14
  commandDistroList.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
15
  commandDistroList.option('--format <text|json>', texts_1.OPTION_FORMAT);
15
16
  commandDistroList.addHelpText('after', `\nEXAMPLES:${texts_1.EXAMPLE_DISTRO_LIST}`);
17
+ commandDistroList.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
16
18
  commandDistroList.action(async (options) => {
17
19
  const workspace = input_1.default.restApiWorkspace(options.workspace);
18
20
  const project = input_1.default.restApiProject(options.project, true);
21
+ const scope = input_1.default.scope(project, options.scope);
19
22
  const client = input_1.default.restApiTokenClient();
20
- const r = await client.getDistributions(workspace, project);
23
+ const r = await client.getDistributions(workspace, scope === distro_1.SCOPE.PROJECT ? project : null);
21
24
  const distributions = r.distributions || [];
22
25
  if (options.format === 'json') {
23
26
  output_1.default.json(distributions);
@@ -7,10 +7,12 @@ const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const input_1 = __importDefault(require("../../../input"));
9
9
  const output_1 = __importDefault(require("../../../output"));
10
+ const distro_1 = require("../../../types/distro");
10
11
  const commandDistroRouteCreate = (0, utils_1.newCommand)('create', texts_1.DESC_COMMAND_ROUTE_CREATE);
11
12
  commandDistroRouteCreate.alias('add');
12
13
  commandDistroRouteCreate.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
14
  commandDistroRouteCreate.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
15
+ commandDistroRouteCreate.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
14
16
  commandDistroRouteCreate.option('-t, --type <type>', texts_1.OPT_COMMAND_ROUTE_TYPE);
15
17
  commandDistroRouteCreate.option('-s, --subdomain <subdomain>', texts_1.OPT_COMMAND_ROUTE_SUBDOMAIN);
16
18
  commandDistroRouteCreate.option('-d, --domain <domain>', texts_1.OPT_COMMAND_ROUTE_DOMAIN);
@@ -21,6 +23,7 @@ commandDistroRouteCreate.addHelpText('after', `\nEXAMPLES:${texts_1.EXAMPLE_ROUT
21
23
  commandDistroRouteCreate.action(async (identifier, options) => {
22
24
  const workspace = input_1.default.restApiWorkspace(options.workspace);
23
25
  const project = input_1.default.restApiProject(options.project, true);
26
+ const scope = input_1.default.scope(project, options.scope);
24
27
  const client = input_1.default.restApiTokenClient();
25
28
  const type = input_1.default.routeType(options.type);
26
29
  const body = {
@@ -33,15 +36,15 @@ commandDistroRouteCreate.action(async (identifier, options) => {
33
36
  body.domain = options.domain;
34
37
  if (options.path)
35
38
  body.path = input_1.default.routePath(options.path);
36
- const data = await client.getDistributionByIdentifier(workspace, project, identifier);
39
+ const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
37
40
  if (!data?.domain) {
38
41
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
39
42
  }
40
43
  if (!data?.distribution_id) {
41
44
  output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
42
45
  }
43
- body.targets = await input_1.default.routeTarget(client, workspace, project, options.target);
44
- const result = await client.createRoute(workspace, project, data.distribution_id, body);
46
+ body.targets = await input_1.default.routeTarget(client, workspace, scope === distro_1.SCOPE.PROJECT ? project : null, options.target);
47
+ const result = await client.createRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, body);
45
48
  output_1.default.id(result.id);
46
49
  output_1.default.cyan(result.html_url);
47
50
  output_1.default.green(texts_1.TXT_COMMAND_ROUTE_CREATED);
@@ -7,10 +7,12 @@ const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const input_1 = __importDefault(require("../../../input"));
9
9
  const output_1 = __importDefault(require("../../../output"));
10
+ const distro_1 = require("../../../types/distro");
10
11
  const commandDistroRouteDelete = (0, utils_1.newCommand)('delete', texts_1.DESC_COMMAND_ROUTE_DELETE);
11
12
  commandDistroRouteDelete.alias('rm');
12
13
  commandDistroRouteDelete.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
14
  commandDistroRouteDelete.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
15
+ commandDistroRouteDelete.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
14
16
  commandDistroRouteDelete.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
15
17
  commandDistroRouteDelete.argument('<identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
16
18
  commandDistroRouteDelete.argument('<route-id>', texts_1.OPT_COMMAND_ROUTE_ID);
@@ -18,8 +20,9 @@ commandDistroRouteDelete.addHelpText('after', `\nEXAMPLES:${texts_1.EXAMPLE_ROUT
18
20
  commandDistroRouteDelete.action(async (identifier, routeId, options) => {
19
21
  const workspace = input_1.default.restApiWorkspace(options.workspace);
20
22
  const project = input_1.default.restApiProject(options.project, true);
23
+ const scope = input_1.default.scope(project, options.scope);
21
24
  const client = input_1.default.restApiTokenClient();
22
- const data = await client.getDistributionByIdentifier(workspace, project, identifier);
25
+ const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
23
26
  if (!data?.domain) {
24
27
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
25
28
  }
@@ -29,7 +32,7 @@ commandDistroRouteDelete.action(async (identifier, routeId, options) => {
29
32
  const confirmed = options.force ||
30
33
  (await output_1.default.confirm((0, texts_1.TXT_COMMAND_ROUTE_DELETE_CONFIRM)(identifier, routeId)));
31
34
  if (confirmed) {
32
- await client.deleteRoute(workspace, project, data.distribution_id, routeId);
35
+ await client.deleteRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, routeId);
33
36
  output_1.default.exitSuccess(texts_1.TXT_COMMAND_ROUTE_DELETED);
34
37
  }
35
38
  else {
@@ -7,9 +7,11 @@ const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const input_1 = __importDefault(require("../../../input"));
9
9
  const output_1 = __importDefault(require("../../../output"));
10
+ const distro_1 = require("../../../types/distro");
10
11
  const commandDistroRouteList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_ROUTE_LIST);
11
12
  commandDistroRouteList.alias('ls');
12
13
  commandDistroRouteList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
14
+ commandDistroRouteList.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
13
15
  commandDistroRouteList.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
16
  commandDistroRouteList.option('--format <text|json>', texts_1.OPTION_FORMAT);
15
17
  commandDistroRouteList.argument('<identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
@@ -17,15 +19,16 @@ commandDistroRouteList.addHelpText('after', `\nEXAMPLES:${texts_1.EXAMPLE_ROUTE_
17
19
  commandDistroRouteList.action(async (identifier, options) => {
18
20
  const workspace = input_1.default.restApiWorkspace(options.workspace);
19
21
  const project = input_1.default.restApiProject(options.project, true);
22
+ const scope = input_1.default.scope(project, options.scope);
20
23
  const client = input_1.default.restApiTokenClient();
21
- const data = await client.getDistributionByIdentifier(workspace, project, identifier);
24
+ const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
22
25
  if (!data?.domain) {
23
26
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
24
27
  }
25
28
  if (!data?.distribution_id) {
26
29
  output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
27
30
  }
28
- const r = await client.listRoutes(workspace, project, data.distribution_id);
31
+ const r = await client.listRoutes(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id);
29
32
  const routes = r.routes || [];
30
33
  if (options.format === 'json') {
31
34
  output_1.default.json(routes);
@@ -7,9 +7,11 @@ const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const input_1 = __importDefault(require("../../../input"));
9
9
  const output_1 = __importDefault(require("../../../output"));
10
+ const distro_1 = require("../../../types/distro");
10
11
  const commandDistroRouteUpdate = (0, utils_1.newCommand)('update', texts_1.DESC_COMMAND_ROUTE_UPDATE);
11
12
  commandDistroRouteUpdate.alias('edit');
12
13
  commandDistroRouteUpdate.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
14
+ commandDistroRouteUpdate.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
13
15
  commandDistroRouteUpdate.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
16
  commandDistroRouteUpdate.option('-t, --type <type>', texts_1.OPT_COMMAND_ROUTE_TYPE);
15
17
  commandDistroRouteUpdate.option('-s, --subdomain <subdomain>', texts_1.OPT_COMMAND_ROUTE_SUBDOMAIN);
@@ -22,15 +24,16 @@ commandDistroRouteUpdate.addHelpText('after', `\nEXAMPLES:${texts_1.EXAMPLE_ROUT
22
24
  commandDistroRouteUpdate.action(async (identifier, routeId, options) => {
23
25
  const workspace = input_1.default.restApiWorkspace(options.workspace);
24
26
  const project = input_1.default.restApiProject(options.project, true);
27
+ const scope = input_1.default.scope(project, options.scope);
25
28
  const client = input_1.default.restApiTokenClient();
26
- const data = await client.getDistributionByIdentifier(workspace, project, identifier);
29
+ const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
27
30
  if (!data?.domain) {
28
31
  output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
29
32
  }
30
33
  if (!data?.distribution_id) {
31
34
  output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
32
35
  }
33
- const route = await client.getRoute(workspace, project, data.distribution_id, routeId);
36
+ const route = await client.getRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, routeId);
34
37
  let changed = false;
35
38
  const body = {
36
39
  type: route.type,
@@ -56,13 +59,13 @@ commandDistroRouteUpdate.action(async (identifier, routeId, options) => {
56
59
  changed = true;
57
60
  }
58
61
  if (options.target && options.target.length > 0) {
59
- body.targets = await input_1.default.routeTarget(client, workspace, project, options.target);
62
+ body.targets = await input_1.default.routeTarget(client, workspace, scope === distro_1.SCOPE.PROJECT ? project : null, options.target);
60
63
  changed = true;
61
64
  }
62
65
  if (!changed) {
63
66
  output_1.default.exitError(texts_1.ERR_COMMAND_ROUTE_NO_UPDATE);
64
67
  }
65
- const result = await client.updateRoute(workspace, project, data.distribution_id, routeId, body);
68
+ const result = await client.updateRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, routeId, body);
66
69
  output_1.default.id(result.id);
67
70
  output_1.default.cyan(result.html_url);
68
71
  output_1.default.green(texts_1.TXT_COMMAND_ROUTE_UPDATED);
@@ -232,7 +232,7 @@ const createOrGetProject = async (path, options) => {
232
232
  url = String(response.html_url || '');
233
233
  }
234
234
  else {
235
- const response = await client.getProjects(workspace);
235
+ const response = await client.getAllProjects(workspace);
236
236
  if (!response.projects || response.projects.length === 0) {
237
237
  output_1.default.exitError(texts_1.ERR_PROJECT_NO_PROJECTS);
238
238
  }
@@ -14,7 +14,7 @@ commandProjectList.option('--format <text|json>', texts_1.OPTION_FORMAT);
14
14
  commandProjectList.action(async (options) => {
15
15
  const workspace = input_1.default.restApiWorkspace(options.workspace);
16
16
  const client = input_1.default.restApiTokenClient();
17
- const response = await client.getProjects(workspace);
17
+ const response = await client.getAllProjects(workspace);
18
18
  const projects = response.projects || [];
19
19
  if (options.format === 'json') {
20
20
  output_1.default.json(projects);
@@ -370,11 +370,6 @@ class Input {
370
370
  }
371
371
  output_1.default.exitError(texts_1.ERR_COMMAND_ARTIFACT_TYPE);
372
372
  }
373
- static artifactScope(project) {
374
- if (project)
375
- return utils_1.ARTIFACT_SCOPE.PROJECT;
376
- return utils_1.ARTIFACT_SCOPE.WORKSPACE;
377
- }
378
373
  static pipelineRunId(runId) {
379
374
  const r = parseInt(runId, 10);
380
375
  if (!isNaN(r))
@@ -1054,21 +1049,22 @@ class Input {
1054
1049
  output_1.default.exitError(texts_1.ERR_API_WRONG_METHOD);
1055
1050
  return null;
1056
1051
  }
1057
- static distroScope(project, scope) {
1052
+ static scope(project, scope) {
1058
1053
  if (scope) {
1059
- if (scope === distro_1.DISTRO_SCOPE.WORKSPACE) {
1054
+ scope = scope.toUpperCase();
1055
+ if (scope === distro_1.SCOPE.WORKSPACE) {
1060
1056
  return scope;
1061
1057
  }
1062
- if (scope === distro_1.DISTRO_SCOPE.PROJECT) {
1058
+ if (scope === distro_1.SCOPE.PROJECT) {
1063
1059
  if (!project)
1064
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NO_PROJECT);
1060
+ output_1.default.exitError(texts_1.ERR_COMMAND_SCOPE_NO_PROJECT);
1065
1061
  return scope;
1066
1062
  }
1067
- return output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_SCOPE);
1063
+ return output_1.default.exitError(texts_1.ERR_COMMAND_SCOPE);
1068
1064
  }
1069
1065
  if (project)
1070
- return distro_1.DISTRO_SCOPE.PROJECT;
1071
- return distro_1.DISTRO_SCOPE.WORKSPACE;
1066
+ return distro_1.SCOPE.PROJECT;
1067
+ return distro_1.SCOPE.WORKSPACE;
1072
1068
  }
1073
1069
  static restApiProject(project, allowNull) {
1074
1070
  const ProjectCfg = require('./project/cfg').default;
@@ -1,19 +1,145 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.fetchOpenApiSchema = fetchOpenApiSchema;
4
7
  const bundle_1 = require("@scalar/json-magic/bundle");
5
8
  const node_1 = require("@scalar/json-magic/bundle/plugins/node");
6
9
  const openapi_parser_1 = require("@scalar/openapi-parser");
10
+ const node_crypto_1 = require("node:crypto");
11
+ const node_fs_1 = require("node:fs");
12
+ const node_path_1 = __importDefault(require("node:path"));
13
+ const node_v8_1 = require("node:v8");
7
14
  const texts_1 = require("./texts");
8
15
  const utils_1 = require("./utils");
16
+ const BUNDLE_PLUGINS = [(0, node_1.readFiles)(), (0, node_1.fetchUrls)(), (0, node_1.parseYaml)(), (0, node_1.parseJson)()];
17
+ // Hard cache window: within this period the cached schema is served with no
18
+ // network at all. After it expires the schema is revalidated (conditional GET),
19
+ // and a successful revalidation (304/200) resets the window.
20
+ const CACHE_TTL_MS = 60 * 60 * 1000;
21
+ // One cache set per schema URL (region/stage differ), keyed by a URL hash.
22
+ function cachePaths(url) {
23
+ const dir = node_path_1.default.join((0, utils_1.getHomeDirectory)(), 'openapi');
24
+ if (!(0, node_fs_1.existsSync)(dir))
25
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
26
+ const key = (0, node_crypto_1.createHash)('sha256').update(url).digest('hex').slice(0, 16);
27
+ return {
28
+ raw: node_path_1.default.join(dir, `${key}.json`),
29
+ schema: node_path_1.default.join(dir, `${key}.v8`),
30
+ meta: node_path_1.default.join(dir, `${key}.meta.json`),
31
+ };
32
+ }
33
+ function readMeta(metaPath) {
34
+ try {
35
+ return JSON.parse((0, node_fs_1.readFileSync)(metaPath, 'utf8'));
36
+ }
37
+ catch {
38
+ return {};
39
+ }
40
+ }
41
+ // Write via temp + rename so a Ctrl+C can't leave a truncated cache file.
42
+ function writeAtomic(filePath, data) {
43
+ const tmp = `${filePath}.${process.pid}.tmp`;
44
+ (0, node_fs_1.writeFileSync)(tmp, data);
45
+ (0, node_fs_1.renameSync)(tmp, filePath);
46
+ }
47
+ /**
48
+ * Refresh the cached raw schema body via a single conditional GET.
49
+ * 304 → keep cache ('unchanged'); 200 → rewrite raw + validators ('updated');
50
+ * network error → reuse any cached body ('unchanged') or report 'none'.
51
+ */
52
+ async function refresh(url, paths) {
53
+ const hasRaw = (0, node_fs_1.existsSync)(paths.raw);
54
+ const meta = hasRaw ? readMeta(paths.meta) : {};
55
+ // The server serves a strong content-based ETag (identical across instances),
56
+ // so revalidate with If-None-Match.
57
+ const headers = {};
58
+ if (hasRaw && meta.etag)
59
+ headers['If-None-Match'] = meta.etag;
60
+ try {
61
+ const res = await fetch(url, { headers });
62
+ if (res.status === 304 && hasRaw) {
63
+ // Reset the hard-cache window; keep the existing validator.
64
+ writeAtomic(paths.meta, JSON.stringify({ etag: meta.etag, fetchedAt: Date.now() }));
65
+ return 'unchanged';
66
+ }
67
+ if (res.ok) {
68
+ writeAtomic(paths.raw, await res.text());
69
+ writeAtomic(paths.meta, JSON.stringify({
70
+ etag: res.headers.get('etag') ?? undefined,
71
+ fetchedAt: Date.now(),
72
+ }));
73
+ return 'updated';
74
+ }
75
+ }
76
+ catch {
77
+ // network error — fall back to the cached body if present
78
+ }
79
+ return hasRaw ? 'unchanged' : 'none';
80
+ }
81
+ // Bundle + dereference a schema source (local path or remote URL).
82
+ async function buildSchema(source) {
83
+ const data = await (0, bundle_1.bundle)(source, {
84
+ plugins: BUNDLE_PLUGINS,
85
+ treeShake: true,
86
+ });
87
+ const { schema } = await (0, openapi_parser_1.dereference)(data);
88
+ return schema ?? null;
89
+ }
90
+ // The dereferenced schema has circular refs, so it is cached with v8
91
+ // serialization (JSON.stringify can't handle cycles). The blob is
92
+ // Node-version specific, so a failed load just rebuilds from the raw body.
93
+ function loadCachedSchema(schemaPath) {
94
+ try {
95
+ return (0, node_v8_1.deserialize)((0, node_fs_1.readFileSync)(schemaPath));
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ function saveCachedSchema(schemaPath, schema) {
102
+ try {
103
+ writeAtomic(schemaPath, (0, node_v8_1.serialize)(schema));
104
+ }
105
+ catch {
106
+ // caching is best-effort
107
+ }
108
+ }
9
109
  async function fetchOpenApiSchema(baseUrl) {
10
110
  try {
11
111
  const url = (0, utils_1.getOpenApiEndpointByApiBaseUrl)(baseUrl);
12
- const data = await (0, bundle_1.bundle)(url, {
13
- plugins: [(0, node_1.readFiles)(), (0, node_1.fetchUrls)(), (0, node_1.parseYaml)(), (0, node_1.parseJson)()],
14
- treeShake: true,
15
- });
16
- const { schema } = await (0, openapi_parser_1.dereference)(data);
112
+ const paths = cachePaths(url);
113
+ // Hard cache: within the TTL, serve the cached schema with no network call.
114
+ const meta = readMeta(paths.meta);
115
+ if (meta.fetchedAt && Date.now() - meta.fetchedAt < CACHE_TTL_MS) {
116
+ const cached = loadCachedSchema(paths.schema);
117
+ if (cached)
118
+ return cached;
119
+ }
120
+ const state = await refresh(url, paths);
121
+ let schema;
122
+ if (state === 'unchanged') {
123
+ // Fast path: reuse the cached dereferenced schema, skipping the
124
+ // download, bundle() and dereference() entirely. Rebuild from the raw
125
+ // body if the v8 blob is missing or unreadable (e.g. Node upgrade).
126
+ schema = loadCachedSchema(paths.schema);
127
+ if (!schema) {
128
+ schema = await buildSchema(paths.raw);
129
+ if (schema)
130
+ saveCachedSchema(paths.schema, schema);
131
+ }
132
+ }
133
+ else if (state === 'updated') {
134
+ schema = await buildSchema(paths.raw);
135
+ if (schema)
136
+ saveCachedSchema(paths.schema, schema);
137
+ }
138
+ else {
139
+ // No cache and no usable response — last resort: bundle the remote URL
140
+ // directly (preserves the original cold/offline behaviour).
141
+ schema = await buildSchema(url);
142
+ }
17
143
  if (schema)
18
144
  return schema;
19
145
  }
@@ -403,6 +403,42 @@ class Output {
403
403
  item.disabled = disabled;
404
404
  return item;
405
405
  }
406
+ static async inputSearch(message, items) {
407
+ if (this.isStdInTTY()) {
408
+ const prompts = require('@inquirer/prompts');
409
+ try {
410
+ return await prompts.search({
411
+ message,
412
+ theme: this.getInquirerTheme(),
413
+ source: (input) => {
414
+ const result = [];
415
+ items.forEach((str, i) => {
416
+ if (!input || str.toLowerCase().includes(input.toLowerCase())) {
417
+ result.push({
418
+ name: str,
419
+ value: i,
420
+ });
421
+ }
422
+ });
423
+ return result;
424
+ },
425
+ });
426
+ }
427
+ catch {
428
+ this.exitError(texts_1.ERR_CANCELLED);
429
+ }
430
+ }
431
+ else {
432
+ this.cyan('? ', false);
433
+ this.normal(message, false);
434
+ if (items.length > 0) {
435
+ this.cyan(` ${items[0]}`);
436
+ return 0;
437
+ }
438
+ this.normal('');
439
+ return -1;
440
+ }
441
+ }
406
442
  static async inputMenu(message, items) {
407
443
  if (this.isStdInTTY()) {
408
444
  const prompts = require('@inquirer/prompts');
@@ -434,14 +470,14 @@ class Output {
434
470
  return workspaces[0].domain;
435
471
  }
436
472
  const items = workspaces.map((w) => `${w.name} (${w.domain})`);
437
- const index = await Output.inputMenu(texts_1.TXT_LOGIN_SELECT_WORKSPACE, items);
473
+ const index = await Output.inputSearch(texts_1.TXT_LOGIN_SELECT_WORKSPACE, items);
438
474
  return workspaces[index].domain;
439
475
  }
440
476
  static async selectProject(projects, allowNoSet = true) {
441
477
  const items = projects.map((p) => `${p.display_name} (${p.name})`);
442
478
  if (allowNoSet)
443
479
  items.unshift("Don't set (default)");
444
- let index = await Output.inputMenu((0, texts_1.TXT_LOGIN_SELECT_PROJECT)(allowNoSet), items);
480
+ let index = await Output.inputSearch((0, texts_1.TXT_LOGIN_SELECT_PROJECT)(allowNoSet), items);
445
481
  if (allowNoSet && !index)
446
482
  return '';
447
483
  if (!allowNoSet)
@@ -13,8 +13,8 @@ exports.OPTION_SANDBOX_OS = exports.OPTION_SANDBOX_NAME = exports.OPTION_SANDBOX
13
13
  exports.DESC_COMMAND_SANDBOX_APP_START = exports.DESC_COMMAND_SANDBOX_APP_STOP = exports.DESC_COMMAND_SANDBOX_APP_STATUS = exports.DESC_COMMAND_SANDBOX_APP_LOGS = exports.DESC_COMMAND_SANDBOX_EXEC_STATUS = exports.DESC_COMMAND_SANDBOX_EXEC_LIST = exports.DESC_COMMAND_SANDBOX_APP_REMOVE = exports.DESC_COMMAND_SANDBOX_APP_ADD = exports.DESC_COMMAND_SANDBOX_APP_LIST = exports.TXT_SANDBOX_WAITING_START = exports.TXT_SANDBOX_WAITING_STOP = exports.TXT_SANDBOX_WAITING_APPS = exports.TXT_SANDBOX_WAITING_SETUP = exports.TXT_SANDBOX_WAITING_RUNNING = exports.TXT_SANDBOX_STOPPED = exports.TXT_SANDBOX_STARTED = exports.TXT_SANDBOX_DESTROYED = exports.TXT_SANDBOX_DESTROY_CONFIRM = exports.TXT_SANDBOX_UPDATED = exports.TXT_SANDBOX_CREATED = exports.TXT_SANDBOX_CREATING = exports.TXT_SANDBOX_APP_STARTED = exports.TXT_SANDBOX_APP_STOPPED = exports.OPTION_SANDBOX_WAIT = exports.OPTION_SANDBOX_WAIT_APPS = exports.OPTION_SANDBOX_WAIT_CONFIGURED = exports.OPTION_SANDBOX_WAIT_RUNNING = exports.ERR_SANDBOX_STOP_FAILED = exports.ERR_SANDBOX_NO_COMMANDS = exports.ERR_SANDBOX_RUNNING_FAILED = exports.ERR_SANDBOX_STOP_TIMEOUT = exports.ERR_SANDBOX_SNAPSHOT_TIMEOUT = exports.ERR_SANDBOX_RUNNING_TIMEOUT = exports.ERR_SANDBOX_APPS_TIMEOUT = exports.ERR_SANDBOX_SETUP_TIMEOUT = exports.ERR_SANDBOX_APP_FAILED = exports.ERR_SANDBOX_SETUP_FAILED = exports.ERR_SANDBOX_INVALID_RESOURCES = exports.ERR_SANDBOX_APP_NOT_FOUND = exports.ERR_SANDBOX_NOT_FOUND = exports.OPTION_SANDBOX_RUNTIME = exports.OPTION_SANDBOX_TIMEOUT = exports.OPTION_SANDBOX_FETCH = exports.OPTION_SANDBOX_APP_DIR = exports.OPTION_SANDBOX_APP_COMMAND = exports.OPTION_SANDBOX_YAML = exports.OPTION_SANDBOX_TAGS = exports.OPTION_SANDBOX_INSTALL_SCRIPT = exports.OPTION_SANDBOX_INSTALL_COMMANDS = exports.OPTION_SANDBOX_RESOURCES = void 0;
14
14
  exports.TXT_SANDBOX_UNZIP_DONE = exports.TXT_SANDBOX_UNZIP = exports.TXT_SANDBOX_CP_DOWNLOAD_DONE = exports.TXT_SANDBOX_CP_DOWNLOAD = exports.OPTION_SANDBOX_CP_IGNORE = exports.OPTION_SANDBOX_CP_USER = exports.OPTION_SANDBOX_CP_DOWNLOAD_REPLACE = exports.OPTION_SANDBOX_CP_DOWNLOAD_MERGE = exports.OPTION_SANDBOX_CP_DEST = exports.OPTION_SANDBOX_CP_SOURCE = exports.DESC_COMMAND_SANDBOX_CP = exports.ERR_SANDBOX_ENDPOINTS_NOT_FOUND = exports.ERR_SANDBOX_ENDPOINT_NOT_FOUND = exports.ERR_SANDBOX_ENDPOINT_EXISTS = exports.TXT_SANDBOX_ENDPOINT_DELETED = exports.TXT_SANDBOX_ENDPOINT_DELETE_CONFIRM = exports.TXT_SANDBOX_ENDPOINT_ADDED = exports.TXT_SANDBOX_APP_REMOVED = exports.TXT_SANDBOX_APP_ADDED = exports.OPTION_SANDBOX_ENDPOINT_TYPE = exports.OPTION_SANDBOX_ENDPOINT_PORT = exports.OPTION_SANDBOX_ENDPOINT_NAME_ARG = exports.OPTION_SANDBOX_ENDPOINT_NAME = exports.DESC_COMMAND_SANDBOX_ENDPOINT_DELETE = exports.DESC_COMMAND_SANDBOX_ENDPOINT_ADD = exports.DESC_COMMAND_SANDBOX_ENDPOINT_GET = exports.DESC_COMMAND_SANDBOX_ENDPOINT_LIST = exports.DESC_COMMAND_SANDBOX_ENDPOINT = exports.ERR_SANDBOX_SNAPSHOTS_NOT_FOUND = exports.ERR_SANDBOX_SNAPSHOT_NOT_FOUND = exports.ERR_SANDBOX_SNAPSHOT_FAILED = exports.TXT_SANDBOX_SNAPSHOT_WAITING = exports.TXT_SANDBOX_SNAPSHOT_DELETE_CONFIRM = exports.TXT_SANDBOX_SNAPSHOT_DELETED = exports.TXT_SANDBOX_SNAPSHOT_CREATED = exports.OPTION_SANDBOX_FROM_SNAPSHOT = exports.OPTION_SANDBOX_SNAPSHOT_NAME_ARG = exports.OPTION_SANDBOX_SNAPSHOT_NAME = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_DELETE = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_GET = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_CREATE = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_LIST = exports.DESC_COMMAND_SANDBOX_SNAPSHOT = exports.TXT_SANDBOX_COMMAND_KILLED = exports.OPTION_SANDBOX_COMMAND_KILL_CONFIRM = exports.OPTION_SANDBOX_LOGS_LIMIT = exports.OPTION_SANDBOX_APP_ID = exports.OPTION_SANDBOX_COMMAND_ID = exports.DESC_COMMAND_SANDBOX_EXEC_KILL = exports.DESC_COMMAND_SANDBOX_EXEC_LOGS = void 0;
15
15
  exports.TXT_API_ENDPOINT_REQUIRED_SCOPES = exports.ERR_API_ENDPOINT_NOT_FOUND = exports.ERR_API_WRONG_METHOD = exports.ERR_SCHEMA_FETCH_FAILED = exports.OPT_COMMAND_API_INFO_URL = exports.OPT_COMMAND_API_INFO_SCHEMA = exports.OPT_COMMAND_API_INFO_METHOD = exports.OPT_COMMAND_API_LIST_SEARCH = exports.OPT_COMMAND_API_LIST_METHOD = exports.ERR_API_REQUEST_BODY_VALUE = exports.ERR_API_REQUEST_QUERY_VALUE = exports.ERR_API_REQUEST_INVALID_JSON = exports.ERR_API_REQUEST_FILE_ERROR = exports.ERR_API_REQUEST_OUTPUT_EXISTS = exports.DESC_COMMAND_API_INFO = exports.DESC_COMMAND_API_FORM = exports.DESC_COMMAND_API_JSON = exports.DESC_COMMAND_API_DATA = exports.DESC_COMMAND_API_OUTPUT = exports.DESC_COMMAND_API_REQUEST_QUERY = exports.DESC_COMMAND_API_PROJECT = exports.DESC_COMMAND_API_WORKSPACE = exports.DESC_COMMAND_API_REQUEST_URL = exports.DESC_COMMAND_API_GET = exports.DESC_COMMAND_API_PATCH = exports.DESC_COMMAND_API_DELETE = exports.DESC_COMMAND_API_PUT = exports.DESC_COMMAND_API_POST = exports.DESC_COMMAND_API_LIST = exports.DESC_COMMAND_API = exports.ERR_WHOAMI_LOGOUT = exports.TXT_WHOAMI_NO_WORKSPACE = exports.DESC_COMMAND_WHOAMI = exports.TXT_SANDBOX_EXEC_FAILED = exports.TXT_SANDBOX_EXEC_INPROGRESS = exports.TXT_SANDBOX_EXEC_SUCCESS = exports.TXT_SANDBOX_EXEC_BACKGROUND = exports.TXT_SANDBOX_EXEC_ID = exports.ERR_SANDBOX_CP_INVALID_SOURCE = exports.ERR_SANDBOX_CP_INVALID_DEST = exports.ERR_SANDBOX_CP_REPLACE = exports.ERR_SANDBOX_CP_MKDIR = exports.ERR_SANDBOX_CP_PATH_EXISTS = exports.ERR_SANDBOX_CP_NOT_EMPTY_DIR = exports.ERR_SANDBOX_CP_READDIR = exports.ERR_SANDBOX_CP_DEST_NOT_FOLDER = exports.ERR_SANDBOX_CP_SOURCE_NOT_FOUND = exports.TXT_SANDBOX_CP_DONE = exports.TXT_SANDBOX_CP_PROGRESS = exports.TXT_SANDBOX_UNZIPPING_COUNT = void 0;
16
- exports.OPT_COMMAND_DISTRO_IDENTIFIER = exports.OPT_COMMAND_DISTRO_SCOPE = exports.DESC_COMMAND_ROUTE = exports.DESC_COMMAND_ROUTE_UPDATE = exports.DESC_COMMAND_ROUTE_DELETE = exports.DESC_COMMAND_ROUTE_LIST = exports.DESC_COMMAND_DISTRO_LIST = exports.DESC_COMMAND_DISTRO_DELETE = exports.DESC_COMMAND_ROUTE_CREATE = exports.DESC_COMMAND_DISTRO_CREATE = exports.DESC_COMMAND_DISTRO = exports.ERR_API_MESSAGE_REPLACER = exports.ERR_LOGIN_INVALID_BASE_URL = exports.ERR_LOGIN_NO_WORKSPACE_FOUND = exports.ERR_LOGIN_NO_WORKSPACES = exports.ERR_REGISTER_HTTP_CANCEL = exports.ERR_LOGIN_HTTP_CANCEL = exports.ERR_LOGIN_HTTP_FAILED = exports.ERR_LOGIN_HTTP_SERVER_PORT_TAKEN = exports.TXT_REGISTER_SUCCESS = exports.TXT_LOGIN_SUCCESS = exports.TXT_LOGIN_SELECT_WORKSPACE = exports.TXT_LOGIN_ENTER_BASE_URL = exports.TXT_LOGIN_PROVIDE_CODE = exports.TXT_REGISTER_OPEN_URL = exports.TXT_LOGIN_OPEN_URL = exports.TXT_REGISTER_OPENING_STAR = exports.TXT_LOGIN_OPENING_STAR = exports.TXT_REGISTER_OPENING = exports.TXT_LOGIN_OPENING = exports.TXT_LOGIN_SELECT_REGION = exports.TXT_WORKSPACE_NONE = exports.TXT_WORKSPACE_SET_SUCCESS = exports.ARG_COMMAND_WORKSPACE = exports.DESC_COMMAND_WORKSPACE_GET = exports.DESC_COMMAND_WORKSPACE_SET = exports.DESC_COMMAND_WORKSPACE_LIST = exports.DESC_COMMAND_WORKSPACE = exports.TXT_COMMAND_REGISTER_PROVIDE_NAME = exports.TXT_COMMAND_REGISTER_PROVIDE_EMAIL = exports.ERR_COMMAND_REGISTER_INVALID_NAME = exports.ERR_COMMAND_REGISTER_INVALID_EMAIL = exports.OPT_COMMAND_REGISTER_NAME = exports.OPT_COMMAND_REGISTER_EMAIL = exports.DESC_COMMAND_REGISTER = exports.TXT_LOGOUT_SUCCESS = exports.DESC_COMMAND_LOGOUT = exports.DESC_COMMAND_LOGIN = exports.ERR_API_MEDIA_TYPE_NOT_IMPLEMENTED = exports.ERR_API_PARAMETER_NOT_REPLACED = void 0;
17
- exports.DESC_COMMAND_ARTIFACT_DELETE = exports.ERR_COMMAND_ARTIFACT_NO_PROJECTS = exports.DESC_COMMAND_ARTIFACT_VERSION_GET = exports.DESC_COMMAND_ARTIFACT_VERSION_LIST = exports.DESC_COMMAND_ARTIFACT_VERSION_DELETE = exports.DESC_COMMAND_ARTIFACT_DOCKER_LOGIN = exports.DESC_COMMAND_ARTIFACT_LIST = exports.DESC_COMMAND_ARTIFACT_VERSION = exports.ERR_COMMAND_DOMAIN_UNAVAILABLE = exports.OPTION_COMMAND_DOMAIN_IDENTIFIER = exports.ERR_COMMAND_DOMAIN_NO_DOMAINS = exports.TXT_COMMAND_DOMAIN_PROMPT_REQUIRED = exports.TXT_COMMAND_DOMAIN_BUY_SELECT_DOMAIN = exports.TXT_COMMAND_DOMAIN_PROVIDE_PROMPT = exports.ERR_COMMAND_DOMAIN_NOT_FOUND = exports.OPT_COMMAND_DOMAIN_ONLY_AVAILABLE = exports.OPT_COMMAND_DOMAIN_SORT = exports.OPT_COMMAND_DOMAIN_PHRASE = exports.OPT_COMMAND_DOMAIN_BUY_OWNER = exports.OPT_COMMAND_DOMAIN_BUY_TLD = exports.DESC_COMMAND_DOMAIN_GET = exports.DESC_COMMAND_DOMAIN_LIST = exports.DESC_COMMAND_DOMAIN_SEARCH = exports.DESC_COMMAND_DOMAIN_BUY = exports.DESC_COMMAND_DOMAIN = exports.ERR_ROUTE_NO_DEFAULT = exports.ERR_WRONG_ROUTE_TARGET = exports.ERR_COMMAND_ROUTE_NO_TARGET = exports.ERR_COMMAND_ROUTE_TYPE = exports.TXT_COMMAND_ROUTES_NOT_FOUND = exports.TXT_COMMAND_DISTROS_NOT_FOUND = exports.TXT_COMMAND_ROUTE_DELETED = exports.TXT_COMMAND_DISTRO_DELETED = exports.TXT_COMMAND_ROUTE_DELETE_CONFIRM = exports.TXT_COMMAND_DISTRO_DELETE_CONFIRM = exports.ERR_COMMAND_ROUTE_NO_UPDATE = exports.ERR_COMMAND_DISTRO_NOT_FOUND = exports.ERR_COMMAND_DISTRO_SCOPE = exports.TXT_COMMAND_ROUTE_UPDATED = exports.TXT_ROUTE_SERVE = exports.TXT_COMMAND_ROUTE_CREATED = exports.TXT_COMMAND_DISTRO_CREATED = exports.ERR_COMMAND_DISTRO_NO_PROJECT = exports.OPT_COMMAND_DISTRO_NAME = exports.OPT_COMMAND_ROUTE_TARGET = exports.OPT_COMMAND_ROUTE_PATH = exports.OPT_COMMAND_ROUTE_DOMAIN = exports.OPT_COMMAND_ROUTE_SUBDOMAIN = exports.OPT_COMMAND_ROUTE_TYPE = exports.OPT_COMMAND_ROUTE_ID = void 0;
16
+ exports.OPT_COMMAND_DISTRO_IDENTIFIER = exports.OPT_COMMAND_SCOPE = exports.DESC_COMMAND_ROUTE = exports.DESC_COMMAND_ROUTE_UPDATE = exports.DESC_COMMAND_ROUTE_DELETE = exports.DESC_COMMAND_ROUTE_LIST = exports.DESC_COMMAND_DISTRO_LIST = exports.DESC_COMMAND_DISTRO_DELETE = exports.DESC_COMMAND_ROUTE_CREATE = exports.DESC_COMMAND_DISTRO_CREATE = exports.DESC_COMMAND_DISTRO = exports.ERR_API_MESSAGE_REPLACER = exports.ERR_LOGIN_INVALID_BASE_URL = exports.ERR_LOGIN_NO_WORKSPACE_FOUND = exports.ERR_LOGIN_NO_WORKSPACES = exports.ERR_REGISTER_HTTP_CANCEL = exports.ERR_LOGIN_HTTP_CANCEL = exports.ERR_LOGIN_HTTP_FAILED = exports.ERR_LOGIN_HTTP_SERVER_PORT_TAKEN = exports.TXT_REGISTER_SUCCESS = exports.TXT_LOGIN_SUCCESS = exports.TXT_LOGIN_SELECT_WORKSPACE = exports.TXT_LOGIN_ENTER_BASE_URL = exports.TXT_LOGIN_PROVIDE_CODE = exports.TXT_REGISTER_OPEN_URL = exports.TXT_LOGIN_OPEN_URL = exports.TXT_REGISTER_OPENING_STAR = exports.TXT_LOGIN_OPENING_STAR = exports.TXT_REGISTER_OPENING = exports.TXT_LOGIN_OPENING = exports.TXT_LOGIN_SELECT_REGION = exports.TXT_WORKSPACE_NONE = exports.TXT_WORKSPACE_SET_SUCCESS = exports.ARG_COMMAND_WORKSPACE = exports.DESC_COMMAND_WORKSPACE_GET = exports.DESC_COMMAND_WORKSPACE_SET = exports.DESC_COMMAND_WORKSPACE_LIST = exports.DESC_COMMAND_WORKSPACE = exports.TXT_COMMAND_REGISTER_PROVIDE_NAME = exports.TXT_COMMAND_REGISTER_PROVIDE_EMAIL = exports.ERR_COMMAND_REGISTER_INVALID_NAME = exports.ERR_COMMAND_REGISTER_INVALID_EMAIL = exports.OPT_COMMAND_REGISTER_NAME = exports.OPT_COMMAND_REGISTER_EMAIL = exports.DESC_COMMAND_REGISTER = exports.TXT_LOGOUT_SUCCESS = exports.DESC_COMMAND_LOGOUT = exports.DESC_COMMAND_LOGIN = exports.ERR_API_MEDIA_TYPE_NOT_IMPLEMENTED = exports.ERR_API_PARAMETER_NOT_REPLACED = void 0;
17
+ exports.DESC_COMMAND_ARTIFACT_DELETE = exports.ERR_COMMAND_ARTIFACT_NO_PROJECTS = exports.DESC_COMMAND_ARTIFACT_VERSION_GET = exports.DESC_COMMAND_ARTIFACT_VERSION_LIST = exports.DESC_COMMAND_ARTIFACT_VERSION_DELETE = exports.DESC_COMMAND_ARTIFACT_DOCKER_LOGIN = exports.DESC_COMMAND_ARTIFACT_LIST = exports.DESC_COMMAND_ARTIFACT_VERSION = exports.ERR_COMMAND_DOMAIN_UNAVAILABLE = exports.OPTION_COMMAND_DOMAIN_IDENTIFIER = exports.ERR_COMMAND_DOMAIN_NO_DOMAINS = exports.TXT_COMMAND_DOMAIN_PROMPT_REQUIRED = exports.TXT_COMMAND_DOMAIN_BUY_SELECT_DOMAIN = exports.TXT_COMMAND_DOMAIN_PROVIDE_PROMPT = exports.ERR_COMMAND_DOMAIN_NOT_FOUND = exports.OPT_COMMAND_DOMAIN_ONLY_AVAILABLE = exports.OPT_COMMAND_DOMAIN_SORT = exports.OPT_COMMAND_DOMAIN_PHRASE = exports.OPT_COMMAND_DOMAIN_BUY_OWNER = exports.OPT_COMMAND_DOMAIN_BUY_TLD = exports.DESC_COMMAND_DOMAIN_GET = exports.DESC_COMMAND_DOMAIN_LIST = exports.DESC_COMMAND_DOMAIN_SEARCH = exports.DESC_COMMAND_DOMAIN_BUY = exports.DESC_COMMAND_DOMAIN = exports.ERR_ROUTE_NO_DEFAULT = exports.ERR_WRONG_ROUTE_TARGET = exports.ERR_COMMAND_ROUTE_NO_TARGET = exports.ERR_COMMAND_ROUTE_TYPE = exports.TXT_COMMAND_ROUTES_NOT_FOUND = exports.TXT_COMMAND_DISTROS_NOT_FOUND = exports.TXT_COMMAND_ROUTE_DELETED = exports.TXT_COMMAND_DISTRO_DELETED = exports.TXT_COMMAND_ROUTE_DELETE_CONFIRM = exports.TXT_COMMAND_DISTRO_DELETE_CONFIRM = exports.ERR_COMMAND_ROUTE_NO_UPDATE = exports.ERR_COMMAND_DISTRO_NOT_FOUND = exports.ERR_COMMAND_SCOPE = exports.TXT_COMMAND_ROUTE_UPDATED = exports.TXT_ROUTE_SERVE = exports.TXT_COMMAND_ROUTE_CREATED = exports.TXT_COMMAND_DISTRO_CREATED = exports.ERR_COMMAND_SCOPE_NO_PROJECT = exports.OPT_COMMAND_DISTRO_NAME = exports.OPT_COMMAND_ROUTE_TARGET = exports.OPT_COMMAND_ROUTE_PATH = exports.OPT_COMMAND_ROUTE_DOMAIN = exports.OPT_COMMAND_ROUTE_SUBDOMAIN = exports.OPT_COMMAND_ROUTE_TYPE = exports.OPT_COMMAND_ROUTE_ID = void 0;
18
18
  exports.EXAMPLE_ROUTE_UPDATE = exports.EXAMPLE_ROUTE_DELETE = exports.EXAMPLE_DISTRO_DELETE = exports.EXAMPLE_DISTRO_LIST = exports.EXAMPLE_SANDBOX_CP = exports.ERR_PROJECT_NO_PROJECTS = exports.TXT_LOGIN_SELECT_PROJECT = exports.TXT_COMMAND_PROJECT_CREATED = exports.TXT_COMMAND_PROJECT_LINK_NOT_FOUND = exports.TXT_COMMAND_PROJECT_LINK_NAME = exports.TXT_COMMAND_PROJECT_LINK_SELECT_PROJECT = exports.TXT_COMMAND_PROJECT_LINK_TO = exports.TXT_COMMAND_PROJECT_LINK_EXISTING_DESC = exports.TXT_COMMAND_PROJECT_LINK_EXISTING = exports.TXT_COMMAND_PROJECT_LINK_CREATE_NEW_DESC = exports.TXT_COMMAND_PROJECT_LINK_CREATE_NEW = exports.ERR_COMMAND_PROJECT_LINK_DIR_NOT_DIR = exports.TXT_COMMAND_PROJECT_LINK_GIT_REPO_INITIALIZED = exports.TXT_COMMAND_PROJECT_LINK_GIT_REPO = exports.TXT_COMMAND_PROJECT_LINK_DIR_CONFIRM = exports.TXT_COMMAND_PROJECT_LINK_DIR_LINKED = exports.ERR_COMMAND_PROJECT_LINK_DIR_CREATE = exports.OPT_COMMAND_PROJECT_LINK_TRY_NOW = exports.OPT_COMMAND_PROJECT_LINK_SET_GIT_REMOTE = exports.OPT_COMMAND_PROJECT_LINK_HAS_REMOTE = exports.OPT_COMMAND_PROJECT_LINK_DIRECTORY = exports.OPT_COMMAND_PROJECT_LINK_GIT = exports.OPT_COMMAND_PROJECT_LINK_RELINK = exports.DESC_COMMAND_PROJECT_LINK = exports.DESC_COMMAND_PROJECT_LIST = exports.DESC_COMMAND_PROJECT_GIT = exports.DESC_COMMAND_PROJECT_GIT_CREDENTIAL = exports.DESC_COMMAND_PROJECT = exports.TXT_ARTIFACT_VERSION_DOWNLOAD = exports.TXT_ARTIFACT_PUBLISH = exports.TXT_ARTIFACT_CREATED = exports.TXT_ARTIFACT_VERSION_DELETED = exports.TXT_ARTIFACT_DELETED = exports.ERR_COMMAND_ARTIFACT_TYPE = exports.OPT_COMMAND_ARTIFACT_VERSION = exports.OPT_COMMAND_ARTIFACT_IDENTIFIER = exports.OPT_COMMAND_ARTIFACT_CREATE_IDENTIFIER = exports.OPT_COMMAND_ARTIFACT_NAME = exports.OPT_COMMAND_ARTIFACT_TYPE = exports.DESC_COMMAND_ARTIFACT_CREATE = exports.DESC_COMMAND_ARTIFACT_GET = exports.TXT_ARTIFACT_DOCKER_LOGIN_FAILED = exports.TXT_ARTIFACT_DOCKER_LOGIN_SUCCESS = exports.TXT_ARTIFACT_VERSION_DELETE_CONFIRM = exports.TXT_ARTIFACT_DELETE_CONFIRM = void 0;
19
19
  exports.EXAMPLE_ARTIFACT_CREATE = exports.EXAMPLE_ARTIFACT_DELETE = exports.EXAMPLE_ARTIFACT_DOWNLOAD = exports.EXAMPLE_ARTIFACT_PUBLISH = exports.EXAMPLE_PIPELINE_RUN_RETRY = exports.EXAMPLE_PIPELINE_RUN_LIST = exports.EXAMPLE_PIPELINE_LIST = exports.EXAMPLE_PIPELINE_YML = exports.EXAMPLE_PIPELINE_GET = exports.EXAMPLE_PIPELINE_UPDATE = exports.EXAMPLE_PIPELINE_DELETE = exports.EXAMPLE_PIPELINE_CREATE = exports.EXAMPLE_PIPELINE_RUN_CANCEL = exports.EXAMPLE_PIPELINE_RUN_APPLY = exports.EXAMPLE_PIPELINE_RUN_LOGS = exports.EXAMPLE_PIPELINE_RUN_JSONL = exports.EXAMPLE_PIPELINE_RUN_STATUS = exports.EXAMPLE_PIPELINE_RUN_START = exports.EXAMPLE_SANDBOX_ENDPOINT_LIST = exports.EXAMPLE_SANDBOX_ENDPOINT_GET = exports.EXAMPLE_SANDBOX_ENDPOINT_DELETE = exports.EXAMPLE_SANDBOX_ENDPOINT_CREATE = exports.EXAMPLE_SANDBOX_SNAPSHOT_LIST = exports.EXAMPLE_SANDBOX_SNAPSHOT_GET = exports.EXAMPLE_SANDBOX_SNAPSHOT_DELETE = exports.EXAMPLE_SANDBOX_SNAPSHOT_CREATE = exports.EXAMPLE_SANDBOX_EXEC_STATUS = exports.EXAMPLE_SANDBOX_EXEC_LOGS = exports.EXAMPLE_SANDBOX_APP_STATUS = exports.EXAMPLE_SANDBOX_APP_STOP = exports.EXAMPLE_SANDBOX_APP_REMOVE = exports.EXAMPLE_SANDBOX_APP_ADD = exports.EXAMPLE_SANDBOX_APP_START = exports.EXAMPLE_SANDBOX_APP_LOGS = exports.EXAMPLE_SANDBOX_EXEC_LIST = exports.EXAMPLE_SANDBOX_APP_LIST = exports.EXAMPLE_SANDBOX_EXEC_KILL = exports.EXAMPLE_SANDBOX_EXEC_COMMAND = exports.EXAMPLE_TUNNEL_START = exports.EXAMPLE_TUNNEL_TCP = exports.EXAMPLE_TUNNEL_TLS = exports.EXAMPLE_AGENT_TUNNEL_START = exports.EXAMPLE_AGENT_TUNNEL_STATUS = exports.EXAMPLE_AGENT_TUNNEL_REMOVE = exports.EXAMPLE_AGENT_TUNNEL_LIST = exports.EXAMPLE_TUNNEL_HTTP = exports.EXAMPLE_SANDBOX_CREATE = exports.EXAMPLE_DISTRO_CREATE = exports.EXAMPLE_ROUTE_CREATE = exports.EXAMPLE_ROUTE_LIST = void 0;
20
20
  exports.EXAMPLE_CRAWL_LINK = exports.EXAMPLE_CRAWL_RUN = exports.EXAMPLE_TESTS_CAPTURE = exports.EXAMPLE_TESTS_VISUAL_SESSION_CLOSE = exports.EXAMPLE_TESTS_VISUAL_SESSION_CREATE = exports.EXAMPLE_TESTS_VISUAL_LINK = exports.EXAMPLE_TESTS_VISUAL_UPLOAD = exports.EXAMPLE_TESTS_VISUAL_SETUP = exports.EXAMPLE_TESTS_UNIT_LINK = exports.EXAMPLE_TESTS_UNIT_UPLOAD = exports.EXAMPLE_ARTIFACT_VERSION_DELETE = exports.EXAMPLE_ARTIFACT_VERSION_GET = exports.EXAMPLE_ARTIFACT_VERSION_LIST = void 0;
@@ -896,7 +896,7 @@ exports.DESC_COMMAND_ROUTE_LIST = 'List routes. Required scopes: DISTRIBUTION_IN
896
896
  exports.DESC_COMMAND_ROUTE_DELETE = 'Delete route. Required scopes: DISTRIBUTION_MANAGE';
897
897
  exports.DESC_COMMAND_ROUTE_UPDATE = 'Update route. Required scopes: DISTRIBUTION_MANAGE';
898
898
  exports.DESC_COMMAND_ROUTE = 'Manage distribution routes';
899
- exports.OPT_COMMAND_DISTRO_SCOPE = 'Force distribution scope (WORKSPACE, PROJECT). By default calculated by provided options and environmental variables';
899
+ exports.OPT_COMMAND_SCOPE = 'Force scope (WORKSPACE, PROJECT). By default calculated by provided options and environmental variables (--project, BUDDY_PROJECT, linked project)';
900
900
  exports.OPT_COMMAND_DISTRO_IDENTIFIER = 'Human-readable ID of the distribution';
901
901
  exports.OPT_COMMAND_ROUTE_ID = 'ID of the route (find via "bdy distro route ls")';
902
902
  exports.OPT_COMMAND_ROUTE_TYPE = 'Type of the route. Allowed: PROXY, PROXY_NO_CACHE, REDIRECT, CLOAKING';
@@ -912,7 +912,7 @@ For sandbox target use sandbox (required), region (optional)
912
912
  Region can be Default, NorthAmerica, Europe, Asia, Oceania, SouthAmerica, Africa, Antarctica or two letter country name
913
913
  If no region is specified or default is used, the target is used as the fallback for all locations. Default region is mandatory`;
914
914
  exports.OPT_COMMAND_DISTRO_NAME = 'Name of the distribution';
915
- exports.ERR_COMMAND_DISTRO_NO_PROJECT = 'Project must be provided for PROJECT scope';
915
+ exports.ERR_COMMAND_SCOPE_NO_PROJECT = 'Project must be provided for PROJECT scope';
916
916
  exports.TXT_COMMAND_DISTRO_CREATED = 'Distribution created';
917
917
  exports.TXT_COMMAND_ROUTE_CREATED = 'Route created';
918
918
  const TXT_ROUTE_SERVE = (target) => `Serve it from your own domain (CDN):
@@ -920,7 +920,7 @@ const TXT_ROUTE_SERVE = (target) => `Serve it from your own domain (CDN):
920
920
  Need a zone or distribution? See \`bdy domain buy\` and \`bdy distro create\``;
921
921
  exports.TXT_ROUTE_SERVE = TXT_ROUTE_SERVE;
922
922
  exports.TXT_COMMAND_ROUTE_UPDATED = 'Route updated';
923
- exports.ERR_COMMAND_DISTRO_SCOPE = 'Wrong scope. Allowed: WORKSPACE, PROJECT';
923
+ exports.ERR_COMMAND_SCOPE = 'Wrong scope. Allowed: WORKSPACE, PROJECT';
924
924
  exports.ERR_COMMAND_DISTRO_NOT_FOUND = 'Distribution not found';
925
925
  exports.ERR_COMMAND_ROUTE_NO_UPDATE = 'Nothing to update';
926
926
  const TXT_COMMAND_DISTRO_DELETE_CONFIRM = (name) => `Are you sure you want to delete distribution '${name}'?`;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ROUTE_REGION = exports.ROUTE_TARGET_TYPE = exports.ROUTE_TYPE = exports.DISTRO_SCOPE = void 0;
4
- var DISTRO_SCOPE;
5
- (function (DISTRO_SCOPE) {
6
- DISTRO_SCOPE["WORKSPACE"] = "WORKSPACE";
7
- DISTRO_SCOPE["PROJECT"] = "PROJECT";
8
- })(DISTRO_SCOPE || (exports.DISTRO_SCOPE = DISTRO_SCOPE = {}));
3
+ exports.ROUTE_REGION = exports.ROUTE_TARGET_TYPE = exports.ROUTE_TYPE = exports.SCOPE = void 0;
4
+ var SCOPE;
5
+ (function (SCOPE) {
6
+ SCOPE["WORKSPACE"] = "WORKSPACE";
7
+ SCOPE["PROJECT"] = "PROJECT";
8
+ })(SCOPE || (exports.SCOPE = SCOPE = {}));
9
9
  var ROUTE_TYPE;
10
10
  (function (ROUTE_TYPE) {
11
11
  ROUTE_TYPE["PROXY"] = "PROXY";
@@ -36,8 +36,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.isInstalledByChoco = exports.isInstalledByApt = exports.isInstalledByBrew = exports.isInstalledByNpm = exports.tryGetEmail = exports.execLocally = exports.getHomeDirectory = exports.isDomainAvailable = exports.newCommand = exports.formatBytes = exports.formatHelp = exports.getPlatform = exports.getHostname = exports.isStringRegExp = exports.getWorkingDir = exports.getRootDir = exports.TARGET_ONLY_PORT_REGEX = exports.TARGET_HTTP_REGEX = exports.TARGET_TCP_TLS_REGEX = exports.ApiErrorTunnelsDisabled = exports.ApiErrorWorkspaceFlagged = exports.ApiErrorTunnelLimitReached = exports.ApiErrorAgentLimitReached = exports.ApiErrorDomainRestricted = exports.ApiErrorTargetInvalid = exports.ApiErrorWrongToken = exports.ApiErrorFailedToConnect = exports.ApiErrorAgentNotFound = exports.ARTIFACT_AUTH_TYPE = exports.ARTIFACT_SCOPE = exports.ARTIFACT_TYPE = exports.SANDBOX_SNAPSHOT_STATUS = exports.SANDBOX_APP_STATUS = exports.SANDBOX_SETUP_STATUS = exports.SANDBOX_EXEC_STATUS = exports.SANDBOX_EXEC_RUNTIME = exports.SANDBOX_STATUS = exports.REST_API_ENDPOINT = exports.REST_API_REGION = exports.DEFAULT_SANDBOX_CP_USER = exports.ARTIFACT_DEFAULT_VERSION = exports.SUGGESTED_BROWSER_VERSION = exports.DEFAULT_TIMEOUT = exports.TUNNEL_HTTP_CB_MIN_REQUESTS = exports.TUNNEL_HTTP_CB_WINDOW = exports.TUNNEL_MAX_REQUEST_SIZE_TO_SYNC = exports.TUNNEL_HTTP_LOG_MAX_REQUESTS = exports.TUNNEL_HTTP_LOG_MAX_BODY = exports.TUNNEL_HTTP_RATE_WINDOW = exports.TUNNEL_HTTP_RATE_LIMIT = void 0;
40
- exports.getGitName = exports.getGitEmail = exports.getBasicCommandTls = exports.getBasicCommandHttp = exports.getBasicCommandSandboxEndpoint = exports.getBasicCommandTcp = exports.getCurrentUser = exports.getServiceUser = exports.getRealTargetHost = exports.isWindows = exports.isLinux = exports.isOsx = exports.isDocker = exports.sleep = exports.getLatestVersion = exports.getVersionEnv = exports.getCurrentVersionWithoutEnv = exports.getVersionWithoutEnv = exports.getVersion = void 0;
39
+ exports.getVersion = exports.isInstalledByChoco = exports.isInstalledByApt = exports.isInstalledByBrew = exports.isInstalledByNpm = exports.tryGetEmail = exports.execLocally = exports.getHomeDirectory = exports.isDomainAvailable = exports.newCommand = exports.formatBytes = exports.formatHelp = exports.getPlatform = exports.getHostname = exports.isStringRegExp = exports.getWorkingDir = exports.getRootDir = exports.TARGET_ONLY_PORT_REGEX = exports.TARGET_HTTP_REGEX = exports.TARGET_TCP_TLS_REGEX = exports.ApiErrorTunnelsDisabled = exports.ApiErrorWorkspaceFlagged = exports.ApiErrorTunnelLimitReached = exports.ApiErrorAgentLimitReached = exports.ApiErrorDomainRestricted = exports.ApiErrorTargetInvalid = exports.ApiErrorWrongToken = exports.ApiErrorFailedToConnect = exports.ApiErrorAgentNotFound = exports.ARTIFACT_AUTH_TYPE = exports.ARTIFACT_TYPE = exports.SANDBOX_SNAPSHOT_STATUS = exports.SANDBOX_APP_STATUS = exports.SANDBOX_SETUP_STATUS = exports.SANDBOX_EXEC_STATUS = exports.SANDBOX_EXEC_RUNTIME = exports.SANDBOX_STATUS = exports.REST_API_ENDPOINT = exports.REST_API_REGION = exports.DEFAULT_SANDBOX_CP_USER = exports.ARTIFACT_DEFAULT_VERSION = exports.SUGGESTED_BROWSER_VERSION = exports.DEFAULT_TIMEOUT = exports.TUNNEL_HTTP_CB_MIN_REQUESTS = exports.TUNNEL_HTTP_CB_WINDOW = exports.TUNNEL_MAX_REQUEST_SIZE_TO_SYNC = exports.TUNNEL_HTTP_LOG_MAX_REQUESTS = exports.TUNNEL_HTTP_LOG_MAX_BODY = exports.TUNNEL_HTTP_RATE_WINDOW = exports.TUNNEL_HTTP_RATE_LIMIT = void 0;
40
+ exports.getGitName = exports.getGitEmail = exports.getBasicCommandTls = exports.getBasicCommandHttp = exports.getBasicCommandSandboxEndpoint = exports.getBasicCommandTcp = exports.getCurrentUser = exports.getServiceUser = exports.getRealTargetHost = exports.isWindows = exports.isLinux = exports.isOsx = exports.isDocker = exports.sleep = exports.getLatestVersion = exports.getVersionEnv = exports.getCurrentVersionWithoutEnv = exports.getVersionWithoutEnv = void 0;
41
41
  exports.apiErrorCodeToClass = apiErrorCodeToClass;
42
42
  exports.isFile = isFile;
43
43
  exports.getAppWorkspaceUrl = getAppWorkspaceUrl;
@@ -135,12 +135,6 @@ var ARTIFACT_TYPE;
135
135
  ARTIFACT_TYPE["BUCKET"] = "BUCKET";
136
136
  ARTIFACT_TYPE["CONTAINER"] = "CONTAINER";
137
137
  })(ARTIFACT_TYPE || (exports.ARTIFACT_TYPE = ARTIFACT_TYPE = {}));
138
- var ARTIFACT_SCOPE;
139
- (function (ARTIFACT_SCOPE) {
140
- ARTIFACT_SCOPE["WORKSPACE"] = "WORKSPACE";
141
- ARTIFACT_SCOPE["PROJECT"] = "PROJECT";
142
- ARTIFACT_SCOPE["ENVIRONMENT"] = "ENVIRONMENT";
143
- })(ARTIFACT_SCOPE || (exports.ARTIFACT_SCOPE = ARTIFACT_SCOPE = {}));
144
138
  var ARTIFACT_AUTH_TYPE;
145
139
  (function (ARTIFACT_AUTH_TYPE) {
146
140
  ARTIFACT_AUTH_TYPE["NONE"] = "NONE";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bdy",
3
3
  "preferGlobal": false,
4
- "version": "1.22.58",
4
+ "version": "1.22.59-dev",
5
5
  "type": "commonjs",
6
6
  "license": "MIT",
7
7
  "scripts": {