@memlab/core 1.1.4 → 1.1.5

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
@@ -7,6 +7,8 @@
7
7
  * @emails oncall+ws_labs
8
8
  * @format
9
9
  */
10
+ /** @internal */
11
+ export declare function registerPackage(): Promise<void>;
10
12
  export * from './lib/Types';
11
13
  /** @internal */
12
14
  export { default as config } from './lib/Config';
@@ -42,5 +44,7 @@ export { default as leakClusterLogger } from './logger/LeakClusterLogger';
42
44
  export { default as NormalizedTrace } from './trace-cluster/TraceBucket';
43
45
  /** @internal */
44
46
  export { default as EvaluationMetric } from './trace-cluster/EvalutationMetric';
47
+ /** @internal */
48
+ export * from './lib/PackageInfoLoader';
45
49
  export * from './lib/NodeHeap';
46
50
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -22,11 +22,29 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
22
22
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
23
23
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
24
24
  };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
25
34
  var __importDefault = (this && this.__importDefault) || function (mod) {
26
35
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
36
  };
28
37
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.EvaluationMetric = exports.NormalizedTrace = exports.leakClusterLogger = exports.ProcessManager = exports.modes = exports.constant = exports.analysis = exports.browserInfo = exports.serializer = exports.fileManager = exports.utils = exports.BaseOption = exports.info = exports.config = void 0;
38
+ exports.EvaluationMetric = exports.NormalizedTrace = exports.leakClusterLogger = exports.ProcessManager = exports.modes = exports.constant = exports.analysis = exports.browserInfo = exports.serializer = exports.fileManager = exports.utils = exports.BaseOption = exports.info = exports.config = exports.registerPackage = void 0;
39
+ const path_1 = __importDefault(require("path"));
40
+ const PackageInfoLoader_1 = require("./lib/PackageInfoLoader");
41
+ /** @internal */
42
+ function registerPackage() {
43
+ return __awaiter(this, void 0, void 0, function* () {
44
+ return PackageInfoLoader_1.PackageInfoLoader.registerPackage(path_1.default.join(__dirname, '..'));
45
+ });
46
+ }
47
+ exports.registerPackage = registerPackage;
30
48
  __exportStar(require("./lib/Types"), exports);
31
49
  /** @internal */
32
50
  var Config_1 = require("./lib/Config");
@@ -76,4 +94,6 @@ Object.defineProperty(exports, "NormalizedTrace", { enumerable: true, get: funct
76
94
  /** @internal */
77
95
  var EvalutationMetric_1 = require("./trace-cluster/EvalutationMetric");
78
96
  Object.defineProperty(exports, "EvaluationMetric", { enumerable: true, get: function () { return __importDefault(EvalutationMetric_1).default; } });
97
+ /** @internal */
98
+ __exportStar(require("./lib/PackageInfoLoader"), exports);
79
99
  __exportStar(require("./lib/NodeHeap"), exports);
@@ -8,7 +8,7 @@
8
8
  * @format
9
9
  */
10
10
  import type { LaunchOptions, Permission } from 'puppeteer';
11
- import type { AnyFunction, AnyValue, IClusterStrategy, IRunningMode, IScenario, Nullable, Optional, QuickExperiment, ILeakFilter } from './Types';
11
+ import type { AnyFunction, AnyValue, IClusterStrategy, IRunningMode, IScenario, Nullable, Optional, QuickExperiment, ILeakFilter, IPackageInfo } from './Types';
12
12
  interface BrowserLaunchArgumentOptions {
13
13
  headless?: boolean;
14
14
  userDataDir?: string;
@@ -44,14 +44,19 @@ export declare enum ErrorHandling {
44
44
  }
45
45
  /** @internal */
46
46
  export declare class MemLabConfig {
47
- snapshotHasDetachedness: boolean;
48
- specifiedEngine: boolean;
49
- verbose: boolean;
50
- jsEngine: string;
51
47
  _reportLeaksInTimers: boolean;
52
48
  _deviceManualOverridden: boolean;
53
49
  _timerNodes: string[];
54
50
  _timerEdges: string[];
51
+ _isFullRun: boolean;
52
+ _scenario: Optional<IScenario>;
53
+ _isHeadfulBrowser: boolean;
54
+ _browser: string;
55
+ _packageInfo: IPackageInfo[];
56
+ snapshotHasDetachedness: boolean;
57
+ specifiedEngine: boolean;
58
+ verbose: boolean;
59
+ jsEngine: string;
55
60
  targetApp: string;
56
61
  targetTab: string;
57
62
  analysisMode: string;
@@ -94,7 +99,6 @@ export declare class MemLabConfig {
94
99
  puppeteerConfig: LaunchOptions & BrowserLaunchArgumentOptions & BrowserConnectOptions;
95
100
  openDevtoolsConsole: boolean;
96
101
  emulateDevice: Nullable<Device>;
97
- _browser: string;
98
102
  addEnableGK: Set<string>;
99
103
  addDisableGK: Set<string>;
100
104
  qes: QuickExperiment[];
@@ -169,9 +173,6 @@ export declare class MemLabConfig {
169
173
  oversizeObjectAsLeak: boolean;
170
174
  oversizeThreshold: number;
171
175
  clusterRetainedSizeThreshold: number;
172
- _isFullRun: boolean;
173
- _scenario: Optional<IScenario>;
174
- _isHeadfulBrowser: boolean;
175
176
  externalLeakFilter?: Optional<ILeakFilter>;
176
177
  monoRepoDir: string;
177
178
  muteConsole: boolean;
@@ -97,6 +97,8 @@ class MemLabConfig {
97
97
  this.jsEngine = Constant_1.default.defaultEngine;
98
98
  // the default browser (Chromium)
99
99
  this._browser = 'chrome';
100
+ // a list of package information
101
+ this._packageInfo = [];
100
102
  // a set of additional GKs to be enabled
101
103
  this.addEnableGK = new Set();
102
104
  // a set of additional GKs to be disabled
@@ -0,0 +1,7 @@
1
+ /** @internal */
2
+ export declare class PackageInfoLoader {
3
+ private static registeredPackages;
4
+ private static loadFrom;
5
+ static registerPackage(packageDirectory: string): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=PackageInfoLoader.d.ts.map
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.PackageInfoLoader = void 0;
16
+ /**
17
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
18
+ *
19
+ * This source code is licensed under the MIT license found in the
20
+ * LICENSE file in the root directory of this source tree.
21
+ *
22
+ * @emails oncall+ws_labs
23
+ * @format
24
+ */
25
+ const fs_extra_1 = __importDefault(require("fs-extra"));
26
+ const path_1 = __importDefault(require("path"));
27
+ const Config_1 = __importDefault(require("./Config"));
28
+ const Utils_1 = __importDefault(require("./Utils"));
29
+ /** @internal */
30
+ class PackageInfoLoader {
31
+ static loadFrom(packageDirectory) {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ let exists = yield fs_extra_1.default.pathExists(packageDirectory);
34
+ if (!exists) {
35
+ throw Utils_1.default.haltOrThrow(`package directory doesn't exist: ${packageDirectory}`);
36
+ }
37
+ let packageJSONFile = path_1.default.join(packageDirectory, 'package-oss.json');
38
+ exists = yield fs_extra_1.default.pathExists(packageJSONFile);
39
+ if (!exists) {
40
+ packageJSONFile = path_1.default.join(packageDirectory, 'package.json');
41
+ }
42
+ exists = yield fs_extra_1.default.pathExists(packageJSONFile);
43
+ if (!exists) {
44
+ throw Utils_1.default.haltOrThrow(`package.json doesn't exist: ${packageJSONFile}`);
45
+ }
46
+ try {
47
+ const metaData = yield fs_extra_1.default.readJSON(packageJSONFile, 'UTF-8');
48
+ return Object.assign(Object.assign({}, metaData), { packageLocation: packageDirectory });
49
+ }
50
+ catch (ex) {
51
+ throw Utils_1.default.haltOrThrow(Utils_1.default.getError(ex));
52
+ }
53
+ });
54
+ }
55
+ static registerPackage(packageDirectory) {
56
+ return __awaiter(this, void 0, void 0, function* () {
57
+ if (!PackageInfoLoader.registeredPackages.has(packageDirectory)) {
58
+ PackageInfoLoader.registeredPackages.add(packageDirectory);
59
+ const packageInfo = yield PackageInfoLoader.loadFrom(packageDirectory);
60
+ Config_1.default._packageInfo.push(packageInfo);
61
+ }
62
+ });
63
+ }
64
+ }
65
+ exports.PackageInfoLoader = PackageInfoLoader;
66
+ PackageInfoLoader.registeredPackages = new Set();
@@ -120,6 +120,12 @@ export interface E2EScenarioSynthesizerConstructor {
120
120
  new (config: Config): IE2EScenarioSynthesizer;
121
121
  }
122
122
  /** @internal */
123
+ export interface IPackageInfo {
124
+ name: string;
125
+ version: string;
126
+ packageLocation?: string;
127
+ }
128
+ /** @internal */
123
129
  export interface IRunningMode {
124
130
  setConfig(config: Config): void;
125
131
  beforeRunning(visitPlan: IE2EScenarioVisitPlan): void;
@@ -451,6 +457,10 @@ export interface IScenario {
451
457
  * `back` is the callback function that specifies how memlab should
452
458
  * back/revert the `action` callback. Think of it as an undo action.
453
459
  *
460
+ * * **Parameters**:
461
+ * * page: `Page` | the puppeteer [`Page`](https://pptr.dev/api/puppeteer.page)
462
+ * object, which provides APIs to interact with the web browser
463
+ *
454
464
  * * **Examples**:
455
465
  * ```typescript
456
466
  * const scenario = {
@@ -675,6 +685,10 @@ export interface IDataBuilder {
675
685
  /**
676
686
  * Callback function to provide if the page is loaded.
677
687
  * @param page - puppeteer's [Page](https://pptr.dev/api/puppeteer.page/) object.
688
+ * @returns a boolean value, if it returns `true`, memlab will consider
689
+ * the navigation completes, if it returns `false`, memlab will keep calling
690
+ * this callback until it returns `true`. This is an async callback, you can
691
+ * also `await` and returns `true` until some async logic is resolved.
678
692
  */
679
693
  export declare type CheckPageLoadCallback = (page: Page) => Promise<boolean>;
680
694
  /** @internal */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memlab/core",
3
- "version": "1.1.4",
3
+ "version": "1.1.5",
4
4
  "license": "MIT",
5
5
  "description": "memlab core libraries",
6
6
  "author": "Liang Gong <lgong@fb.com>",