@kryshtop/bstack 1.0.0

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 (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +324 -0
  3. package/dist/api/http/BrowserStackHttpClient.d.ts +30 -0
  4. package/dist/api/http/BrowserStackHttpClient.js +111 -0
  5. package/dist/api/http/BrowserStackHttpClient.js.map +1 -0
  6. package/dist/api/http/errors.d.ts +11 -0
  7. package/dist/api/http/errors.js +31 -0
  8. package/dist/api/http/errors.js.map +1 -0
  9. package/dist/api/http/multipart.d.ts +13 -0
  10. package/dist/api/http/multipart.js +28 -0
  11. package/dist/api/http/multipart.js.map +1 -0
  12. package/dist/api/normalizers/common.d.ts +7 -0
  13. package/dist/api/normalizers/common.js +106 -0
  14. package/dist/api/normalizers/common.js.map +1 -0
  15. package/dist/api/registry/EndpointRegistry.d.ts +10 -0
  16. package/dist/api/registry/EndpointRegistry.js +34 -0
  17. package/dist/api/registry/EndpointRegistry.js.map +1 -0
  18. package/dist/api/registry/definitions.d.ts +2 -0
  19. package/dist/api/registry/definitions.js +510 -0
  20. package/dist/api/registry/definitions.js.map +1 -0
  21. package/dist/api/registry/types.d.ts +23 -0
  22. package/dist/api/registry/types.js +2 -0
  23. package/dist/api/registry/types.js.map +1 -0
  24. package/dist/auth/AuthService.d.ts +24 -0
  25. package/dist/auth/AuthService.js +100 -0
  26. package/dist/auth/AuthService.js.map +1 -0
  27. package/dist/bin.d.ts +2 -0
  28. package/dist/bin.js +4 -0
  29. package/dist/bin.js.map +1 -0
  30. package/dist/cli/context.d.ts +39 -0
  31. package/dist/cli/context.js +117 -0
  32. package/dist/cli/context.js.map +1 -0
  33. package/dist/cli/output.d.ts +29 -0
  34. package/dist/cli/output.js +143 -0
  35. package/dist/cli/output.js.map +1 -0
  36. package/dist/cli/program.d.ts +4 -0
  37. package/dist/cli/program.js +60 -0
  38. package/dist/cli/program.js.map +1 -0
  39. package/dist/cli/runCli.d.ts +1 -0
  40. package/dist/cli/runCli.js +31 -0
  41. package/dist/cli/runCli.js.map +1 -0
  42. package/dist/commands/auth.d.ts +3 -0
  43. package/dist/commands/auth.js +73 -0
  44. package/dist/commands/auth.js.map +1 -0
  45. package/dist/commands/explorer.d.ts +3 -0
  46. package/dist/commands/explorer.js +86 -0
  47. package/dist/commands/explorer.js.map +1 -0
  48. package/dist/commands/framework.d.ts +3 -0
  49. package/dist/commands/framework.js +474 -0
  50. package/dist/commands/framework.js.map +1 -0
  51. package/dist/config/paths.d.ts +5 -0
  52. package/dist/config/paths.js +22 -0
  53. package/dist/config/paths.js.map +1 -0
  54. package/dist/index.d.ts +18 -0
  55. package/dist/index.js +16 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/menus/interactiveMenu.d.ts +2 -0
  58. package/dist/menus/interactiveMenu.js +1106 -0
  59. package/dist/menus/interactiveMenu.js.map +1 -0
  60. package/dist/menus/screenModel.d.ts +12 -0
  61. package/dist/menus/screenModel.js +152 -0
  62. package/dist/menus/screenModel.js.map +1 -0
  63. package/dist/prompts/authPrompts.d.ts +10 -0
  64. package/dist/prompts/authPrompts.js +46 -0
  65. package/dist/prompts/authPrompts.js.map +1 -0
  66. package/dist/services/ResourceService.d.ts +25 -0
  67. package/dist/services/ResourceService.js +80 -0
  68. package/dist/services/ResourceService.js.map +1 -0
  69. package/dist/services/frameworkConfigs.d.ts +16 -0
  70. package/dist/services/frameworkConfigs.js +108 -0
  71. package/dist/services/frameworkConfigs.js.map +1 -0
  72. package/dist/storage/CredentialStore.d.ts +11 -0
  73. package/dist/storage/CredentialStore.js +2 -0
  74. package/dist/storage/CredentialStore.js.map +1 -0
  75. package/dist/storage/FileCredentialStores.d.ts +18 -0
  76. package/dist/storage/FileCredentialStores.js +74 -0
  77. package/dist/storage/FileCredentialStores.js.map +1 -0
  78. package/dist/storage/FileStorage.d.ts +3 -0
  79. package/dist/storage/FileStorage.js +18 -0
  80. package/dist/storage/FileStorage.js.map +1 -0
  81. package/dist/storage/KeytarCredentialStore.d.ts +9 -0
  82. package/dist/storage/KeytarCredentialStore.js +40 -0
  83. package/dist/storage/KeytarCredentialStore.js.map +1 -0
  84. package/dist/storage/SessionRepository.d.ts +28 -0
  85. package/dist/storage/SessionRepository.js +151 -0
  86. package/dist/storage/SessionRepository.js.map +1 -0
  87. package/dist/types/domain.d.ts +85 -0
  88. package/dist/types/domain.js +2 -0
  89. package/dist/types/domain.js.map +1 -0
  90. package/dist/utils/constants.d.ts +10 -0
  91. package/dist/utils/constants.js +11 -0
  92. package/dist/utils/constants.js.map +1 -0
  93. package/dist/utils/errors.d.ts +2 -0
  94. package/dist/utils/errors.js +12 -0
  95. package/dist/utils/errors.js.map +1 -0
  96. package/dist/utils/files.d.ts +4 -0
  97. package/dist/utils/files.js +28 -0
  98. package/dist/utils/files.js.map +1 -0
  99. package/dist/utils/json.d.ts +2 -0
  100. package/dist/utils/json.js +10 -0
  101. package/dist/utils/json.js.map +1 -0
  102. package/dist/utils/mask.d.ts +2 -0
  103. package/dist/utils/mask.js +10 -0
  104. package/dist/utils/mask.js.map +1 -0
  105. package/dist/utils/query.d.ts +1 -0
  106. package/dist/utils/query.js +17 -0
  107. package/dist/utils/query.js.map +1 -0
  108. package/package.json +92 -0
@@ -0,0 +1,31 @@
1
+ import { asError } from '../utils/errors.js';
2
+ import { CommandRuntime } from './context.js';
3
+ import { createProgram } from './program.js';
4
+ export async function runCli(argv = process.argv) {
5
+ const { config } = await import('dotenv');
6
+ config({ quiet: true });
7
+ const runtime = new CommandRuntime({
8
+ json: argv.includes('--json'),
9
+ debugHttp: argv.includes('--debug-http'),
10
+ verbose: argv.includes('--verbose'),
11
+ allowPlainStorage: argv.includes('--allow-plain-storage'),
12
+ masterKey: getOptionValue(argv, '--master-key'),
13
+ baseUrl: getOptionValue(argv, '--base-url'),
14
+ });
15
+ const program = createProgram(runtime);
16
+ try {
17
+ await program.parseAsync(argv);
18
+ }
19
+ catch (error) {
20
+ runtime.output.error(asError(error).message);
21
+ process.exitCode = 1;
22
+ }
23
+ }
24
+ function getOptionValue(argv, flag) {
25
+ const index = argv.indexOf(flag);
26
+ if (index === -1) {
27
+ return undefined;
28
+ }
29
+ return argv[index + 1];
30
+ }
31
+ //# sourceMappingURL=runCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runCli.js","sourceRoot":"","sources":["../../src/cli/runCli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAExB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC;QACjC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;QACxC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QACnC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACzD,SAAS,EAAE,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC;QAC/C,OAAO,EAAE,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC;KAC5C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAc,EAAE,IAAY;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ import type { CommandRuntime } from '../cli/context.js';
3
+ export declare function createAuthCommands(runtime: CommandRuntime): Command;
@@ -0,0 +1,73 @@
1
+ import { Command } from 'commander';
2
+ import { promptForLogin } from '../prompts/authPrompts.js';
3
+ export function createAuthCommands(runtime) {
4
+ const auth = new Command('auth').description('Authentication and session management');
5
+ auth
6
+ .command('login')
7
+ .description('Login with BrowserStack username and access key')
8
+ .option('-u, --username <username>', 'BrowserStack username')
9
+ .option('-k, --access-key <accessKey>', 'BrowserStack access key')
10
+ .option('--storage <strategy>', 'Storage strategy: auto, keychain, encrypted-file, plain-file', 'auto')
11
+ .option('--master-key <masterKey>', 'Master key for encrypted-file storage')
12
+ .option('--allow-plain-storage', 'Allow plain-text session storage')
13
+ .action(async (options) => {
14
+ const prompted = !options.username || !options.accessKey ? await promptForLogin() : undefined;
15
+ const spinner = runtime.spinner('Validating BrowserStack credentials');
16
+ try {
17
+ const status = await runtime.auth.login({
18
+ username: options.username ?? prompted?.username,
19
+ accessKey: options.accessKey ?? prompted?.accessKey,
20
+ storageStrategy: options.storage ?? prompted?.storageStrategy ?? 'auto',
21
+ masterKey: options.masterKey ?? runtime.options.masterKey ?? prompted?.masterKey,
22
+ allowPlainText: Boolean(options.allowPlainStorage) ||
23
+ runtime.options.allowPlainStorage === true ||
24
+ prompted?.allowPlainText === true,
25
+ });
26
+ spinner.succeed('Credentials validated and saved');
27
+ runtime.output.emit(status);
28
+ }
29
+ catch (error) {
30
+ spinner.fail(error instanceof Error ? error.message : String(error));
31
+ throw error;
32
+ }
33
+ });
34
+ auth
35
+ .command('logout')
36
+ .description('Clear the saved BrowserStack session')
37
+ .action(async () => {
38
+ await runtime.auth.logout();
39
+ runtime.output.success('Saved session removed.');
40
+ });
41
+ auth
42
+ .command('status')
43
+ .description('Show saved session status')
44
+ .action(async () => {
45
+ const status = await runtime.auth.status();
46
+ runtime.output.emit(status);
47
+ });
48
+ auth
49
+ .command('validate')
50
+ .description('Validate the saved credentials against BrowserStack')
51
+ .action(async () => {
52
+ const session = await runtime.requireSession();
53
+ const status = await runtime.auth.validate(session);
54
+ await runtime.saveLastResponse({
55
+ command: 'auth validate',
56
+ framework: 'auth',
57
+ resource: 'auth',
58
+ operation: 'validate',
59
+ payload: status,
60
+ });
61
+ runtime.output.emit(status);
62
+ });
63
+ auth
64
+ .command('whoami')
65
+ .description('Alias for auth validate')
66
+ .action(async () => {
67
+ const session = await runtime.requireSession();
68
+ const status = await runtime.auth.validate(session);
69
+ runtime.output.emit(status);
70
+ });
71
+ return auth;
72
+ }
73
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ import type { CommandRuntime } from '../cli/context.js';
3
+ export declare function createExplorerCommand(runtime: CommandRuntime): Command;
@@ -0,0 +1,86 @@
1
+ import { select, input } from '@inquirer/prompts';
2
+ import { Command } from 'commander';
3
+ export function createExplorerCommand(runtime) {
4
+ return new Command('explorer')
5
+ .description('Interactive raw endpoint explorer backed by the endpoint registry')
6
+ .action(async () => {
7
+ const service = await runtime.getResourceService();
8
+ const registry = service.getRegistry();
9
+ const definitions = registry.list().filter((definition) => definition.framework !== 'auth');
10
+ const framework = await select({
11
+ message: 'Framework',
12
+ choices: unique(definitions.map((definition) => definition.framework)).map((value) => ({
13
+ name: value,
14
+ value,
15
+ })),
16
+ });
17
+ const resource = await select({
18
+ message: 'Resource',
19
+ choices: unique(definitions
20
+ .filter((definition) => definition.framework === framework)
21
+ .map((definition) => definition.resource)).map((value) => ({ name: value, value })),
22
+ });
23
+ const operation = await select({
24
+ message: 'Operation',
25
+ choices: definitions
26
+ .filter((definition) => definition.framework === framework && definition.resource === resource)
27
+ .map((definition) => ({
28
+ name: `${definition.operation} (${definition.method} ${definition.pathTemplate})`,
29
+ value: definition.operation,
30
+ })),
31
+ });
32
+ const definition = registry.find(framework, resource, operation);
33
+ const pathParams = Object.fromEntries(await Promise.all((definition.pathParams ?? []).map(async (param) => [
34
+ param,
35
+ await input({ message: `Path param ${param}` }),
36
+ ])));
37
+ const query = Object.fromEntries(await Promise.all((definition.queryParams ?? []).map(async (param) => [
38
+ param,
39
+ await input({ message: `Query param ${param} (optional)` }),
40
+ ])));
41
+ let body;
42
+ let filePath;
43
+ let url;
44
+ if (definition.requestKind === 'json' && ['run', 'update-status'].includes(operation)) {
45
+ const raw = await input({ message: 'JSON body', default: '{}' });
46
+ body = JSON.parse(raw);
47
+ }
48
+ if (definition.requestKind === 'multipart') {
49
+ const source = await select({
50
+ message: 'Upload source',
51
+ choices: [
52
+ { name: 'Local file', value: 'file' },
53
+ { name: 'Public URL', value: 'url' },
54
+ ],
55
+ });
56
+ if (source === 'file') {
57
+ filePath = await input({ message: 'File path' });
58
+ }
59
+ else {
60
+ url = await input({ message: 'Public URL' });
61
+ }
62
+ }
63
+ const response = await service.execute({
64
+ framework,
65
+ resource,
66
+ operation,
67
+ pathParams,
68
+ query,
69
+ body,
70
+ filePath,
71
+ url,
72
+ });
73
+ await runtime.saveLastResponse({
74
+ command: 'explorer',
75
+ framework,
76
+ resource,
77
+ operation,
78
+ payload: response,
79
+ });
80
+ runtime.output.emit(response);
81
+ });
82
+ }
83
+ function unique(items) {
84
+ return [...new Set(items)];
85
+ }
86
+ //# sourceMappingURL=explorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explorer.js","sourceRoot":"","sources":["../../src/commands/explorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ import type { CommandRuntime } from '../cli/context.js';
3
+ export declare function createFrameworkCommands(runtime: CommandRuntime): Command[];