@alwaysmeticulous/remote-replay-launcher 2.122.0 → 2.124.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.
- package/dist/__tests__/url.utils.spec.d.ts +1 -0
- package/dist/__tests__/url.utils.spec.js +18 -0
- package/dist/__tests__/url.utils.spec.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +18 -5
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +6 -2
- package/dist/url.utils.d.ts +1 -0
- package/dist/url.utils.js +28 -0
- package/dist/url.utils.js.map +1 -0
- package/package.json +24 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const url_utils_1 = require("../url.utils");
|
|
4
|
+
describe("getPort", () => {
|
|
5
|
+
it("returns the port when the port is defined", () => {
|
|
6
|
+
const url = new URL("http://localhost:3000");
|
|
7
|
+
expect((0, url_utils_1.getPort)(url)).toEqual(3000);
|
|
8
|
+
});
|
|
9
|
+
it("returns the port when the port is not", () => {
|
|
10
|
+
const url = new URL("http://localhost");
|
|
11
|
+
expect((0, url_utils_1.getPort)(url)).toEqual(80);
|
|
12
|
+
});
|
|
13
|
+
it("returns the port when the port matches the default for the protocol", () => {
|
|
14
|
+
const url = new URL("https://localhost:443");
|
|
15
|
+
expect((0, url_utils_1.getPort)(url)).toEqual(443);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=url.utils.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.utils.spec.js","sourceRoot":"","sources":["../../src/__tests__/url.utils.spec.ts"],"names":[],"mappings":";;AAAA,4CAAuC;AAEvC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAA,mBAAO,EAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACxC,MAAM,CAAC,IAAA,mBAAO,EAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAA,mBAAO,EAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
import { ExecuteRemoteTestRunOptions, ExecuteRemoteTestRunResult } from "./types";
|
|
2
|
-
export
|
|
2
|
+
export { TunnelData } from "./types";
|
|
3
|
+
export declare const executeRemoteTestRun: ({ apiToken: apiToken_, appUrl, commitSha, onTunnelCreated, onTestRunCreated, onProgressUpdate, keepTunnelOpenPromise, environment, }: ExecuteRemoteTestRunOptions) => Promise<ExecuteRemoteTestRunResult>;
|
package/dist/index.js
CHANGED
|
@@ -8,8 +8,9 @@ const client_1 = require("@alwaysmeticulous/client");
|
|
|
8
8
|
const common_1 = require("@alwaysmeticulous/common");
|
|
9
9
|
const tunnels_client_1 = require("@alwaysmeticulous/tunnels-client");
|
|
10
10
|
const loglevel_1 = __importDefault(require("loglevel"));
|
|
11
|
+
const url_utils_1 = require("./url.utils");
|
|
11
12
|
const PROGRESS_UPDATE_INTERVAL_MS = 5000; // 5 seconds
|
|
12
|
-
const executeRemoteTestRun = async ({ apiToken: apiToken_, appUrl, commitSha, onTunnelCreated, onTestRunCreated, onProgressUpdate, environment, }) => {
|
|
13
|
+
const executeRemoteTestRun = async ({ apiToken: apiToken_, appUrl, commitSha, onTunnelCreated, onTestRunCreated, onProgressUpdate, keepTunnelOpenPromise, environment, }) => {
|
|
13
14
|
const logger = loglevel_1.default.getLogger(common_1.METICULOUS_LOGGER_NAME);
|
|
14
15
|
const apiToken = (0, client_1.getApiToken)(apiToken_);
|
|
15
16
|
if (!apiToken) {
|
|
@@ -24,11 +25,15 @@ const executeRemoteTestRun = async ({ apiToken: apiToken_, appUrl, commitSha, on
|
|
|
24
25
|
catch (error) {
|
|
25
26
|
throw new Error(`Invalid app URL: ${appUrl}`);
|
|
26
27
|
}
|
|
28
|
+
const port = (0, url_utils_1.getPort)(url);
|
|
29
|
+
if (port === -1) {
|
|
30
|
+
throw new Error(`Invalid app URL port: ${appUrl}`);
|
|
31
|
+
}
|
|
27
32
|
const tunnel = await (0, tunnels_client_1.localtunnel)({
|
|
28
33
|
logger,
|
|
29
34
|
apiToken,
|
|
30
35
|
localHost: url.hostname,
|
|
31
|
-
port
|
|
36
|
+
port,
|
|
32
37
|
localHttps: false,
|
|
33
38
|
allowInvalidCert: false,
|
|
34
39
|
});
|
|
@@ -59,17 +64,25 @@ const executeRemoteTestRun = async ({ apiToken: apiToken_, appUrl, commitSha, on
|
|
|
59
64
|
if (progressUpdateInterval) {
|
|
60
65
|
clearInterval(progressUpdateInterval);
|
|
61
66
|
}
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
if (keepTunnelOpenPromise) {
|
|
68
|
+
keepTunnelOpenPromise.then(() => {
|
|
69
|
+
tunnel.close();
|
|
70
|
+
testRunCompleted.resolve(completedTestRun);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
tunnel.close();
|
|
75
|
+
testRunCompleted.resolve(completedTestRun);
|
|
76
|
+
}
|
|
64
77
|
};
|
|
65
78
|
// Poll every few seconds for progress updates and exit when the test run is completed
|
|
66
79
|
progressUpdateInterval = setInterval(async () => {
|
|
67
80
|
const updatedTestRun = await (0, client_1.getTestRun)({ client, testRunId: testRun.id });
|
|
81
|
+
onProgressUpdate === null || onProgressUpdate === void 0 ? void 0 : onProgressUpdate(updatedTestRun);
|
|
68
82
|
if (!client_1.IN_PROGRESS_TEST_RUN_STATUS.includes(updatedTestRun.status)) {
|
|
69
83
|
onTestRunCompleted(updatedTestRun);
|
|
70
84
|
return;
|
|
71
85
|
}
|
|
72
|
-
onProgressUpdate === null || onProgressUpdate === void 0 ? void 0 : onProgressUpdate(updatedTestRun);
|
|
73
86
|
}, PROGRESS_UPDATE_INTERVAL_MS);
|
|
74
87
|
const completedTestRun = await testRunCompleted.promise;
|
|
75
88
|
return {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,qDAOkC;AAClC,qDAAyE;AACzE,qEAA+D;AAC/D,wDAA2B;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TestRun } from "@alwaysmeticulous/client";
|
|
2
|
-
interface TunnelData {
|
|
2
|
+
export interface TunnelData {
|
|
3
3
|
url: string;
|
|
4
4
|
basicAuthUser: string;
|
|
5
5
|
basicAuthPassword: string;
|
|
@@ -11,9 +11,13 @@ export interface ExecuteRemoteTestRunOptions {
|
|
|
11
11
|
onTunnelCreated?: (data: TunnelData) => void;
|
|
12
12
|
onTestRunCreated?: (testRun: TestRun) => void;
|
|
13
13
|
onProgressUpdate?: (testRun: TestRun) => void;
|
|
14
|
+
/**
|
|
15
|
+
* If set, the tunnel will be kept open until this promise is resolved.
|
|
16
|
+
* `executeRemoteTestRun` will not resolve until this promise is resolved.
|
|
17
|
+
*/
|
|
18
|
+
keepTunnelOpenPromise?: Promise<void>;
|
|
14
19
|
environment: string;
|
|
15
20
|
}
|
|
16
21
|
export interface ExecuteRemoteTestRunResult {
|
|
17
22
|
testRun: TestRun;
|
|
18
23
|
}
|
|
19
|
-
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getPort(url: URL): number;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPort = void 0;
|
|
4
|
+
function getPort(url) {
|
|
5
|
+
//https://developer.mozilla.org/en-US/docs/Web/API/URL/port
|
|
6
|
+
//Port is an empty string, if the default port for the protocol is used
|
|
7
|
+
if (url.port === "") {
|
|
8
|
+
switch (url.protocol) {
|
|
9
|
+
case "http:":
|
|
10
|
+
case "ws:":
|
|
11
|
+
return 80;
|
|
12
|
+
case "https:":
|
|
13
|
+
case "wss:":
|
|
14
|
+
return 443;
|
|
15
|
+
case "ftp:":
|
|
16
|
+
return 21;
|
|
17
|
+
default:
|
|
18
|
+
return -1;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const port = parseInt(url.port, 10);
|
|
22
|
+
if (isNaN(port)) {
|
|
23
|
+
return -1;
|
|
24
|
+
}
|
|
25
|
+
return port;
|
|
26
|
+
}
|
|
27
|
+
exports.getPort = getPort;
|
|
28
|
+
//# sourceMappingURL=url.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.utils.js","sourceRoot":"","sources":["../src/url.utils.ts"],"names":[],"mappings":";;;AAAA,SAAgB,OAAO,CAAC,GAAQ;IAC9B,2DAA2D;IAC3D,uEAAuE;IAEvE,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE;QACnB,QAAQ,GAAG,CAAC,QAAQ,EAAE;YACpB,KAAK,OAAO,CAAC;YACb,KAAK,KAAK;gBACR,OAAO,EAAE,CAAC;YACZ,KAAK,QAAQ,CAAC;YACd,KAAK,MAAM;gBACT,OAAO,GAAG,CAAC;YACb,KAAK,MAAM;gBACT,OAAO,EAAE,CAAC;YACZ;gBACE,OAAO,CAAC,CAAC,CAAC;SACb;KACF;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE;QACf,OAAO,CAAC,CAAC,CAAC;KACX;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAzBD,0BAyBC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwaysmeticulous/remote-replay-launcher",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.124.0",
|
|
4
4
|
"description": "Executes a remote replay on Meticulous' infrastructure",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,12 +16,13 @@
|
|
|
16
16
|
"lint": "eslint src --ext=ts,tsx,js --cache",
|
|
17
17
|
"lint:commit": "eslint --cache $(git diff --relative --name-only --diff-filter=ACMRTUXB master | grep -E \"(.js$|.ts$|.tsx$)\")",
|
|
18
18
|
"lint:fix": "eslint src --ext=ts,tsx,js --cache --fix",
|
|
19
|
-
"depcheck": "depcheck --ignore-patterns=dist"
|
|
19
|
+
"depcheck": "depcheck --ignore-patterns=dist",
|
|
20
|
+
"test": "jest --passWithNoTests"
|
|
20
21
|
},
|
|
21
22
|
"dependencies": {
|
|
22
|
-
"@alwaysmeticulous/client": "^2.
|
|
23
|
-
"@alwaysmeticulous/common": "^2.
|
|
24
|
-
"@alwaysmeticulous/tunnels-client": "^2.
|
|
23
|
+
"@alwaysmeticulous/client": "^2.124.0",
|
|
24
|
+
"@alwaysmeticulous/common": "^2.124.0",
|
|
25
|
+
"@alwaysmeticulous/tunnels-client": "^2.123.0",
|
|
25
26
|
"loglevel": "^1.8.0"
|
|
26
27
|
},
|
|
27
28
|
"author": {
|
|
@@ -41,5 +42,22 @@
|
|
|
41
42
|
"bugs": {
|
|
42
43
|
"url": "https://github.com/alwaysmeticulous/meticulous-sdk/issues"
|
|
43
44
|
},
|
|
44
|
-
"
|
|
45
|
+
"jest": {
|
|
46
|
+
"moduleFileExtensions": [
|
|
47
|
+
"js",
|
|
48
|
+
"json",
|
|
49
|
+
"ts"
|
|
50
|
+
],
|
|
51
|
+
"rootDir": "src",
|
|
52
|
+
"testRegex": ".*\\.spec\\.ts$",
|
|
53
|
+
"transform": {
|
|
54
|
+
"^.+\\.(t|j)s$": "ts-jest"
|
|
55
|
+
},
|
|
56
|
+
"collectCoverageFrom": [
|
|
57
|
+
"**/*.(t|j)s"
|
|
58
|
+
],
|
|
59
|
+
"coverageDirectory": "../coverage",
|
|
60
|
+
"testEnvironment": "node"
|
|
61
|
+
},
|
|
62
|
+
"gitHead": "32f2fda0b7612c8256d4fa6923a95ff4b3d42886"
|
|
45
63
|
}
|