@alwaysmeticulous/record 2.94.0 → 2.95.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/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/record/constants.d.ts +5 -0
- package/dist/record/constants.js +11 -0
- package/dist/record/constants.js.map +1 -0
- package/dist/record/record-login-flow.d.ts +4 -0
- package/dist/record/record-login-flow.js +139 -0
- package/dist/record/record-login-flow.js.map +1 -0
- package/dist/record/record.js +10 -17
- package/dist/record/record.js.map +1 -1
- package/dist/record/record.utils.d.ts +0 -1
- package/dist/record/record.utils.js +7 -3
- package/dist/record/record.utils.js.map +1 -1
- package/dist/record/utils/expose-new-recording-callback.d.ts +5 -0
- package/dist/record/utils/expose-new-recording-callback.js +8 -0
- package/dist/record/utils/expose-new-recording-callback.js.map +1 -0
- package/dist/record/utils/inject-finish-recording-frame.d.ts +5 -0
- package/dist/record/utils/inject-finish-recording-frame.js +83 -0
- package/dist/record/utils/inject-finish-recording-frame.js.map +1 -0
- package/dist/record/utils/print-warning.d.ts +3 -0
- package/dist/record/utils/print-warning.js +27 -0
- package/dist/record/utils/print-warning.js.map +1 -0
- package/package.json +4 -3
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.bootstrapRecordingPage = exports.recordSession = void 0;
|
|
3
|
+
exports.bootstrapRecordingPage = exports.recordLoginFlowSession = exports.recordSession = void 0;
|
|
4
4
|
var record_1 = require("./record/record");
|
|
5
5
|
Object.defineProperty(exports, "recordSession", { enumerable: true, get: function () { return record_1.recordSession; } });
|
|
6
|
+
var record_login_flow_1 = require("./record/record-login-flow");
|
|
7
|
+
Object.defineProperty(exports, "recordLoginFlowSession", { enumerable: true, get: function () { return record_login_flow_1.recordLoginFlowSession; } });
|
|
6
8
|
var record_utils_1 = require("./record/record.utils");
|
|
7
9
|
Object.defineProperty(exports, "bootstrapRecordingPage", { enumerable: true, get: function () { return record_utils_1.bootstrapPage; } });
|
|
8
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,0CAAgD;AAAvC,uGAAA,aAAa,OAAA;AACtB,sDAAgF;AAAvE,sHAAA,aAAa,OAA0B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,0CAAgD;AAAvC,uGAAA,aAAa,OAAA;AACtB,gEAAoE;AAA3D,2HAAA,sBAAsB,OAAA;AAC/B,sDAAgF;AAAvE,sHAAA,aAAa,OAA0B"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const DEFAULT_UPLOAD_INTERVAL_MS = 1000;
|
|
2
|
+
export declare const DEFAULT_NAVIGATION_TIMEOUT_MS = 120000;
|
|
3
|
+
export declare const INITIAL_METICULOUS_RECORD_DOCS_URL = "https://app.meticulous.ai/docs/recording-a-test";
|
|
4
|
+
export declare const INITIAL_METICULOUS_RECORD_LOGIN_FLOW_DOCS_URL = "https://app.meticulous.ai/docs/recording-a-login-flow";
|
|
5
|
+
export declare const METICULOUS_RECORD_LOGIN_FLOW_SAVING_DOCS_URL = "https://app.meticulous.ai/docs/recording-a-login-flow-saving";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.METICULOUS_RECORD_LOGIN_FLOW_SAVING_DOCS_URL = exports.INITIAL_METICULOUS_RECORD_LOGIN_FLOW_DOCS_URL = exports.INITIAL_METICULOUS_RECORD_DOCS_URL = exports.DEFAULT_NAVIGATION_TIMEOUT_MS = exports.DEFAULT_UPLOAD_INTERVAL_MS = void 0;
|
|
4
|
+
exports.DEFAULT_UPLOAD_INTERVAL_MS = 1000; // 1 second
|
|
5
|
+
exports.DEFAULT_NAVIGATION_TIMEOUT_MS = 120000; // 2 minutes
|
|
6
|
+
exports.INITIAL_METICULOUS_RECORD_DOCS_URL = "https://app.meticulous.ai/docs/recording-a-test";
|
|
7
|
+
// Initial page shown when recording a login flow session.
|
|
8
|
+
exports.INITIAL_METICULOUS_RECORD_LOGIN_FLOW_DOCS_URL = "https://app.meticulous.ai/docs/recording-a-login-flow";
|
|
9
|
+
// Page shown while saving a login flow session recording.
|
|
10
|
+
exports.METICULOUS_RECORD_LOGIN_FLOW_SAVING_DOCS_URL = "https://app.meticulous.ai/docs/recording-a-login-flow-saving";
|
|
11
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/record/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,0BAA0B,GAAG,IAAK,CAAC,CAAC,WAAW;AAE/C,QAAA,6BAA6B,GAAG,MAAO,CAAC,CAAC,YAAY;AAErD,QAAA,kCAAkC,GAC7C,iDAAiD,CAAC;AAEpD,0DAA0D;AAC7C,QAAA,6CAA6C,GACxD,uDAAuD,CAAC;AAE1D,0DAA0D;AAC7C,QAAA,4CAA4C,GACvD,8DAA8D,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { RecordLoginFlowSessionFn } from "@alwaysmeticulous/common";
|
|
2
|
+
export declare const LOGIN_FLOW_SESSION_RECORDING_SOURCE = "cli-login-flow";
|
|
3
|
+
export declare const LOGIN_FLOW_DATA_SESSION_RECORDING_SOURCE = "cli-login-flow-application-storage";
|
|
4
|
+
export declare const recordLoginFlowSession: RecordLoginFlowSessionFn;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.recordLoginFlowSession = exports.LOGIN_FLOW_DATA_SESSION_RECORDING_SOURCE = exports.LOGIN_FLOW_SESSION_RECORDING_SOURCE = void 0;
|
|
7
|
+
const common_1 = require("@alwaysmeticulous/common");
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const loglevel_1 = __importDefault(require("loglevel"));
|
|
10
|
+
const puppeteer_1 = require("puppeteer");
|
|
11
|
+
const constants_1 = require("./constants");
|
|
12
|
+
const record_utils_1 = require("./record.utils");
|
|
13
|
+
const expose_new_recording_callback_1 = require("./utils/expose-new-recording-callback");
|
|
14
|
+
const inject_finish_recording_frame_1 = require("./utils/inject-finish-recording-frame");
|
|
15
|
+
const print_warning_1 = require("./utils/print-warning");
|
|
16
|
+
exports.LOGIN_FLOW_SESSION_RECORDING_SOURCE = "cli-login-flow";
|
|
17
|
+
exports.LOGIN_FLOW_DATA_SESSION_RECORDING_SOURCE = "cli-login-flow-application-storage";
|
|
18
|
+
const bootstrapLoginFlowRecordingPage = async ({ page, recordingToken, recordingSnippet, earlyNetworkRecorderSnippet, uploadIntervalMs, captureHttpOnlyCookies, recordingSource, bypassCSP, }) => {
|
|
19
|
+
page.setDefaultNavigationTimeout(constants_1.DEFAULT_NAVIGATION_TIMEOUT_MS); // 2 minutes
|
|
20
|
+
if (bypassCSP) {
|
|
21
|
+
await page.setBypassCSP(true);
|
|
22
|
+
}
|
|
23
|
+
await (0, record_utils_1.bootstrapPage)({
|
|
24
|
+
page,
|
|
25
|
+
recordingToken,
|
|
26
|
+
appCommitHash: "unknown",
|
|
27
|
+
recordingSnippet,
|
|
28
|
+
earlyNetworkRecorderSnippet,
|
|
29
|
+
uploadIntervalMs: uploadIntervalMs || constants_1.DEFAULT_UPLOAD_INTERVAL_MS,
|
|
30
|
+
captureHttpOnlyCookies: captureHttpOnlyCookies !== null && captureHttpOnlyCookies !== void 0 ? captureHttpOnlyCookies : true,
|
|
31
|
+
recordingSource,
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
const recordLoginFlowSession = async ({ recordingToken, devTools, bypassCSP, recordingSnippet, earlyNetworkRecorderSnippet, width, height, uploadIntervalMs, captureHttpOnlyCookies, }) => {
|
|
35
|
+
const logger = loglevel_1.default.getLogger(common_1.METICULOUS_LOGGER_NAME);
|
|
36
|
+
logger.info("Opening browser...");
|
|
37
|
+
const defaultViewport = width && height ? { width, height } : null;
|
|
38
|
+
const browser = await (0, puppeteer_1.launch)({
|
|
39
|
+
defaultViewport,
|
|
40
|
+
headless: false,
|
|
41
|
+
devtools: devTools || false,
|
|
42
|
+
});
|
|
43
|
+
const context = await browser.createIncognitoBrowserContext();
|
|
44
|
+
await Promise.all((await browser.pages()).map((page) => page.close()));
|
|
45
|
+
const loginFlowPage = await context.newPage();
|
|
46
|
+
await bootstrapLoginFlowRecordingPage({
|
|
47
|
+
page: loginFlowPage,
|
|
48
|
+
recordingToken,
|
|
49
|
+
recordingSnippet,
|
|
50
|
+
earlyNetworkRecorderSnippet,
|
|
51
|
+
uploadIntervalMs,
|
|
52
|
+
captureHttpOnlyCookies,
|
|
53
|
+
bypassCSP,
|
|
54
|
+
recordingSource: exports.LOGIN_FLOW_SESSION_RECORDING_SOURCE,
|
|
55
|
+
});
|
|
56
|
+
let isRecordingComplete = false;
|
|
57
|
+
let onDataSessionSaved = false;
|
|
58
|
+
let startedLoginSessionRecording = false;
|
|
59
|
+
const recordingCompleteCallback = (0, common_1.defer)();
|
|
60
|
+
loginFlowPage.on("close", () => {
|
|
61
|
+
if (!isRecordingComplete) {
|
|
62
|
+
(0, print_warning_1.printPageClosedWarning)();
|
|
63
|
+
// Resolve the callback only if the page is closed before the recording is complete.
|
|
64
|
+
// Cases where the page is closed after the recording is complete are handled
|
|
65
|
+
// in the `__meticulousFinishRecording` callback.
|
|
66
|
+
recordingCompleteCallback.resolve();
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
// Expose login page functions
|
|
70
|
+
await (0, expose_new_recording_callback_1.exposeNewRecordingCallback)(loginFlowPage, () => {
|
|
71
|
+
startedLoginSessionRecording = true;
|
|
72
|
+
});
|
|
73
|
+
await loginFlowPage.exposeFunction("__meticulousFinishRecording", async () => {
|
|
74
|
+
const loginDataPage = await context.newPage();
|
|
75
|
+
const finalLoginUrl = loginFlowPage.url();
|
|
76
|
+
loginDataPage.on("close", () => {
|
|
77
|
+
if (!onDataSessionSaved) {
|
|
78
|
+
(0, print_warning_1.printPageClosedWarning)();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
try {
|
|
82
|
+
const recordingSavingScreenPage = await context.newPage();
|
|
83
|
+
await recordingSavingScreenPage.goto(constants_1.METICULOUS_RECORD_LOGIN_FLOW_SAVING_DOCS_URL);
|
|
84
|
+
// Flush any pending payloads from the main login flow recording page and close it
|
|
85
|
+
await loginFlowPage.evaluate(() => {
|
|
86
|
+
var _a, _b;
|
|
87
|
+
(_b = (_a = window.__meticulous) === null || _a === void 0 ? void 0 : _a.flushPendingPayloads) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
88
|
+
});
|
|
89
|
+
isRecordingComplete = true;
|
|
90
|
+
await loginFlowPage.close();
|
|
91
|
+
await bootstrapLoginFlowRecordingPage({
|
|
92
|
+
page: loginDataPage,
|
|
93
|
+
recordingToken,
|
|
94
|
+
recordingSnippet,
|
|
95
|
+
earlyNetworkRecorderSnippet,
|
|
96
|
+
uploadIntervalMs: uploadIntervalMs,
|
|
97
|
+
captureHttpOnlyCookies: captureHttpOnlyCookies,
|
|
98
|
+
bypassCSP,
|
|
99
|
+
recordingSource: exports.LOGIN_FLOW_DATA_SESSION_RECORDING_SOURCE,
|
|
100
|
+
});
|
|
101
|
+
// Navigate to the final login flow url and flush any pending payloads
|
|
102
|
+
await loginDataPage.goto(finalLoginUrl, { waitUntil: "networkidle0" });
|
|
103
|
+
await loginDataPage.evaluate(() => {
|
|
104
|
+
var _a, _b;
|
|
105
|
+
(_b = (_a = window.__meticulous) === null || _a === void 0 ? void 0 : _a.flushPendingPayloads) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
106
|
+
});
|
|
107
|
+
onDataSessionSaved = true;
|
|
108
|
+
await loginDataPage.close();
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
logger.error(error);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
recordingCompleteCallback.resolve();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
await (0, inject_finish_recording_frame_1.injectFinishRecordingFrame)(loginFlowPage, "__meticulousFinishRecording");
|
|
118
|
+
await loginFlowPage.goto(constants_1.INITIAL_METICULOUS_RECORD_LOGIN_FLOW_DOCS_URL);
|
|
119
|
+
// Wait for the recording to complete or the page to close.
|
|
120
|
+
await recordingCompleteCallback.promise;
|
|
121
|
+
if (!loginFlowPage.isClosed()) {
|
|
122
|
+
await loginFlowPage.close();
|
|
123
|
+
}
|
|
124
|
+
await context.close();
|
|
125
|
+
await browser.close();
|
|
126
|
+
if (!onDataSessionSaved || !isRecordingComplete) {
|
|
127
|
+
throw new Error("Recording of login flow failed");
|
|
128
|
+
}
|
|
129
|
+
if (!startedLoginSessionRecording) {
|
|
130
|
+
(0, print_warning_1.printNoLoginSessionRecordedWarning)();
|
|
131
|
+
throw new Error("Recording of login flow failed");
|
|
132
|
+
}
|
|
133
|
+
// Print green success message
|
|
134
|
+
logger.info(chalk_1.default.green.bold("Recording complete!") +
|
|
135
|
+
"\n" +
|
|
136
|
+
chalk_1.default.green.bold("Return to https://app.meticulous.ai to finish setting up your project."));
|
|
137
|
+
};
|
|
138
|
+
exports.recordLoginFlowSession = recordLoginFlowSession;
|
|
139
|
+
//# sourceMappingURL=record-login-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-login-flow.js","sourceRoot":"","sources":["../../src/record/record-login-flow.ts"],"names":[],"mappings":"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"}
|
package/dist/record/record.js
CHANGED
|
@@ -32,16 +32,14 @@ const path_1 = require("path");
|
|
|
32
32
|
const common_1 = require("@alwaysmeticulous/common");
|
|
33
33
|
const loglevel_1 = __importDefault(require("loglevel"));
|
|
34
34
|
const puppeteer_1 = __importStar(require("puppeteer"));
|
|
35
|
+
const constants_1 = require("./constants");
|
|
35
36
|
const record_utils_1 = require("./record.utils");
|
|
36
|
-
const DEFAULT_UPLOAD_INTERVAL_MS = 1000; // 1 second
|
|
37
37
|
const COOKIE_FILENAME = "cookies.json";
|
|
38
|
-
const recordSession = async ({
|
|
38
|
+
const recordSession = async ({ recordingToken, appCommitHash, devTools, bypassCSP, recordingSnippet, earlyNetworkRecorderSnippet, width, height, uploadIntervalMs, incognito, cookieDir, debugLogger, onDetectedSession, captureHttpOnlyCookies, }) => {
|
|
39
39
|
const logger = loglevel_1.default.getLogger(common_1.METICULOUS_LOGGER_NAME);
|
|
40
40
|
logger.info("Opening browser...");
|
|
41
41
|
debugLogger === null || debugLogger === void 0 ? void 0 : debugLogger.log("recordSession options:");
|
|
42
42
|
debugLogger === null || debugLogger === void 0 ? void 0 : debugLogger.logObject({
|
|
43
|
-
browser: !!browser_,
|
|
44
|
-
project,
|
|
45
43
|
recordingToken,
|
|
46
44
|
appCommitHash,
|
|
47
45
|
devTools,
|
|
@@ -75,18 +73,17 @@ const recordSession = async ({ browser: browser_, project, recordingToken, appCo
|
|
|
75
73
|
debugLogger.log(execPath);
|
|
76
74
|
}
|
|
77
75
|
const defaultViewport = width && height ? { width, height } : null;
|
|
78
|
-
const browser =
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}));
|
|
76
|
+
const browser = await (0, puppeteer_1.launch)({
|
|
77
|
+
defaultViewport,
|
|
78
|
+
headless: false,
|
|
79
|
+
devtools: devTools || false,
|
|
80
|
+
});
|
|
84
81
|
const context = incognito
|
|
85
82
|
? await browser.createIncognitoBrowserContext()
|
|
86
83
|
: browser.defaultBrowserContext();
|
|
87
84
|
(await browser.defaultBrowserContext().pages()).forEach((page) => page.close());
|
|
88
85
|
const page = await context.newPage();
|
|
89
|
-
page.setDefaultNavigationTimeout(
|
|
86
|
+
page.setDefaultNavigationTimeout(constants_1.DEFAULT_NAVIGATION_TIMEOUT_MS); // 2 minutes
|
|
90
87
|
if (bypassCSP) {
|
|
91
88
|
await page.setBypassCSP(true);
|
|
92
89
|
}
|
|
@@ -108,10 +105,10 @@ const recordSession = async ({ browser: browser_, project, recordingToken, appCo
|
|
|
108
105
|
appCommitHash,
|
|
109
106
|
recordingSnippet,
|
|
110
107
|
earlyNetworkRecorderSnippet,
|
|
111
|
-
uploadIntervalMs: uploadIntervalMs || DEFAULT_UPLOAD_INTERVAL_MS,
|
|
108
|
+
uploadIntervalMs: uploadIntervalMs || constants_1.DEFAULT_UPLOAD_INTERVAL_MS,
|
|
112
109
|
captureHttpOnlyCookies: captureHttpOnlyCookies !== null && captureHttpOnlyCookies !== void 0 ? captureHttpOnlyCookies : true,
|
|
113
110
|
});
|
|
114
|
-
page.goto(
|
|
111
|
+
page.goto(constants_1.INITIAL_METICULOUS_RECORD_DOCS_URL);
|
|
115
112
|
logger.info("Browser ready");
|
|
116
113
|
// Collect and show recorded session ids
|
|
117
114
|
// Also save page cookies if not in incognito context
|
|
@@ -121,10 +118,6 @@ const recordSession = async ({ browser: browser_, project, recordingToken, appCo
|
|
|
121
118
|
const sessionId = await page.evaluate("window?.__meticulous?.config?.sessionId");
|
|
122
119
|
if (sessionId && !sessionIds.find((id) => id === sessionId)) {
|
|
123
120
|
sessionIds.push(sessionId);
|
|
124
|
-
const organizationName = encodeURIComponent(project.organization.name);
|
|
125
|
-
const projectName = encodeURIComponent(project.name);
|
|
126
|
-
const sessionUrl = `https://app.meticulous.ai/projects/${organizationName}/${projectName}/sessions/${sessionId}`;
|
|
127
|
-
logger.info(`Recording session: ${sessionUrl}`);
|
|
128
121
|
if (onDetectedSession) {
|
|
129
122
|
onDetectedSession(sessionId);
|
|
130
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/record/record.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0CAAyD;AACzD,+BAA4B;AAC5B,qDAGkC;AAClC,wDAA2B;AAC3B,uDAAsE;AACtE,
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/record/record.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Page } from "puppeteer";
|
|
2
|
-
export declare const INITIAL_METICULOUS_DOCS_URL = "https://app.meticulous.ai/docs/recording-a-test";
|
|
3
2
|
export declare function bootstrapPage({ page, recordingToken, appCommitHash, recordingSnippet, earlyNetworkRecorderSnippet, uploadIntervalMs, captureHttpOnlyCookies, recordingSource, }: {
|
|
4
3
|
page: Page;
|
|
5
4
|
recordingToken: string;
|
|
@@ -3,12 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.bootstrapPage =
|
|
6
|
+
exports.bootstrapPage = void 0;
|
|
7
7
|
const promises_1 = require("fs/promises");
|
|
8
8
|
const common_1 = require("@alwaysmeticulous/common");
|
|
9
9
|
const loglevel_1 = __importDefault(require("loglevel"));
|
|
10
|
+
const constants_1 = require("./constants");
|
|
10
11
|
const provide_cookie_access_1 = require("./utils/provide-cookie-access");
|
|
11
|
-
exports.INITIAL_METICULOUS_DOCS_URL = "https://app.meticulous.ai/docs/recording-a-test";
|
|
12
12
|
// Setup Meticulous recording
|
|
13
13
|
async function bootstrapPage({ page, recordingToken, appCommitHash, recordingSnippet, earlyNetworkRecorderSnippet, uploadIntervalMs, captureHttpOnlyCookies, recordingSource = "cli", }) {
|
|
14
14
|
const logger = loglevel_1.default.getLogger(common_1.METICULOUS_LOGGER_NAME);
|
|
@@ -21,7 +21,11 @@ async function bootstrapPage({ page, recordingToken, appCommitHash, recordingSni
|
|
|
21
21
|
page.on("framenavigated", async (frame) => {
|
|
22
22
|
try {
|
|
23
23
|
if (page.mainFrame() === frame) {
|
|
24
|
-
if (
|
|
24
|
+
if ([
|
|
25
|
+
constants_1.INITIAL_METICULOUS_RECORD_DOCS_URL,
|
|
26
|
+
constants_1.INITIAL_METICULOUS_RECORD_LOGIN_FLOW_DOCS_URL,
|
|
27
|
+
constants_1.METICULOUS_RECORD_LOGIN_FLOW_SAVING_DOCS_URL,
|
|
28
|
+
].includes(page.url())) {
|
|
25
29
|
if (page.mainFrame() === frame) {
|
|
26
30
|
await frame.evaluate('window["METICULOUS_DISABLED"] = true');
|
|
27
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.utils.js","sourceRoot":"","sources":["../../src/record/record.utils.ts"],"names":[],"mappings":";;;;;;AAAA,0CAAuC;AACvC,qDAAkE;AAClE,wDAA2B;AAE3B,
|
|
1
|
+
{"version":3,"file":"record.utils.js","sourceRoot":"","sources":["../../src/record/record.utils.ts"],"names":[],"mappings":";;;;;;AAAA,0CAAuC;AACvC,qDAAkE;AAClE,wDAA2B;AAE3B,2CAIqB;AACrB,yEAAoE;AAEpE,6BAA6B;AACtB,KAAK,UAAU,aAAa,CAAC,EAClC,IAAI,EACJ,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,2BAA2B,EAC3B,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,GAAG,KAAK,GAUxB;IACC,MAAM,MAAM,GAAG,kBAAG,CAAC,SAAS,CAAC,+BAAsB,CAAC,CAAC;IAErD,MAAM,oBAAoB,GAAG,MAAM,IAAA,mBAAQ,EAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACtE,MAAM,+BAA+B,GAAG,MAAM,IAAA,mBAAQ,EACpD,2BAA2B,EAC3B,MAAM,CACP,CAAC;IAEF,MAAM,IAAI,CAAC,qBAAqB,CAAC,+BAA+B,CAAC,CAAC;IAClE,IAAI,sBAAsB,EAAE;QAC1B,MAAM,IAAA,2CAAmB,EAAC,IAAI,CAAC,CAAC;KACjC;IAED,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACxC,IAAI;YACF,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,KAAK,EAAE;gBAC9B,IACE;oBACE,8CAAkC;oBAClC,yDAA6C;oBAC7C,wDAA4C;iBAC7C,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EACtB;oBACA,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,KAAK,EAAE;wBAC9B,MAAM,KAAK,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAC;qBAC9D;oBACD,OAAO;iBACR;gBACD,MAAM,KAAK,CAAC,QAAQ,CAAC;oDACuB,cAAc;oDACd,aAAa;;qDAEZ,eAAe;sDACd,gBAAgB;;SAE7D,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;gBAC3C,OAAO;aACR;YAED,MAAM,KAAK,CAAC,QAAQ,CAAC;;OAEpB,CAAC,CAAC;SACJ;QAAC,OAAO,KAAK,EAAE;YACd,sEAAsE;YACtE,IACE,KAAK,YAAY,KAAK;gBACtB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,iCAAiC,CAAC,EAC3D;gBACA,OAAO;aACR;YACD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;gBACtE,OAAO;aACR;YACD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACrB;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AA5ED,sCA4EC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.exposeNewRecordingCallback = void 0;
|
|
4
|
+
const exposeNewRecordingCallback = async (page, callback) => {
|
|
5
|
+
await page.exposeFunction("__meticulous_onBeginRecording", callback);
|
|
6
|
+
};
|
|
7
|
+
exports.exposeNewRecordingCallback = exposeNewRecordingCallback;
|
|
8
|
+
//# sourceMappingURL=expose-new-recording-callback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expose-new-recording-callback.js","sourceRoot":"","sources":["../../../src/record/utils/expose-new-recording-callback.ts"],"names":[],"mappings":";;;AAKO,MAAM,0BAA0B,GAAG,KAAK,EAG7C,IAAU,EACV,QAA6B,EAC7B,EAAE;IACF,MAAM,IAAI,CAAC,cAAc,CAAC,+BAA+B,EAAE,QAAQ,CAAC,CAAC;AACvE,CAAC,CAAC;AAPW,QAAA,0BAA0B,8BAOrC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.injectFinishRecordingFrame = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Injects an iframe that allows the user to finish recording.
|
|
6
|
+
*/
|
|
7
|
+
const injectFinishRecordingFrame = async (page, callbackFnName) => {
|
|
8
|
+
// Check that callbackFnName is a valid function name
|
|
9
|
+
const typeCheck = await page.evaluate(`typeof window["${callbackFnName}"]`);
|
|
10
|
+
if (typeCheck !== "function") {
|
|
11
|
+
throw new Error("Finish recording callback fn not ready in browser");
|
|
12
|
+
}
|
|
13
|
+
page.on("framenavigated", async (frame) => {
|
|
14
|
+
try {
|
|
15
|
+
if (page.mainFrame() !== frame) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
await frame.evaluate((callbackFnName) => {
|
|
19
|
+
window.addEventListener("load", () => {
|
|
20
|
+
const hasFinishRecordingIframe = !!document.getElementById("__meticulous__finish_recording_iframe");
|
|
21
|
+
if (hasFinishRecordingIframe) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const iframe = document.createElement("iframe");
|
|
25
|
+
iframe.style.position = "fixed";
|
|
26
|
+
iframe.style.bottom = "25px";
|
|
27
|
+
iframe.style.right = "25px";
|
|
28
|
+
iframe.style.width = "150px";
|
|
29
|
+
iframe.style.height = "50px";
|
|
30
|
+
iframe.style.border = "1px solid #000000a0";
|
|
31
|
+
iframe.style.boxShadow = "#00000012 5px 5px 5px";
|
|
32
|
+
iframe.style.borderRadius = "5px";
|
|
33
|
+
iframe.style.zIndex = (Math.pow(2, 31) - 1).toString();
|
|
34
|
+
iframe.id = "__meticulous__finish_recording_iframe";
|
|
35
|
+
document.body.appendChild(iframe);
|
|
36
|
+
const iframeDoc = iframe.contentDocument;
|
|
37
|
+
if (!iframeDoc) {
|
|
38
|
+
throw new Error("iframe document not found, this should not happen");
|
|
39
|
+
}
|
|
40
|
+
iframeDoc.open();
|
|
41
|
+
iframeDoc.write(`
|
|
42
|
+
<html>
|
|
43
|
+
<head>
|
|
44
|
+
<style>
|
|
45
|
+
body {
|
|
46
|
+
margin: 0;
|
|
47
|
+
background-color: transparent;
|
|
48
|
+
font-family: sans-serif;
|
|
49
|
+
}
|
|
50
|
+
#finish-recording {
|
|
51
|
+
width: 100%;
|
|
52
|
+
height: 100%;
|
|
53
|
+
border: 0;
|
|
54
|
+
background-color: #e39670;
|
|
55
|
+
cursor: pointer;
|
|
56
|
+
}
|
|
57
|
+
#finish-recording:hover {
|
|
58
|
+
background-color: #e9ab8b;
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
</style>
|
|
62
|
+
<script>
|
|
63
|
+
const finishRecording = () => {
|
|
64
|
+
window["${callbackFnName}"]?.();
|
|
65
|
+
};
|
|
66
|
+
</script>
|
|
67
|
+
</head>
|
|
68
|
+
<body style="margin: 0; background-color: transparent;">
|
|
69
|
+
<button id="finish-recording" onclick="finishRecording()">Finish Recording</button>
|
|
70
|
+
</body>
|
|
71
|
+
</html>
|
|
72
|
+
`);
|
|
73
|
+
iframeDoc.close();
|
|
74
|
+
});
|
|
75
|
+
}, callbackFnName);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error(err);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
exports.injectFinishRecordingFrame = injectFinishRecordingFrame;
|
|
83
|
+
//# sourceMappingURL=inject-finish-recording-frame.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inject-finish-recording-frame.js","sourceRoot":"","sources":["../../../src/record/utils/inject-finish-recording-frame.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACI,MAAM,0BAA0B,GAAG,KAAK,EAC7C,IAAU,EACV,cAAsB,EACP,EAAE;IACjB,qDAAqD;IACrD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,cAAc,IAAI,CAAC,CAAC;IAC5E,IAAI,SAAS,KAAK,UAAU,EAAE;QAC5B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;KACtE;IAED,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACxC,IAAI;YACF,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,KAAK,EAAE;gBAC9B,OAAO;aACR;YAED,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,EAAE;gBACtC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;oBACnC,MAAM,wBAAwB,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CACxD,uCAAuC,CACxC,CAAC;oBAEF,IAAI,wBAAwB,EAAE;wBAC5B,OAAO;qBACR;oBAED,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAChD,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;oBAChC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;oBAC7B,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;oBAC5B,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC;oBAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;oBAC7B,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,qBAAqB,CAAC;oBAC5C,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,uBAAuB,CAAC;oBACjD,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;oBAClC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACvD,MAAM,CAAC,EAAE,GAAG,uCAAuC,CAAC;oBACpD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBAElC,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC;oBACzC,IAAI,CAAC,SAAS,EAAE;wBACd,MAAM,IAAI,KAAK,CACb,mDAAmD,CACpD,CAAC;qBACH;oBACD,SAAS,CAAC,IAAI,EAAE,CAAC;oBACjB,SAAS,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;4BAuBE,cAAc;;;;;;;;SAQjC,CAAC,CAAC;oBACD,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,CAAC,CAAC,CAAC;YACL,CAAC,EAAE,cAAc,CAAC,CAAC;SACpB;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACpB;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AArFW,QAAA,0BAA0B,8BAqFrC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.printWarning = exports.printNoLoginSessionRecordedWarning = exports.printPageClosedWarning = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const printPageClosedWarning = () => {
|
|
9
|
+
(0, exports.printWarning)("Login flow session recording aborted. " +
|
|
10
|
+
"To complete the recording, please click the 'Finish recording' button.");
|
|
11
|
+
};
|
|
12
|
+
exports.printPageClosedWarning = printPageClosedWarning;
|
|
13
|
+
const printNoLoginSessionRecordedWarning = () => {
|
|
14
|
+
(0, exports.printWarning)("No login flow session was recorded. " +
|
|
15
|
+
"Record your flow by signing in into your application.");
|
|
16
|
+
};
|
|
17
|
+
exports.printNoLoginSessionRecordedWarning = printNoLoginSessionRecordedWarning;
|
|
18
|
+
const printWarning = (message) => {
|
|
19
|
+
const padding = 4; // Add extra padding for visibility
|
|
20
|
+
const paddedMessage = " ".repeat(padding) + message + " ".repeat(padding);
|
|
21
|
+
const border = chalk_1.default.red.bold("-".repeat(paddedMessage.length));
|
|
22
|
+
console.log(border);
|
|
23
|
+
console.log(chalk_1.default.red.bold(paddedMessage));
|
|
24
|
+
console.log(border);
|
|
25
|
+
};
|
|
26
|
+
exports.printWarning = printWarning;
|
|
27
|
+
//# sourceMappingURL=print-warning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-warning.js","sourceRoot":"","sources":["../../../src/record/utils/print-warning.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAEnB,MAAM,sBAAsB,GAAG,GAAS,EAAE;IAC/C,IAAA,oBAAY,EACV,wCAAwC;QACtC,wEAAwE,CAC3E,CAAC;AACJ,CAAC,CAAC;AALW,QAAA,sBAAsB,0BAKjC;AAEK,MAAM,kCAAkC,GAAG,GAAS,EAAE;IAC3D,IAAA,oBAAY,EACV,sCAAsC;QACpC,uDAAuD,CAC1D,CAAC;AACJ,CAAC,CAAC;AALW,QAAA,kCAAkC,sCAK7C;AAEK,MAAM,YAAY,GAAG,CAAC,OAAe,EAAQ,EAAE;IACpD,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,mCAAmC;IACtD,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AARW,QAAA,YAAY,gBAQvB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwaysmeticulous/record",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.95.0",
|
|
4
4
|
"description": "The Meticulous toolkit to record user sessions",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@alwaysmeticulous/api": "^2.92.0",
|
|
23
|
-
"@alwaysmeticulous/common": "^2.
|
|
23
|
+
"@alwaysmeticulous/common": "^2.95.0",
|
|
24
|
+
"chalk": "^4.1.2",
|
|
24
25
|
"loglevel": "^1.8.0",
|
|
25
26
|
"puppeteer": "21.3.8"
|
|
26
27
|
},
|
|
@@ -41,5 +42,5 @@
|
|
|
41
42
|
"bugs": {
|
|
42
43
|
"url": "https://github.com/alwaysmeticulous/meticulous-sdk/issues"
|
|
43
44
|
},
|
|
44
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "3f3b227e5c9ba524d06b75719d65150728db558a"
|
|
45
46
|
}
|