@datacamp/learn-vm-scripts 0.0.1-rc.1 → 0.0.1-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -31,16 +31,28 @@ The `.env.development` file should be updated with the values of your local Chro
31
31
 
32
32
  ## Usage
33
33
 
34
- The CLI tool accepts the following arguments:
34
+ This project contains a program that logs in to a cloud provider using Puppeteer.
35
35
 
36
- - `--url`: The URL of the service to log in to.
37
- - `--username`: The username for login.
38
- - `--password`: The password for login.
36
+ To build:
39
37
 
40
- ### Example
38
+ ```sh
39
+ yarn build
40
+ ```
41
41
 
42
- To log in to AWS:
42
+ To start the file watcher:
43
43
 
44
44
  ```sh
45
- yarn cli -- --url "http://example.aws.amazon.com" --username "yourUsername" --password "yourPassword"
45
+ yarn cli -- --inputFile <path-to-input-file> --outputFile <path-to-output-file>
46
46
  ```
47
+
48
+ The program watches the input file for changes.
49
+ To log in to a cloud provider, write the following JSON object to the input file:
50
+
51
+ ```json
52
+ { "url": "<url-to-login-page>", "username": "<your-username>", "password": "<your-password>", "cloudProvider": "<cloud-provider>"}
53
+ ```
54
+
55
+ ❗️The input has to be written to a single line.
56
+ Each line is parsed individually.
57
+
58
+ When the login process is complete, the program writes a line to the output file.
package/dist/awsLogin.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
2
  import ora from 'ora';
3
- import { ensureHttps } from './utils.js';
3
+ import { ensureHttps } from './utils';
4
4
  export async function loginToAWS({ url, username, page, password, }) {
5
5
  const spinner = ora('Launching browser...').start();
6
6
  spinner.succeed('Browser launched');
@@ -1 +1 @@
1
- {"version":3,"file":"awsLogin.js","sourceRoot":"","sources":["../src/awsLogin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAC/B,GAAG,EACH,QAAQ,EACR,IAAI,EACJ,QAAQ,GAMT;IACC,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IACpD,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEpC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjD,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAElC,MAAM,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;IACrD,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;IAEpD,MAAM,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;IACrD,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;IAEpD,MAAM,IAAI,CAAC,eAAe,CAAC,uCAAuC,CAAC,CAAC;IACpE,MAAM,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAE1D,MAAM,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC;IACpD,MAAM,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"awsLogin.js","sourceRoot":"","sources":["../src/awsLogin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAC/B,GAAG,EACH,QAAQ,EACR,IAAI,EACJ,QAAQ,GAMT;IACC,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IACpD,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEpC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjD,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAElC,MAAM,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;IACrD,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;IAEpD,MAAM,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;IACrD,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;IAEpD,MAAM,IAAI,CAAC,eAAe,CAAC,uCAAuC,CAAC,CAAC;IACpE,MAAM,IAAI,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAE1D,MAAM,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC;IACpD,MAAM,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;AAChE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
2
  import ora from 'ora';
3
- import { AZURE_LOGIN_URL, ensureHttps } from './utils.js';
3
+ import { AZURE_LOGIN_URL, ensureHttps } from './utils';
4
4
  export async function loginToAzure({ url, username, page, password, }) {
5
5
  const spinner = ora('Launching browser...').start();
6
6
  spinner.succeed('Browser launched');
@@ -1 +1 @@
1
- {"version":3,"file":"azureLogin.js","sourceRoot":"","sources":["../src/azureLogin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG1D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EACjC,GAAG,EACH,QAAQ,EACR,IAAI,EACJ,QAAQ,GAMT;IACC,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IACpD,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEpC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACnD,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC;IAErD,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACnC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAE/B,MAAM,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAChD,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAEpC,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAEtC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC5B,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,eAAe,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEnC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAE/B,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAEpC,yCAAyC;IACzC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEnC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/B,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC/B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"azureLogin.js","sourceRoot":"","sources":["../src/azureLogin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EACjC,GAAG,EACH,QAAQ,EACR,IAAI,EACJ,QAAQ,GAMT;IACC,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IACpD,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEpC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACnD,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC;IAErD,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACnC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAE/B,MAAM,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;IAChD,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAEpC,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAEtC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC5B,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,eAAe,CAAC,wBAAwB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,MAAM,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEnC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAE/B,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAEpC,yCAAyC;IACzC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEnC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/B,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC/B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,89 @@
1
+ import yargs from 'yargs';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as readline from 'node:readline';
4
+ import * as z from 'zod';
5
+ import { setupBrowser } from './setup.js';
6
+ import { loginToAzure } from './azureLogin.js';
7
+ import chalk from 'chalk';
8
+ import { loginToAWS } from './awsLogin.js';
9
+ import { loginToDatabricks } from './databricksLogin.js';
10
+ const argv = yargs(process.argv.slice(2))
11
+ .options({
12
+ inputFilePath: { demandOption: true, type: 'string' },
13
+ outputFilePath: { demandOption: true, type: 'string' },
14
+ })
15
+ .parseSync();
16
+ const Input = z.object({
17
+ cloudProvider: z.enum(['aws', 'azure', 'databricks']),
18
+ password: z.string(),
19
+ url: z.string(),
20
+ username: z.string(),
21
+ });
22
+ const handleInput = async (line) => {
23
+ try {
24
+ console.log('DEBUG line: ', line);
25
+ const { cloudProvider, url, password, username } = Input.parse(JSON.parse(line));
26
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
27
+ const { browser, page } = await setupBrowser();
28
+ switch (cloudProvider) {
29
+ case 'azure':
30
+ await loginToAzure({ url, username, page, password });
31
+ break;
32
+ case 'aws':
33
+ if (!url) {
34
+ console.error(chalk.red('AWS URL is required'));
35
+ process.exit(1);
36
+ }
37
+ await loginToAWS({ url, username, page, password });
38
+ break;
39
+ case 'databricks':
40
+ if (!url) {
41
+ console.error(chalk.red('Databricks URL is required'));
42
+ process.exit(1);
43
+ }
44
+ await loginToAzure({
45
+ url: undefined,
46
+ username,
47
+ page,
48
+ password,
49
+ });
50
+ await loginToDatabricks({ url, page });
51
+ break;
52
+ default:
53
+ console.error(chalk.red('Unsupported cloud provider'));
54
+ }
55
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
+ }
57
+ catch (error) {
58
+ console.error(chalk.red(`Error: ${error.message}`));
59
+ }
60
+ };
61
+ const startInputWatcher = async () => {
62
+ let position = 0;
63
+ const inputFileHandle = await fs.open(argv.inputFilePath, 'r');
64
+ const outputFileHandle = await fs.open(argv.outputFilePath, 'a');
65
+ for await (const event of fs.watch(argv.inputFilePath)) {
66
+ if (event.eventType !== 'change') {
67
+ continue;
68
+ }
69
+ const stats = await inputFileHandle.stat();
70
+ if (stats.size === position) {
71
+ continue;
72
+ }
73
+ const stream = inputFileHandle.createReadStream({
74
+ start: position,
75
+ end: stats.size,
76
+ });
77
+ const rl = readline.createInterface({
78
+ input: stream,
79
+ crlfDelay: Infinity,
80
+ });
81
+ for await (const line of rl) {
82
+ await handleInput(line);
83
+ await outputFileHandle.appendFile(`Done: ${line}\n`);
84
+ }
85
+ position = stats.size;
86
+ }
87
+ };
88
+ void startInputWatcher();
89
+ //# sourceMappingURL=cloudLoginService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudLoginService.js","sourceRoot":"","sources":["../src/cloudLoginService.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,6 @@
1
- /* eslint-disable @typescript-eslint/no-unused-vars */
2
1
  import chalk from 'chalk';
3
2
  import ora from 'ora';
4
- import { ensureHttps } from './utils.js';
3
+ import { ensureHttps } from './utils';
5
4
  export async function loginToDatabricks({ url, page, }) {
6
5
  const spinner = ora('Navigating to Databricks login page...').start();
7
6
  await page.goto(ensureHttps(url));
@@ -1 +1 @@
1
- {"version":3,"file":"databricksLogin.js","sourceRoot":"","sources":["../src/databricksLogin.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,GAAG,EACH,IAAI,GAIL;IACC,MAAM,OAAO,GAAG,GAAG,CAAC,wCAAwC,CAAC,CAAC,KAAK,EAAE,CAAC;IAEtE,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAElC,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAEvC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;AACvE,CAAC"}
1
+ {"version":3,"file":"databricksLogin.js","sourceRoot":"","sources":["../src/databricksLogin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,GAAG,EACH,IAAI,GAIL;IACC,MAAM,OAAO,GAAG,GAAG,CAAC,wCAAwC,CAAC,CAAC,KAAK,EAAE,CAAC;IAEtE,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IAElC,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAEvC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;AACvE,CAAC"}
package/dist/index.js CHANGED
@@ -1,59 +1,10 @@
1
- import chalk from 'chalk';
2
1
  import yargs from 'yargs';
3
- import { loginToAWS } from './awsLogin.js';
4
- import { loginToAzure } from './azureLogin.js';
5
- import { loginToDatabricks } from './databricksLogin.js';
6
- import { setupBrowser } from './setup.js';
7
- const SUPPORTED_CLOUD_PROVIDERS = ['aws', 'azure', 'databricks'];
2
+ import { startInputWatcher } from './startInputWatcher';
8
3
  const argv = yargs(process.argv.slice(2))
9
4
  .options({
10
- cloudProvider: {
11
- demandOption: true,
12
- choices: SUPPORTED_CLOUD_PROVIDERS,
13
- type: 'string',
14
- },
15
- password: { demandOption: true, type: 'string' },
16
- url: { demandOption: false, type: 'string' },
17
- username: { demandOption: true, type: 'string' },
5
+ inputFilePath: { demandOption: true, type: 'string' },
6
+ outputFilePath: { demandOption: true, type: 'string' },
18
7
  })
19
8
  .parseSync();
20
- (async () => {
21
- const { url, password, username, cloudProvider } = argv;
22
- try {
23
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
24
- const { browser, page } = await setupBrowser();
25
- switch (cloudProvider) {
26
- case 'azure':
27
- await loginToAzure({ url, username, page, password });
28
- break;
29
- case 'aws':
30
- if (!url) {
31
- console.error(chalk.red('AWS URL is required'));
32
- process.exit(1);
33
- }
34
- await loginToAWS({ url, username, page, password });
35
- break;
36
- case 'databricks':
37
- if (!url) {
38
- console.error(chalk.red('Databricks URL is required'));
39
- process.exit(1);
40
- }
41
- await loginToAzure({
42
- url: undefined,
43
- username,
44
- page,
45
- password,
46
- });
47
- await loginToDatabricks({ url, page });
48
- break;
49
- default:
50
- console.error(chalk.red('Unsupported cloud provider'));
51
- }
52
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
- }
54
- catch (error) {
55
- console.error(chalk.red(`Error: ${error.message}`));
56
- }
57
- await new Promise(() => { });
58
- })();
9
+ void startInputWatcher(argv);
59
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAU,CAAC;AAE1E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACtC,OAAO,CAAC;IACP,aAAa,EAAE;QACb,YAAY,EAAE,IAAI;QAClB,OAAO,EAAE,yBAAyB;QAClC,IAAI,EAAE,QAAQ;KACf;IACD,QAAQ,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;IAChD,GAAG,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC5C,QAAQ,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;CACjD,CAAC;KACD,SAAS,EAAE,CAAC;AAEf,CAAC,KAAK,IAAI,EAAE;IACV,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IAExD,IAAI,CAAC;QACH,6DAA6D;QAC7D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAE/C,QAAQ,aAAa,EAAE,CAAC;YACtB,KAAK,OAAO;gBACV,MAAM,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACtD,MAAM;YACR,KAAK,KAAK;gBACR,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;oBAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,UAAU,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACpD,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;oBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,YAAY,CAAC;oBACjB,GAAG,EAAE,SAAS;oBACd,QAAQ;oBACR,IAAI;oBACJ,QAAQ;iBACT,CAAC,CAAC;gBACH,MAAM,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvC,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,8DAA8D;IAChE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACtC,OAAO,CAAC;IACP,aAAa,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;IACrD,cAAc,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;CACvD,CAAC;KACD,SAAS,EAAE,CAAC;AAEf,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC"}
package/dist/setup.js CHANGED
@@ -1,4 +1,4 @@
1
- import dotenv from 'dotenv';
1
+ import * as dotenv from 'dotenv';
2
2
  import puppeteer from 'puppeteer-core';
3
3
  const envFile = process.env.NODE_ENV === 'production' ? '.env' : '.env.development';
4
4
  dotenv.config({ path: envFile });
@@ -12,10 +12,10 @@ export async function setupBrowser() {
12
12
  userDataDir: process.env.USER_DATA_DIR,
13
13
  });
14
14
  const pages = await browser.pages();
15
- if (pages[0] === undefined) {
16
- const page = await browser.newPage();
17
- return { browser, page };
15
+ if (pages[0] !== undefined) {
16
+ return { browser, page: pages[0] };
18
17
  }
19
- return { browser, page: pages[0] };
18
+ const page = await browser.newPage();
19
+ return { browser, page };
20
20
  }
21
21
  //# sourceMappingURL=setup.js.map
package/dist/setup.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC;AACtE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;QACrC,IAAI,EAAE,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;QAC5D,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3C,QAAQ,EAAE,KAAK;QACf,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAE,CAAC,qBAAqB,CAAC;QAC1C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;KACvC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IAEpC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC;AACtE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;QACrC,IAAI,EAAE,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;QAC5D,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe;QAC3C,QAAQ,EAAE,KAAK;QACf,eAAe,EAAE,IAAI;QACrB,iBAAiB,EAAE,CAAC,qBAAqB,CAAC;QAC1C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;KACvC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,80 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as readline from 'node:readline';
3
+ import * as z from 'zod';
4
+ import { setupBrowser } from './setup';
5
+ import { loginToAzure } from './azureLogin';
6
+ import chalk from 'chalk';
7
+ import { loginToAWS } from './awsLogin';
8
+ import { loginToDatabricks } from './databricksLogin';
9
+ const Input = z.object({
10
+ cloudProvider: z.enum(['aws', 'azure', 'databricks']),
11
+ password: z.string(),
12
+ url: z.string(),
13
+ username: z.string(),
14
+ });
15
+ const handleInput = async (line) => {
16
+ try {
17
+ const { cloudProvider, url, password, username } = Input.parse(JSON.parse(line));
18
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
19
+ const { browser, page } = await setupBrowser();
20
+ switch (cloudProvider) {
21
+ case 'azure':
22
+ await loginToAzure({ url, username, page, password });
23
+ break;
24
+ case 'aws':
25
+ if (!url) {
26
+ console.error(chalk.red('AWS URL is required'));
27
+ process.exit(1);
28
+ }
29
+ await loginToAWS({ url, username, page, password });
30
+ break;
31
+ case 'databricks':
32
+ if (!url) {
33
+ console.error(chalk.red('Databricks URL is required'));
34
+ process.exit(1);
35
+ }
36
+ await loginToAzure({
37
+ url: undefined,
38
+ username,
39
+ page,
40
+ password,
41
+ });
42
+ await loginToDatabricks({ url, page });
43
+ break;
44
+ default:
45
+ console.error(chalk.red('Unsupported cloud provider'));
46
+ }
47
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ }
49
+ catch (error) {
50
+ console.error(chalk.red(`Error: ${error.message}`));
51
+ }
52
+ };
53
+ export const startInputWatcher = async ({ inputFilePath, outputFilePath, }) => {
54
+ let position = 0;
55
+ const inputFileHandle = await fs.open(inputFilePath, 'r');
56
+ const outputFileHandle = await fs.open(outputFilePath, 'a');
57
+ for await (const event of fs.watch(inputFilePath)) {
58
+ if (event.eventType !== 'change') {
59
+ continue;
60
+ }
61
+ const stats = await inputFileHandle.stat();
62
+ if (stats.size === position) {
63
+ continue;
64
+ }
65
+ const stream = inputFileHandle.createReadStream({
66
+ start: position,
67
+ end: stats.size,
68
+ });
69
+ const rl = readline.createInterface({
70
+ input: stream,
71
+ crlfDelay: Infinity,
72
+ });
73
+ for await (const line of rl) {
74
+ await handleInput(line);
75
+ await outputFileHandle.appendFile(`Done: ${line}\n`);
76
+ }
77
+ position = stats.size;
78
+ }
79
+ };
80
+ //# sourceMappingURL=startInputWatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startInputWatcher.js","sourceRoot":"","sources":["../src/startInputWatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { loginToAzure } from './azureLogin';
2
+ import { startInputWatcher } from './startInputWatcher';
3
+ import * as fs from 'node:fs/promises';
4
+ import { test, describe, expect, afterEach, vitest, beforeEach, } from 'vitest';
5
+ import { setupBrowser } from './setup';
6
+ vitest.mock('./azureLogin');
7
+ vitest.mock('./setup');
8
+ const loginToAzureMock = loginToAzure;
9
+ const setupBrowserMock = setupBrowser;
10
+ describe('startInputWatcher', () => {
11
+ beforeEach(() => {
12
+ setupBrowserMock.mockResolvedValue({
13
+ browser: 'chrome',
14
+ page: 'some-page',
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ });
17
+ });
18
+ afterEach(() => {
19
+ vitest.restoreAllMocks();
20
+ });
21
+ test('starts an input watcher that calls loginToAzure', async () => {
22
+ loginToAzureMock.mockResolvedValue(undefined);
23
+ const temporaryDirectory = await fs.mkdtemp('/tmp/');
24
+ const inputFilePath = `${temporaryDirectory}/input.txt`;
25
+ const outputFilePath = `${temporaryDirectory}/output.txt`;
26
+ await fs.writeFile(inputFilePath, '');
27
+ await fs.writeFile(outputFilePath, '');
28
+ void startInputWatcher({
29
+ inputFilePath,
30
+ outputFilePath,
31
+ });
32
+ const input = {
33
+ cloudProvider: 'azure',
34
+ password: 'password',
35
+ url: 'url',
36
+ username: 'username',
37
+ };
38
+ await new Promise((resolve) => setTimeout(resolve, 100));
39
+ await fs.writeFile(inputFilePath, JSON.stringify(input));
40
+ await new Promise((resolve) => setTimeout(resolve, 100));
41
+ expect(loginToAzureMock).toHaveBeenCalledOnce();
42
+ expect(loginToAzureMock).toHaveBeenCalledWith({
43
+ url: input.url,
44
+ username: input.username,
45
+ password: input.password,
46
+ page: 'some-page',
47
+ });
48
+ }, { timeout: 100000000 });
49
+ });
50
+ //# sourceMappingURL=startInputWatcher.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startInputWatcher.spec.js","sourceRoot":"","sources":["../src/startInputWatcher.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAEL,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,SAAS,EACT,MAAM,EACN,UAAU,GACX,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC5B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEvB,MAAM,gBAAgB,GAAG,YAAmD,CAAC;AAC7E,MAAM,gBAAgB,GAAG,YAAmD,CAAC;AAE7E,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,UAAU,CAAC,GAAG,EAAE;QACd,gBAAgB,CAAC,iBAAiB,CAAC;YACjC,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,WAAW;YACjB,8DAA8D;SACxD,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,IAAI,CACF,iDAAiD,EACjD,KAAK,IAAI,EAAE;QACT,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,kBAAkB,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,aAAa,GAAG,GAAG,kBAAkB,YAAY,CAAC;QACxD,MAAM,cAAc,GAAG,GAAG,kBAAkB,aAAa,CAAC;QAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACvC,KAAK,iBAAiB,CAAC;YACrB,aAAa;YACb,cAAc;SACf,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG;YACZ,aAAa,EAAE,OAAO;YACtB,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,KAAK;YACV,QAAQ,EAAE,UAAU;SACrB,CAAC;QACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAEzD,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAChD,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC;YAC5C,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;IACL,CAAC,EACD,EAAE,OAAO,EAAE,SAAS,EAAE,CACvB,CAAC;AACJ,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datacamp/learn-vm-scripts",
3
- "version": "0.0.1-rc.1",
3
+ "version": "0.0.1-rc.2",
4
4
  "repository": "git@github.com:datacamp-engineering/learn-vm-scripts.git",
5
5
  "description": "Scripts used by VMs in learn.",
6
6
  "main": "./dist/index.js",
@@ -16,7 +16,8 @@
16
16
  "dev": "NODE_ENV=development yarn build && yarn cli",
17
17
  "lint": "eslint --ext ts .",
18
18
  "deduplicate": "yarn-deduplicate",
19
- "cli": "node dist/index.js"
19
+ "cli": "node dist/index.js",
20
+ "test": "vitest"
20
21
  },
21
22
  "keywords": [],
22
23
  "author": "Content Platform <content-platform@datacamp.com>",
@@ -27,7 +28,8 @@
27
28
  "eslint-plugin-prettier": "^5.2.1",
28
29
  "ora": "8.0.1",
29
30
  "puppeteer-core": "^22.14.0",
30
- "yargs": "^17.7.2"
31
+ "yargs": "^17.7.2",
32
+ "zod": "^3.23.8"
31
33
  },
32
34
  "devDependencies": {
33
35
  "@datacamp/eslint-config": "^7.1.0",
@@ -45,6 +47,7 @@
45
47
  "ts-node": "^10.9.2",
46
48
  "ts-node-dev": "^2.0.0",
47
49
  "typescript": "^5.5.4",
50
+ "vitest": "^2.0.5",
48
51
  "yarn-deduplicate": "^6.0.2"
49
52
  }
50
53
  }