@alwaysmeticulous/record 2.94.0 → 2.96.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 CHANGED
@@ -1,2 +1,3 @@
1
1
  export { recordSession } from "./record/record";
2
+ export { recordLoginFlowSession } from "./record/record-login-flow";
2
3
  export { bootstrapPage as bootstrapRecordingPage } from "./record/record.utils";
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 { RecordLoginFlowOptions } from "../types";
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: ({ recordingToken, devTools, bypassCSP, recordingSnippetManualInit, width, height, uploadIntervalMs, captureHttpOnlyCookies, }: RecordLoginFlowOptions) => Promise<void>;
@@ -0,0 +1,136 @@
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, recordingSnippetManualInit, 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
+ recordingSnippetManualInit,
28
+ uploadIntervalMs: uploadIntervalMs || constants_1.DEFAULT_UPLOAD_INTERVAL_MS,
29
+ captureHttpOnlyCookies: captureHttpOnlyCookies !== null && captureHttpOnlyCookies !== void 0 ? captureHttpOnlyCookies : true,
30
+ recordingSource,
31
+ });
32
+ };
33
+ const recordLoginFlowSession = async ({ recordingToken, devTools, bypassCSP, recordingSnippetManualInit, width, height, uploadIntervalMs, captureHttpOnlyCookies, }) => {
34
+ const logger = loglevel_1.default.getLogger(common_1.METICULOUS_LOGGER_NAME);
35
+ logger.info("Opening browser...");
36
+ const defaultViewport = width && height ? { width, height } : null;
37
+ const browser = await (0, puppeteer_1.launch)({
38
+ defaultViewport,
39
+ headless: false,
40
+ devtools: devTools || false,
41
+ });
42
+ const context = await browser.createIncognitoBrowserContext();
43
+ await Promise.all((await browser.pages()).map((page) => page.close()));
44
+ const loginFlowPage = await context.newPage();
45
+ await bootstrapLoginFlowRecordingPage({
46
+ page: loginFlowPage,
47
+ recordingToken,
48
+ recordingSnippetManualInit,
49
+ uploadIntervalMs,
50
+ captureHttpOnlyCookies,
51
+ bypassCSP,
52
+ recordingSource: exports.LOGIN_FLOW_SESSION_RECORDING_SOURCE,
53
+ });
54
+ let isRecordingComplete = false;
55
+ let onDataSessionSaved = false;
56
+ let startedLoginSessionRecording = false;
57
+ const recordingCompleteCallback = (0, common_1.defer)();
58
+ loginFlowPage.on("close", () => {
59
+ if (!isRecordingComplete) {
60
+ (0, print_warning_1.printPageClosedWarning)();
61
+ // Resolve the callback only if the page is closed before the recording is complete.
62
+ // Cases where the page is closed after the recording is complete are handled
63
+ // in the `__meticulousFinishRecording` callback.
64
+ recordingCompleteCallback.resolve();
65
+ }
66
+ });
67
+ // Expose login page functions
68
+ await (0, expose_new_recording_callback_1.exposeNewRecordingCallback)(loginFlowPage, () => {
69
+ startedLoginSessionRecording = true;
70
+ });
71
+ await loginFlowPage.exposeFunction("__meticulousFinishRecording", async () => {
72
+ const loginDataPage = await context.newPage();
73
+ const finalLoginUrl = loginFlowPage.url();
74
+ loginDataPage.on("close", () => {
75
+ if (!onDataSessionSaved) {
76
+ (0, print_warning_1.printPageClosedWarning)();
77
+ }
78
+ });
79
+ try {
80
+ const recordingSavingScreenPage = await context.newPage();
81
+ await recordingSavingScreenPage.goto(constants_1.METICULOUS_RECORD_LOGIN_FLOW_SAVING_DOCS_URL);
82
+ // Flush any pending payloads from the main login flow recording page and close it
83
+ await loginFlowPage.evaluate(() => {
84
+ var _a, _b;
85
+ (_b = (_a = window.__meticulous) === null || _a === void 0 ? void 0 : _a.flushPendingPayloads) === null || _b === void 0 ? void 0 : _b.call(_a);
86
+ });
87
+ isRecordingComplete = true;
88
+ await loginFlowPage.close();
89
+ await bootstrapLoginFlowRecordingPage({
90
+ page: loginDataPage,
91
+ recordingToken,
92
+ recordingSnippetManualInit,
93
+ uploadIntervalMs: uploadIntervalMs,
94
+ captureHttpOnlyCookies: captureHttpOnlyCookies,
95
+ bypassCSP,
96
+ recordingSource: exports.LOGIN_FLOW_DATA_SESSION_RECORDING_SOURCE,
97
+ });
98
+ // Navigate to the final login flow url and flush any pending payloads
99
+ await loginDataPage.goto(finalLoginUrl, { waitUntil: "networkidle0" });
100
+ await loginDataPage.evaluate(() => {
101
+ var _a, _b;
102
+ (_b = (_a = window.__meticulous) === null || _a === void 0 ? void 0 : _a.flushPendingPayloads) === null || _b === void 0 ? void 0 : _b.call(_a);
103
+ });
104
+ onDataSessionSaved = true;
105
+ await loginDataPage.close();
106
+ }
107
+ catch (error) {
108
+ logger.error(error);
109
+ }
110
+ finally {
111
+ recordingCompleteCallback.resolve();
112
+ }
113
+ });
114
+ await (0, inject_finish_recording_frame_1.injectFinishRecordingFrame)(loginFlowPage, "__meticulousFinishRecording");
115
+ await loginFlowPage.goto(constants_1.INITIAL_METICULOUS_RECORD_LOGIN_FLOW_DOCS_URL);
116
+ // Wait for the recording to complete or the page to close.
117
+ await recordingCompleteCallback.promise;
118
+ if (!loginFlowPage.isClosed()) {
119
+ await loginFlowPage.close();
120
+ }
121
+ await context.close();
122
+ await browser.close();
123
+ if (!onDataSessionSaved || !isRecordingComplete) {
124
+ throw new Error("Recording of login flow failed");
125
+ }
126
+ if (!startedLoginSessionRecording) {
127
+ (0, print_warning_1.printNoLoginSessionRecordedWarning)();
128
+ throw new Error("Recording of login flow failed");
129
+ }
130
+ // Print green success message
131
+ logger.info(chalk_1.default.green.bold("Recording complete!") +
132
+ "\n" +
133
+ chalk_1.default.green.bold("Return to https://app.meticulous.ai to finish setting up your project."));
134
+ };
135
+ exports.recordLoginFlowSession = recordLoginFlowSession;
136
+ //# 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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"}
@@ -1,2 +1,2 @@
1
- import { RecordSessionFn } from "@alwaysmeticulous/common";
2
- export declare const recordSession: RecordSessionFn;
1
+ import { RecordSessionOptions } from "../types";
2
+ export declare const recordSession: ({ recordingToken, appCommitHash, devTools, bypassCSP, recordingSnippetManualInit, width, height, uploadIntervalMs, incognito, cookieDir, debugLogger, onDetectedSession, captureHttpOnlyCookies, }: RecordSessionOptions) => Promise<void>;
@@ -32,21 +32,19 @@ 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 ({ browser: browser_, project, recordingToken, appCommitHash, devTools, bypassCSP, recordingSnippet, earlyNetworkRecorderSnippet, width, height, uploadIntervalMs, incognito, cookieDir, debugLogger, onDetectedSession, captureHttpOnlyCookies, }) => {
38
+ const recordSession = async ({ recordingToken, appCommitHash, devTools, bypassCSP, recordingSnippetManualInit, 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,
48
46
  bypassCSP,
49
- recordingSnippet,
47
+ recordingSnippetManualInit,
50
48
  width,
51
49
  height,
52
50
  uploadIntervalMs,
@@ -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 = browser_ ||
79
- (await (0, puppeteer_1.launch)({
80
- defaultViewport,
81
- headless: false,
82
- devtools: devTools || false,
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(120000); // 2 minutes
86
+ page.setDefaultNavigationTimeout(constants_1.DEFAULT_NAVIGATION_TIMEOUT_MS); // 2 minutes
90
87
  if (bypassCSP) {
91
88
  await page.setBypassCSP(true);
92
89
  }
@@ -106,12 +103,11 @@ const recordSession = async ({ browser: browser_, project, recordingToken, appCo
106
103
  page,
107
104
  recordingToken,
108
105
  appCommitHash,
109
- recordingSnippet,
110
- earlyNetworkRecorderSnippet,
111
- uploadIntervalMs: uploadIntervalMs || DEFAULT_UPLOAD_INTERVAL_MS,
106
+ recordingSnippetManualInit,
107
+ uploadIntervalMs: uploadIntervalMs || constants_1.DEFAULT_UPLOAD_INTERVAL_MS,
112
108
  captureHttpOnlyCookies: captureHttpOnlyCookies !== null && captureHttpOnlyCookies !== void 0 ? captureHttpOnlyCookies : true,
113
109
  });
114
- page.goto(record_utils_1.INITIAL_METICULOUS_DOCS_URL);
110
+ page.goto(constants_1.INITIAL_METICULOUS_RECORD_DOCS_URL);
115
111
  logger.info("Browser ready");
116
112
  // Collect and show recorded session ids
117
113
  // Also save page cookies if not in incognito context
@@ -121,10 +117,6 @@ const recordSession = async ({ browser: browser_, project, recordingToken, appCo
121
117
  const sessionId = await page.evaluate("window?.__meticulous?.config?.sessionId");
122
118
  if (sessionId && !sessionIds.find((id) => id === sessionId)) {
123
119
  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
120
  if (onDetectedSession) {
129
121
  onDetectedSession(sessionId);
130
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/record/record.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/record/record.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,9 @@
1
1
  import { Page } from "puppeteer";
2
- export declare const INITIAL_METICULOUS_DOCS_URL = "https://app.meticulous.ai/docs/recording-a-test";
3
- export declare function bootstrapPage({ page, recordingToken, appCommitHash, recordingSnippet, earlyNetworkRecorderSnippet, uploadIntervalMs, captureHttpOnlyCookies, recordingSource, }: {
2
+ export declare function bootstrapPage({ page, recordingToken, appCommitHash, recordingSnippetManualInit, uploadIntervalMs, captureHttpOnlyCookies, recordingSource, }: {
4
3
  page: Page;
5
4
  recordingToken: string;
6
5
  appCommitHash: string;
7
- recordingSnippet: string;
8
- earlyNetworkRecorderSnippet: string;
6
+ recordingSnippetManualInit: string;
9
7
  uploadIntervalMs: number | null;
10
8
  captureHttpOnlyCookies: boolean;
11
9
  recordingSource?: string;
@@ -1,59 +1,43 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.bootstrapPage = exports.INITIAL_METICULOUS_DOCS_URL = void 0;
3
+ exports.bootstrapPage = void 0;
7
4
  const promises_1 = require("fs/promises");
8
- const common_1 = require("@alwaysmeticulous/common");
9
- const loglevel_1 = __importDefault(require("loglevel"));
5
+ const constants_1 = require("./constants");
10
6
  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
7
  // Setup Meticulous recording
13
- async function bootstrapPage({ page, recordingToken, appCommitHash, recordingSnippet, earlyNetworkRecorderSnippet, uploadIntervalMs, captureHttpOnlyCookies, recordingSource = "cli", }) {
14
- const logger = loglevel_1.default.getLogger(common_1.METICULOUS_LOGGER_NAME);
15
- const recordingSnippetFile = await (0, promises_1.readFile)(recordingSnippet, "utf8");
16
- const earlyNetworkRecorderSnippetFile = await (0, promises_1.readFile)(earlyNetworkRecorderSnippet, "utf8");
17
- await page.evaluateOnNewDocument(earlyNetworkRecorderSnippetFile);
18
- if (captureHttpOnlyCookies) {
19
- await (0, provide_cookie_access_1.provideCookieAccess)(page);
20
- }
21
- page.on("framenavigated", async (frame) => {
22
- try {
23
- if (page.mainFrame() === frame) {
24
- if (page.url() === exports.INITIAL_METICULOUS_DOCS_URL) {
25
- if (page.mainFrame() === frame) {
26
- await frame.evaluate('window["METICULOUS_DISABLED"] = true');
27
- }
28
- return;
29
- }
30
- await frame.evaluate(`
31
- window["METICULOUS_RECORDING_TOKEN"] = "${recordingToken}";
32
- window["METICULOUS_APP_COMMIT_HASH"] = "${appCommitHash}";
33
- window["METICULOUS_FORCE_RECORDING"] = true;
34
- window["METICULOUS_RECORDING_SOURCE"] = "${recordingSource}";
35
- window["METICULOUS_UPLOAD_INTERVAL_MS"] = ${uploadIntervalMs};
36
- window["METICULOUS_ENABLE_RRWEB_PLUGIN_NODE_DATA"] = true;
37
- `);
38
- await frame.evaluate(recordingSnippetFile);
39
- return;
40
- }
41
- await frame.evaluate(`
42
- window.__meticulous?.earlyNetworkRecorder?.polly?.disconnect?.();
43
- `);
8
+ async function bootstrapPage({ page, recordingToken, appCommitHash, recordingSnippetManualInit, uploadIntervalMs, captureHttpOnlyCookies, recordingSource = "cli", }) {
9
+ const recordingSnippetFile = await (0, promises_1.readFile)(recordingSnippetManualInit, "utf8");
10
+ await page.evaluateOnNewDocument(({ recordingToken, appCommitHash, recordingSource, uploadIntervalMs }) => {
11
+ const recorderWindow = window;
12
+ recorderWindow["METICULOUS_RECORDING_TOKEN"] = recordingToken;
13
+ recorderWindow["METICULOUS_APP_COMMIT_HASH"] = appCommitHash;
14
+ recorderWindow["METICULOUS_FORCE_RECORDING"] = true;
15
+ recorderWindow["METICULOUS_RECORDING_SOURCE"] = recordingSource;
16
+ recorderWindow["METICULOUS_ENABLE_RRWEB_PLUGIN_NODE_DATA"] = true;
17
+ if (uploadIntervalMs != null) {
18
+ recorderWindow["METICULOUS_UPLOAD_INTERVAL_MS"] = uploadIntervalMs;
44
19
  }
45
- catch (error) {
46
- // Suppress expected errors due to page navigation or tab being closed
47
- if (error instanceof Error &&
48
- error.message.startsWith("Execution context was destroyed")) {
49
- return;
20
+ }, { recordingToken, appCommitHash, recordingSource, uploadIntervalMs });
21
+ await page.evaluateOnNewDocument(recordingSnippetFile);
22
+ await page.evaluateOnNewDocument((forbiddenUrls) => {
23
+ var _a;
24
+ // We only record in the root frame (not in sub-iframes), and we don't record on the built in start pages
25
+ if (window === window.parent &&
26
+ !forbiddenUrls.includes(window.document.location.toString())) {
27
+ const initRecorder = (_a = window.__meticulous) === null || _a === void 0 ? void 0 : _a.initialiseRecorder;
28
+ if (!initRecorder) {
29
+ throw new Error("window.__meticulous.initialiseRecorder is null or undefined: cannot record session on page");
50
30
  }
51
- if (error instanceof Error && error.message.endsWith("Target closed.")) {
52
- return;
53
- }
54
- logger.error(error);
31
+ initRecorder();
55
32
  }
56
- });
33
+ }, [
34
+ constants_1.INITIAL_METICULOUS_RECORD_DOCS_URL,
35
+ constants_1.INITIAL_METICULOUS_RECORD_LOGIN_FLOW_DOCS_URL,
36
+ constants_1.METICULOUS_RECORD_LOGIN_FLOW_SAVING_DOCS_URL,
37
+ ]);
38
+ if (captureHttpOnlyCookies) {
39
+ await (0, provide_cookie_access_1.provideCookieAccess)(page);
40
+ }
57
41
  }
58
42
  exports.bootstrapPage = bootstrapPage;
59
43
  //# sourceMappingURL=record.utils.js.map
@@ -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,yEAAoE;AAEvD,QAAA,2BAA2B,GACtC,iDAAiD,CAAC;AAEpD,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,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,mCAA2B,EAAE;oBAC9C,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;AAtED,sCAsEC"}
1
+ {"version":3,"file":"record.utils.js","sourceRoot":"","sources":["../../src/record/record.utils.ts"],"names":[],"mappings":";;;AAAA,0CAAuC;AAIvC,2CAIqB;AACrB,yEAAoE;AAepE,6BAA6B;AACtB,KAAK,UAAU,aAAa,CAAC,EAClC,IAAI,EACJ,cAAc,EACd,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,GAAG,KAAK,GASxB;IACC,MAAM,oBAAoB,GAAG,MAAM,IAAA,mBAAQ,EACzC,0BAA0B,EAC1B,MAAM,CACP,CAAC;IAEF,MAAM,IAAI,CAAC,qBAAqB,CAC9B,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,EAAE,EAAE;QACvE,MAAM,cAAc,GAAG,MAAkC,CAAC;QAC1D,cAAc,CAAC,4BAA4B,CAAC,GAAG,cAAc,CAAC;QAC9D,cAAc,CAAC,4BAA4B,CAAC,GAAG,aAAa,CAAC;QAC7D,cAAc,CAAC,4BAA4B,CAAC,GAAG,IAAI,CAAC;QACpD,cAAc,CAAC,6BAA6B,CAAC,GAAG,eAAe,CAAC;QAChE,cAAc,CAAC,0CAA0C,CAAC,GAAG,IAAI,CAAC;QAElE,IAAI,gBAAgB,IAAI,IAAI,EAAE;YAC5B,cAAc,CAAC,+BAA+B,CAAC,GAAG,gBAAgB,CAAC;SACpE;IACH,CAAC,EACD,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,CACrE,CAAC;IACF,MAAM,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;IACvD,MAAM,IAAI,CAAC,qBAAqB,CAC9B,CAAC,aAAa,EAAE,EAAE;;QAChB,yGAAyG;QACzG,IACE,MAAM,KAAK,MAAM,CAAC,MAAM;YACxB,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAC5D;YACA,MAAM,YAAY,GAAG,MAAC,MAAmC,CAAC,YAAY,0CAClE,kBAAkB,CAAC;YACvB,IAAI,CAAC,YAAY,EAAE;gBACjB,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;aACH;YACD,YAAY,EAAE,CAAC;SAChB;IACH,CAAC,EACD;QACE,8CAAkC;QAClC,yDAA6C;QAC7C,wDAA4C;KAC7C,CACF,CAAC;IAEF,IAAI,sBAAsB,EAAE;QAC1B,MAAM,IAAA,2CAAmB,EAAC,IAAI,CAAC,CAAC;KACjC;AACH,CAAC;AAjED,sCAiEC"}
@@ -0,0 +1,5 @@
1
+ import { Page } from "puppeteer";
2
+ export interface BaseMeticulousConfig {
3
+ sessionId: string;
4
+ }
5
+ export declare const exposeNewRecordingCallback: <T extends BaseMeticulousConfig>(page: Page, callback: (config: T) => void) => Promise<void>;
@@ -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,5 @@
1
+ import { Page } from "puppeteer";
2
+ /**
3
+ * Injects an iframe that allows the user to finish recording.
4
+ */
5
+ export declare const injectFinishRecordingFrame: (page: Page, callbackFnName: string) => Promise<void>;
@@ -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,3 @@
1
+ export declare const printPageClosedWarning: () => void;
2
+ export declare const printNoLoginSessionRecordedWarning: () => void;
3
+ export declare const printWarning: (message: string) => void;
@@ -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"}
@@ -0,0 +1,17 @@
1
+ import { DebugLogger } from "@alwaysmeticulous/common";
2
+ export interface RecordSessionOptions {
3
+ recordingToken: string;
4
+ appCommitHash: string;
5
+ devTools?: boolean | null | undefined;
6
+ bypassCSP?: boolean | null | undefined;
7
+ recordingSnippetManualInit: string;
8
+ width?: number | null | undefined;
9
+ height?: number | null | undefined;
10
+ uploadIntervalMs?: number | null | undefined;
11
+ incognito?: boolean | null | undefined;
12
+ cookieDir?: string | null | undefined;
13
+ debugLogger?: DebugLogger | null | undefined;
14
+ captureHttpOnlyCookies?: boolean;
15
+ onDetectedSession?: (sessionId: string) => void;
16
+ }
17
+ export type RecordLoginFlowOptions = Omit<RecordSessionOptions, "appCommitHash" | "incognito" | "cookieDir" | "debugLogger" | "onDetectedSession">;
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alwaysmeticulous/record",
3
- "version": "2.94.0",
3
+ "version": "2.96.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.92.0",
23
+ "@alwaysmeticulous/common": "^2.96.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": "4533909b62055176163b30bf29c5f81195593fa7"
45
+ "gitHead": "cb5605b9b796fc355ea7854fa39ec02b03232dab"
45
46
  }