@memberjunction/react-test-harness 2.70.0 → 2.72.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/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/lib/component-runner.d.ts +53 -5
- package/dist/lib/component-runner.d.ts.map +1 -1
- package/dist/lib/component-runner.js +540 -107
- package/dist/lib/component-runner.js.map +1 -1
- package/dist/lib/test-harness.d.ts +18 -5
- package/dist/lib/test-harness.d.ts.map +1 -1
- package/dist/lib/test-harness.js +50 -45
- package/dist/lib/test-harness.js.map +1 -1
- package/package.json +3 -2
package/dist/cli/index.js
CHANGED
|
@@ -80,7 +80,7 @@ program
|
|
|
80
80
|
console.log(chalk_1.default.green('✓ Component rendered successfully'));
|
|
81
81
|
if (options.debug) {
|
|
82
82
|
console.log('\n' + chalk_1.default.bold('Console Output:'));
|
|
83
|
-
result.console.forEach(log => {
|
|
83
|
+
result.console.forEach((log) => {
|
|
84
84
|
const color = log.type === 'error' ? chalk_1.default.red :
|
|
85
85
|
log.type === 'warning' ? chalk_1.default.yellow :
|
|
86
86
|
chalk_1.default.gray;
|
|
@@ -95,7 +95,7 @@ program
|
|
|
95
95
|
else {
|
|
96
96
|
console.log(chalk_1.default.red('✗ Component rendering failed'));
|
|
97
97
|
console.log(chalk_1.default.red('\nErrors:'));
|
|
98
|
-
result.errors.forEach(error => {
|
|
98
|
+
result.errors.forEach((error) => {
|
|
99
99
|
console.log(chalk_1.default.red(` - ${error}`));
|
|
100
100
|
});
|
|
101
101
|
process.exit(1);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAoC;AACpC,2CAA6B;AAC7B,uCAAyB;AACzB,kDAA0B;AAC1B,8CAAsB;AACtB,sDAAuD;AAEvD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,eAAe,CAAC;KACrB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,OAAO,CAAC,QAAQ,CAAC,CAAC;AAErB,OAAO;KACJ,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,oBAAoB,EAAE,gCAAgC,CAAC;KAC9D,MAAM,CAAC,2BAA2B,EAAE,oCAAoC,CAAC;KACzE,MAAM,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,OAAO,CAAC;KAChE,MAAM,CAAC,YAAY,EAAE,gCAAgC,EAAE,IAAI,CAAC;KAC5D,MAAM,CAAC,UAAU,EAAE,sCAAsC,CAAC;KAC1D,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;KACxD,MAAM,CAAC,SAAS,EAAE,qBAAqB,CAAC;KACxC,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE;IACvC,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,8BAA8B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE5D,IAAI,CAAC;QACH,0BAA0B;QAC1B,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,MAAM,OAAO,GAAG,IAAI,+BAAgB,CAAC;YACnC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,cAAc,EAAE,OAAO,CAAC,UAAU;SACnC,CAAC,CAAC;QAEH,OAAO,CAAC,IAAI,GAAG,qBAAqB,CAAC;QACrC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAE3B,OAAO,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAChD,aAAa,EACb,KAAK,EACL;YACE,eAAe,EAAE,OAAO,CAAC,QAAQ;YACjC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;SACnC,CACF,CAAC;QAEF,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;YAE9D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAClD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { BrowserManager } from './browser-context';
|
|
3
3
|
export interface ComponentExecutionOptions {
|
|
4
|
-
|
|
4
|
+
componentSpec: ComponentSpec;
|
|
5
5
|
props?: Record<string, any>;
|
|
6
6
|
setupCode?: string;
|
|
7
7
|
timeout?: number;
|
|
8
8
|
waitForSelector?: string;
|
|
9
9
|
waitForLoadState?: 'load' | 'domcontentloaded' | 'networkidle';
|
|
10
|
-
childComponents?: ComponentSpec[];
|
|
11
|
-
registerChildren?: boolean;
|
|
12
10
|
}
|
|
13
11
|
export interface ComponentSpec {
|
|
14
12
|
componentName: string;
|
|
@@ -20,19 +18,69 @@ export interface ComponentExecutionResult {
|
|
|
20
18
|
success: boolean;
|
|
21
19
|
html: string;
|
|
22
20
|
errors: string[];
|
|
21
|
+
warnings: string[];
|
|
22
|
+
criticalWarnings: string[];
|
|
23
23
|
console: {
|
|
24
24
|
type: string;
|
|
25
25
|
text: string;
|
|
26
26
|
}[];
|
|
27
27
|
screenshot?: Buffer;
|
|
28
28
|
executionTime: number;
|
|
29
|
+
renderCount?: number;
|
|
29
30
|
}
|
|
30
31
|
export declare class ComponentRunner {
|
|
31
32
|
private browserManager;
|
|
33
|
+
private compiler;
|
|
34
|
+
private registry;
|
|
35
|
+
private runtimeContext;
|
|
36
|
+
private static readonly CRITICAL_WARNING_PATTERNS;
|
|
37
|
+
private static readonly MAX_RENDER_COUNT;
|
|
32
38
|
constructor(browserManager: BrowserManager);
|
|
33
39
|
executeComponent(options: ComponentExecutionOptions): Promise<ComponentExecutionResult>;
|
|
34
40
|
private createHTMLTemplate;
|
|
35
|
-
|
|
36
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Checks if a console message is a warning
|
|
43
|
+
*/
|
|
44
|
+
private isWarning;
|
|
45
|
+
/**
|
|
46
|
+
* Checks if a warning is critical and should fail the test
|
|
47
|
+
*/
|
|
48
|
+
private isCriticalWarning;
|
|
49
|
+
/**
|
|
50
|
+
* Sets up console logging with warning detection
|
|
51
|
+
*/
|
|
52
|
+
private setupConsoleLogging;
|
|
53
|
+
/**
|
|
54
|
+
* Sets up error handling for the page
|
|
55
|
+
*/
|
|
56
|
+
private setupErrorHandling;
|
|
57
|
+
/**
|
|
58
|
+
* Injects render tracking code into the page
|
|
59
|
+
*/
|
|
60
|
+
private injectRenderTracking;
|
|
61
|
+
/**
|
|
62
|
+
* Waits for component to render and checks for timeouts
|
|
63
|
+
*/
|
|
64
|
+
private waitForRender;
|
|
65
|
+
/**
|
|
66
|
+
* Gets the render count from the page
|
|
67
|
+
*/
|
|
68
|
+
private getRenderCount;
|
|
69
|
+
/**
|
|
70
|
+
* Determines if the component execution was successful
|
|
71
|
+
*/
|
|
72
|
+
private determineSuccess;
|
|
73
|
+
/**
|
|
74
|
+
* Analyze component errors to identify failed components
|
|
75
|
+
* @param errors Array of error messages
|
|
76
|
+
* @returns Array of component names that failed
|
|
77
|
+
*/
|
|
78
|
+
static analyzeComponentErrors(errors: string[]): string[];
|
|
79
|
+
/**
|
|
80
|
+
* Get detailed error analysis
|
|
81
|
+
* @param errors Array of error messages
|
|
82
|
+
* @returns Detailed failure information
|
|
83
|
+
*/
|
|
84
|
+
static getDetailedErrorAnalysis(errors: string[]): import("@memberjunction/react-runtime").FailedComponentInfo[];
|
|
37
85
|
}
|
|
38
86
|
//# sourceMappingURL=component-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-runner.d.ts","sourceRoot":"","sources":["../../src/lib/component-runner.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"component-runner.d.ts","sourceRoot":"","sources":["../../src/lib/component-runner.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYnD,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAAG,aAAa,CAAC;CAChE;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,eAAe;IAoBd,OAAO,CAAC,cAAc;IAnBlC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,cAAc,CAAiB;IAGvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAS/C;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;gBAE5B,cAAc,EAAE,cAAc;IAQ5C,gBAAgB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAqE7F,OAAO,CAAC,kBAAkB;IA8a1B;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;YACW,oBAAoB;IAMlC;;OAEG;YACW,aAAa;IA0B3B;;OAEG;YACW,cAAc;IAI5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;;;OAIG;IACH,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAIzD;;;;OAIG;IACH,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE;CAGjD"}
|
|
@@ -1,77 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
3
|
exports.ComponentRunner = void 0;
|
|
27
|
-
const
|
|
28
|
-
const fs = __importStar(require("fs"));
|
|
4
|
+
const react_runtime_1 = require("@memberjunction/react-runtime");
|
|
29
5
|
class ComponentRunner {
|
|
30
6
|
constructor(browserManager) {
|
|
31
7
|
this.browserManager = browserManager;
|
|
8
|
+
this.compiler = new react_runtime_1.ComponentCompiler();
|
|
9
|
+
this.registry = new react_runtime_1.ComponentRegistry();
|
|
10
|
+
// Set up runtime context (will be populated in browser)
|
|
11
|
+
this.runtimeContext = {};
|
|
32
12
|
}
|
|
33
13
|
async executeComponent(options) {
|
|
34
14
|
const startTime = Date.now();
|
|
35
15
|
const errors = [];
|
|
16
|
+
const warnings = [];
|
|
17
|
+
const criticalWarnings = [];
|
|
36
18
|
const consoleLogs = [];
|
|
19
|
+
let renderCount = 0;
|
|
37
20
|
try {
|
|
38
21
|
const page = await this.browserManager.getPage();
|
|
39
|
-
// Set up
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
//
|
|
44
|
-
page.on('pageerror', (error) => {
|
|
45
|
-
errors.push(error.message);
|
|
46
|
-
});
|
|
47
|
-
// Create HTML template with React runtime
|
|
22
|
+
// Set up monitoring
|
|
23
|
+
this.setupConsoleLogging(page, consoleLogs, warnings, criticalWarnings);
|
|
24
|
+
this.setupErrorHandling(page, errors);
|
|
25
|
+
await this.injectRenderTracking(page);
|
|
26
|
+
// Create and load the component
|
|
48
27
|
const htmlContent = this.createHTMLTemplate(options);
|
|
49
|
-
// Navigate to a data URL with the HTML content
|
|
50
28
|
await page.goto(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`);
|
|
51
|
-
// Wait for
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
if (options.waitForLoadState) {
|
|
58
|
-
await this.browserManager.waitForLoadState(options.waitForLoadState);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
// Default wait for React to finish rendering
|
|
62
|
-
await page.waitForTimeout(100);
|
|
63
|
-
}
|
|
29
|
+
// Wait for render with timeout detection
|
|
30
|
+
const renderSuccess = await this.waitForRender(page, options, errors);
|
|
31
|
+
// Get render count
|
|
32
|
+
renderCount = await this.getRenderCount(page);
|
|
64
33
|
// Get the rendered HTML
|
|
65
34
|
const html = await this.browserManager.getContent();
|
|
66
35
|
// Take screenshot if needed
|
|
67
36
|
const screenshot = await this.browserManager.screenshot();
|
|
37
|
+
// Determine success and collect any additional errors
|
|
38
|
+
const { success, additionalErrors } = this.determineSuccess(errors, criticalWarnings, renderCount, !renderSuccess);
|
|
39
|
+
// Add any additional errors
|
|
40
|
+
errors.push(...additionalErrors);
|
|
68
41
|
return {
|
|
69
|
-
success
|
|
42
|
+
success,
|
|
70
43
|
html,
|
|
71
44
|
errors,
|
|
45
|
+
warnings,
|
|
46
|
+
criticalWarnings,
|
|
72
47
|
console: consoleLogs,
|
|
73
48
|
screenshot,
|
|
74
|
-
executionTime: Date.now() - startTime
|
|
49
|
+
executionTime: Date.now() - startTime,
|
|
50
|
+
renderCount
|
|
75
51
|
};
|
|
76
52
|
}
|
|
77
53
|
catch (error) {
|
|
@@ -80,98 +56,555 @@ class ComponentRunner {
|
|
|
80
56
|
success: false,
|
|
81
57
|
html: '',
|
|
82
58
|
errors,
|
|
59
|
+
warnings,
|
|
60
|
+
criticalWarnings,
|
|
83
61
|
console: consoleLogs,
|
|
84
|
-
executionTime: Date.now() - startTime
|
|
62
|
+
executionTime: Date.now() - startTime,
|
|
63
|
+
renderCount
|
|
85
64
|
};
|
|
86
65
|
}
|
|
87
66
|
}
|
|
88
67
|
createHTMLTemplate(options) {
|
|
89
68
|
const propsJson = JSON.stringify(options.props || {});
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
69
|
+
const specJson = JSON.stringify(options.componentSpec);
|
|
70
|
+
// Generate script tags for core libraries
|
|
71
|
+
const coreLibraryScripts = (0, react_runtime_1.getCoreLibraryUrls)()
|
|
72
|
+
.map(url => ` <script src="${url}"></script>`)
|
|
73
|
+
.join('\n');
|
|
74
|
+
// Generate script tags for UI libraries
|
|
75
|
+
const uiLibraryScripts = (0, react_runtime_1.getUILibraryUrls)()
|
|
76
|
+
.map(url => ` <script src="${url}"></script>`)
|
|
77
|
+
.join('\n');
|
|
78
|
+
// Generate CSS links
|
|
79
|
+
const cssLinks = (0, react_runtime_1.getCSSUrls)()
|
|
80
|
+
.map(url => ` <link rel="stylesheet" href="${url}">`)
|
|
81
|
+
.join('\n');
|
|
95
82
|
return `
|
|
96
83
|
<!DOCTYPE html>
|
|
97
84
|
<html>
|
|
98
85
|
<head>
|
|
99
86
|
<meta charset="utf-8">
|
|
100
87
|
<title>React Component Test</title>
|
|
101
|
-
<script crossorigin src="
|
|
102
|
-
<script crossorigin src="
|
|
103
|
-
<script src="
|
|
88
|
+
<script crossorigin src="${react_runtime_1.STANDARD_LIBRARY_URLS.REACT}"></script>
|
|
89
|
+
<script crossorigin src="${react_runtime_1.STANDARD_LIBRARY_URLS.REACT_DOM}"></script>
|
|
90
|
+
<script src="${react_runtime_1.STANDARD_LIBRARY_URLS.BABEL}"></script>
|
|
91
|
+
${coreLibraryScripts}
|
|
92
|
+
${uiLibraryScripts}
|
|
93
|
+
${cssLinks}
|
|
104
94
|
<style>
|
|
105
95
|
body { margin: 0; padding: 20px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }
|
|
106
96
|
#root { min-height: 100vh; }
|
|
107
97
|
</style>
|
|
98
|
+
<script>
|
|
99
|
+
// Render tracking injection
|
|
100
|
+
(function() {
|
|
101
|
+
let renderCounter = 0;
|
|
102
|
+
window.__testHarnessRenderCount = 0;
|
|
103
|
+
|
|
104
|
+
// Wait for React to be available
|
|
105
|
+
const setupRenderTracking = () => {
|
|
106
|
+
if (window.React && window.React.createElement) {
|
|
107
|
+
const originalCreateElement = window.React.createElement.bind(window.React);
|
|
108
|
+
|
|
109
|
+
window.React.createElement = function(type, props, ...children) {
|
|
110
|
+
renderCounter++;
|
|
111
|
+
window.__testHarnessRenderCount = renderCounter;
|
|
112
|
+
|
|
113
|
+
if (renderCounter > 1000) {
|
|
114
|
+
console.error('Excessive renders detected: ' + renderCounter + ' renders. Possible infinite loop.');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return originalCreateElement(type, props, ...children);
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
// Try to set up immediately
|
|
123
|
+
setupRenderTracking();
|
|
124
|
+
|
|
125
|
+
// Also try after a delay in case React loads later
|
|
126
|
+
setTimeout(setupRenderTracking, 100);
|
|
127
|
+
})();
|
|
128
|
+
</script>
|
|
108
129
|
</head>
|
|
109
130
|
<body>
|
|
110
131
|
<div id="root"></div>
|
|
111
132
|
<script type="text/babel">
|
|
112
133
|
${options.setupCode || ''}
|
|
113
134
|
|
|
114
|
-
//
|
|
115
|
-
const
|
|
116
|
-
|
|
135
|
+
// Create runtime context
|
|
136
|
+
const runtimeContext = {
|
|
137
|
+
React: React,
|
|
138
|
+
ReactDOM: ReactDOM,
|
|
139
|
+
libraries: {
|
|
140
|
+
_: window._,
|
|
141
|
+
d3: window.d3,
|
|
142
|
+
Chart: window.Chart,
|
|
143
|
+
dayjs: window.dayjs,
|
|
144
|
+
antd: window.antd,
|
|
145
|
+
ReactBootstrap: window.ReactBootstrap
|
|
146
|
+
}
|
|
147
|
+
};
|
|
117
148
|
|
|
118
|
-
|
|
149
|
+
// Create component compiler
|
|
150
|
+
class SimpleCompiler {
|
|
151
|
+
constructor() {
|
|
152
|
+
this.cache = new Map();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async compile(options) {
|
|
156
|
+
const componentName = options.componentName;
|
|
157
|
+
const componentCode = options.componentCode;
|
|
158
|
+
|
|
159
|
+
try {
|
|
160
|
+
// Transform JSX to JS using Babel
|
|
161
|
+
const transformed = Babel.transform(componentCode, {
|
|
162
|
+
presets: ['react'],
|
|
163
|
+
filename: componentName + '.jsx'
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// Create component factory
|
|
167
|
+
const createComponent = new Function(
|
|
168
|
+
'React', 'ReactDOM', 'useState', 'useEffect', 'useCallback',
|
|
169
|
+
'createStateUpdater', 'libraries', 'styles', 'console',
|
|
170
|
+
\`
|
|
171
|
+
// Make libraries available in the component scope
|
|
172
|
+
const _ = libraries._;
|
|
173
|
+
const d3 = libraries.d3;
|
|
174
|
+
const Chart = libraries.Chart;
|
|
175
|
+
const dayjs = libraries.dayjs;
|
|
176
|
+
const antd = libraries.antd;
|
|
177
|
+
const ReactBootstrap = libraries.ReactBootstrap;
|
|
178
|
+
|
|
179
|
+
\${transformed.code}
|
|
180
|
+
return {
|
|
181
|
+
component: \${componentName},
|
|
182
|
+
print: function() { window.print(); },
|
|
183
|
+
refresh: function(data) { }
|
|
184
|
+
};
|
|
185
|
+
\`
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
const componentFactory = (context, styles = {}) => {
|
|
189
|
+
const { React, ReactDOM, libraries = {} } = context;
|
|
190
|
+
const createStateUpdater = (statePath, parentStateUpdater) => {
|
|
191
|
+
return (componentStateUpdate) => {
|
|
192
|
+
if (!statePath) {
|
|
193
|
+
parentStateUpdater(componentStateUpdate);
|
|
194
|
+
} else {
|
|
195
|
+
const pathParts = statePath.split('.');
|
|
196
|
+
const componentKey = pathParts[pathParts.length - 1];
|
|
197
|
+
parentStateUpdater({ [componentKey]: componentStateUpdate });
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
return createComponent(
|
|
203
|
+
React,
|
|
204
|
+
ReactDOM,
|
|
205
|
+
React.useState,
|
|
206
|
+
React.useEffect,
|
|
207
|
+
React.useCallback,
|
|
208
|
+
createStateUpdater,
|
|
209
|
+
libraries,
|
|
210
|
+
styles,
|
|
211
|
+
console
|
|
212
|
+
);
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
return {
|
|
216
|
+
success: true,
|
|
217
|
+
component: {
|
|
218
|
+
component: componentFactory,
|
|
219
|
+
id: componentName + '_' + Date.now(),
|
|
220
|
+
name: componentName,
|
|
221
|
+
compiledAt: new Date(),
|
|
222
|
+
warnings: []
|
|
223
|
+
},
|
|
224
|
+
duration: 0
|
|
225
|
+
};
|
|
226
|
+
} catch (error) {
|
|
227
|
+
return {
|
|
228
|
+
success: false,
|
|
229
|
+
error: {
|
|
230
|
+
message: error.message,
|
|
231
|
+
componentName: componentName,
|
|
232
|
+
phase: 'compilation'
|
|
233
|
+
},
|
|
234
|
+
duration: 0
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
setBabelInstance(babel) {
|
|
240
|
+
// Already have access to Babel global
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Create component registry
|
|
245
|
+
class SimpleRegistry {
|
|
246
|
+
constructor() {
|
|
247
|
+
this.components = new Map();
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
register(name, component, namespace = 'Global', version = 'v1') {
|
|
251
|
+
const key = \`\${namespace}/\${version}/\${name}\`;
|
|
252
|
+
this.components.set(key, component);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
get(name, namespace = 'Global', version = 'v1') {
|
|
256
|
+
const key = \`\${namespace}/\${version}/\${name}\`;
|
|
257
|
+
return this.components.get(key);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
getAll(namespace = 'Global', version = 'v1') {
|
|
261
|
+
const components = {};
|
|
262
|
+
const prefix = \`\${namespace}/\${version}/\`;
|
|
263
|
+
this.components.forEach((component, key) => {
|
|
264
|
+
if (key.startsWith(prefix)) {
|
|
265
|
+
const name = key.substring(prefix.length);
|
|
266
|
+
components[name] = component;
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
return components;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
119
272
|
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
|
|
273
|
+
// Create instances
|
|
274
|
+
const compiler = new SimpleCompiler();
|
|
275
|
+
const registry = new SimpleRegistry();
|
|
276
|
+
|
|
277
|
+
// Create hierarchy registrar
|
|
278
|
+
class SimpleHierarchyRegistrar {
|
|
279
|
+
constructor(compiler, registry, runtimeContext) {
|
|
280
|
+
this.compiler = compiler;
|
|
281
|
+
this.registry = registry;
|
|
282
|
+
this.runtimeContext = runtimeContext;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
async registerHierarchy(rootSpec, options = {}) {
|
|
286
|
+
const registeredComponents = [];
|
|
287
|
+
const errors = [];
|
|
288
|
+
const warnings = [];
|
|
289
|
+
|
|
290
|
+
// Register components recursively
|
|
291
|
+
const registerSpec = async (spec) => {
|
|
292
|
+
// Register children first
|
|
293
|
+
const children = spec.childComponents || spec.components || [];
|
|
294
|
+
for (const child of children) {
|
|
295
|
+
await registerSpec(child);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Register this component
|
|
299
|
+
if (spec.componentCode) {
|
|
300
|
+
const result = await this.compiler.compile({
|
|
301
|
+
componentName: spec.componentName,
|
|
302
|
+
componentCode: spec.componentCode
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
if (result.success) {
|
|
306
|
+
const factory = result.component.component(this.runtimeContext, {});
|
|
307
|
+
this.registry.register(spec.componentName, factory.component);
|
|
308
|
+
registeredComponents.push(spec.componentName);
|
|
309
|
+
} else {
|
|
310
|
+
errors.push({
|
|
311
|
+
componentName: spec.componentName,
|
|
312
|
+
error: result.error.message,
|
|
313
|
+
phase: 'compilation'
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
await registerSpec(rootSpec);
|
|
320
|
+
|
|
321
|
+
return {
|
|
322
|
+
success: errors.length === 0,
|
|
323
|
+
registeredComponents,
|
|
324
|
+
errors,
|
|
325
|
+
warnings
|
|
326
|
+
};
|
|
327
|
+
}
|
|
123
328
|
}
|
|
124
329
|
|
|
125
|
-
|
|
330
|
+
const hierarchyRegistrar = new SimpleHierarchyRegistrar(compiler, registry, runtimeContext);
|
|
126
331
|
|
|
127
|
-
//
|
|
128
|
-
const
|
|
129
|
-
|
|
332
|
+
// BuildUtilities function - copied from skip-chat implementation
|
|
333
|
+
const BuildUtilities = () => {
|
|
334
|
+
// Create mock utilities for testing
|
|
335
|
+
// In production, this would use the actual Metadata, RunView, and RunQuery
|
|
336
|
+
const utilities = {
|
|
337
|
+
md: {
|
|
338
|
+
entities: []
|
|
339
|
+
},
|
|
340
|
+
rv: {
|
|
341
|
+
RunView: async (params) => {
|
|
342
|
+
console.log('Mock RunView called with:', params);
|
|
343
|
+
return { Results: [], Success: true };
|
|
344
|
+
},
|
|
345
|
+
RunViews: async (params) => {
|
|
346
|
+
console.log('Mock RunViews called with:', params);
|
|
347
|
+
return params.map(() => ({ Results: [], Success: true }));
|
|
348
|
+
}
|
|
349
|
+
},
|
|
350
|
+
rq: {
|
|
351
|
+
RunQuery: async (params) => {
|
|
352
|
+
console.log('Mock RunQuery called with:', params);
|
|
353
|
+
return { Results: [], Success: true };
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
return utilities;
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
// SetupStyles function - copied from skip-chat implementation
|
|
361
|
+
const SetupStyles = () => ({
|
|
362
|
+
colors: {
|
|
363
|
+
primary: '#5B4FE9',
|
|
364
|
+
primaryHover: '#4940D4',
|
|
365
|
+
primaryLight: '#E8E6FF',
|
|
366
|
+
secondary: '#64748B',
|
|
367
|
+
secondaryHover: '#475569',
|
|
368
|
+
success: '#10B981',
|
|
369
|
+
successLight: '#D1FAE5',
|
|
370
|
+
warning: '#F59E0B',
|
|
371
|
+
warningLight: '#FEF3C7',
|
|
372
|
+
error: '#EF4444',
|
|
373
|
+
errorLight: '#FEE2E2',
|
|
374
|
+
info: '#3B82F6',
|
|
375
|
+
infoLight: '#DBEAFE',
|
|
376
|
+
background: '#FFFFFF',
|
|
377
|
+
surface: '#F8FAFC',
|
|
378
|
+
surfaceHover: '#F1F5F9',
|
|
379
|
+
text: '#1E293B',
|
|
380
|
+
textSecondary: '#64748B',
|
|
381
|
+
textTertiary: '#94A3B8',
|
|
382
|
+
textInverse: '#FFFFFF',
|
|
383
|
+
border: '#E2E8F0',
|
|
384
|
+
borderLight: '#F1F5F9',
|
|
385
|
+
borderFocus: '#5B4FE9',
|
|
386
|
+
shadow: 'rgba(0, 0, 0, 0.05)',
|
|
387
|
+
shadowMedium: 'rgba(0, 0, 0, 0.1)',
|
|
388
|
+
shadowLarge: 'rgba(0, 0, 0, 0.15)',
|
|
389
|
+
},
|
|
390
|
+
spacing: {
|
|
391
|
+
xs: '4px',
|
|
392
|
+
sm: '8px',
|
|
393
|
+
md: '16px',
|
|
394
|
+
lg: '24px',
|
|
395
|
+
xl: '32px',
|
|
396
|
+
xxl: '48px',
|
|
397
|
+
xxxl: '64px',
|
|
398
|
+
},
|
|
399
|
+
typography: {
|
|
400
|
+
fontFamily: '-apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, sans-serif',
|
|
401
|
+
fontSize: {
|
|
402
|
+
xs: '11px',
|
|
403
|
+
sm: '12px',
|
|
404
|
+
md: '14px',
|
|
405
|
+
lg: '16px',
|
|
406
|
+
xl: '20px',
|
|
407
|
+
xxl: '24px',
|
|
408
|
+
xxxl: '32px',
|
|
409
|
+
},
|
|
410
|
+
fontWeight: {
|
|
411
|
+
light: '300',
|
|
412
|
+
regular: '400',
|
|
413
|
+
medium: '500',
|
|
414
|
+
semibold: '600',
|
|
415
|
+
bold: '700',
|
|
416
|
+
},
|
|
417
|
+
lineHeight: {
|
|
418
|
+
tight: '1.25',
|
|
419
|
+
normal: '1.5',
|
|
420
|
+
relaxed: '1.75',
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
borders: {
|
|
424
|
+
radius: {
|
|
425
|
+
sm: '6px',
|
|
426
|
+
md: '8px',
|
|
427
|
+
lg: '12px',
|
|
428
|
+
xl: '16px',
|
|
429
|
+
full: '9999px',
|
|
430
|
+
},
|
|
431
|
+
width: {
|
|
432
|
+
thin: '1px',
|
|
433
|
+
medium: '2px',
|
|
434
|
+
thick: '3px',
|
|
435
|
+
},
|
|
436
|
+
},
|
|
437
|
+
shadows: {
|
|
438
|
+
sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
|
|
439
|
+
md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
|
|
440
|
+
lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
|
|
441
|
+
xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
|
|
442
|
+
inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',
|
|
443
|
+
},
|
|
444
|
+
transitions: {
|
|
445
|
+
fast: '150ms ease-in-out',
|
|
446
|
+
normal: '250ms ease-in-out',
|
|
447
|
+
slow: '350ms ease-in-out',
|
|
448
|
+
},
|
|
449
|
+
overflow: 'auto'
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
// Load component spec and register hierarchy
|
|
453
|
+
const componentSpec = ${specJson};
|
|
454
|
+
const props = ${propsJson};
|
|
455
|
+
|
|
456
|
+
(async () => {
|
|
457
|
+
// Register the component hierarchy
|
|
458
|
+
const result = await hierarchyRegistrar.registerHierarchy(componentSpec);
|
|
459
|
+
|
|
460
|
+
if (!result.success) {
|
|
461
|
+
console.error('Failed to register components:', result.errors);
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// Get all registered components
|
|
466
|
+
const components = registry.getAll();
|
|
467
|
+
|
|
468
|
+
// Get the root component
|
|
469
|
+
const RootComponent = registry.get(componentSpec.componentName);
|
|
470
|
+
|
|
471
|
+
if (!RootComponent) {
|
|
472
|
+
console.error('Root component not found:', componentSpec.componentName);
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Add components, utilities, and styles to props
|
|
477
|
+
const enhancedProps = {
|
|
478
|
+
...props,
|
|
479
|
+
components: components,
|
|
480
|
+
utilities: BuildUtilities(),
|
|
481
|
+
styles: SetupStyles()
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
// Render the root component
|
|
485
|
+
const root = ReactDOM.createRoot(document.getElementById('root'));
|
|
486
|
+
root.render(React.createElement(RootComponent, enhancedProps));
|
|
487
|
+
})();
|
|
130
488
|
</script>
|
|
131
489
|
</body>
|
|
132
490
|
</html>`;
|
|
133
491
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
492
|
+
/**
|
|
493
|
+
* Checks if a console message is a warning
|
|
494
|
+
*/
|
|
495
|
+
isWarning(type, text) {
|
|
496
|
+
return type === 'warning' || text.startsWith('Warning:');
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Checks if a warning is critical and should fail the test
|
|
500
|
+
*/
|
|
501
|
+
isCriticalWarning(text) {
|
|
502
|
+
return ComponentRunner.CRITICAL_WARNING_PATTERNS.some(pattern => pattern.test(text));
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Sets up console logging with warning detection
|
|
506
|
+
*/
|
|
507
|
+
setupConsoleLogging(page, consoleLogs, warnings, criticalWarnings) {
|
|
508
|
+
page.on('console', (msg) => {
|
|
509
|
+
const type = msg.type();
|
|
510
|
+
const text = msg.text();
|
|
511
|
+
consoleLogs.push({ type, text });
|
|
512
|
+
if (this.isWarning(type, text)) {
|
|
513
|
+
warnings.push(text);
|
|
514
|
+
if (this.isCriticalWarning(text)) {
|
|
515
|
+
criticalWarnings.push(text);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
152
518
|
});
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Sets up error handling for the page
|
|
522
|
+
*/
|
|
523
|
+
setupErrorHandling(page, errors) {
|
|
524
|
+
page.on('pageerror', (error) => {
|
|
525
|
+
errors.push(error.message);
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Injects render tracking code into the page
|
|
530
|
+
*/
|
|
531
|
+
async injectRenderTracking(page) {
|
|
532
|
+
// Instead of using evaluateOnNewDocument, we'll inject the script directly into the HTML
|
|
533
|
+
// This avoids the Playwright-specific API issue
|
|
534
|
+
// The actual injection will happen in createHTMLTemplate
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Waits for component to render and checks for timeouts
|
|
538
|
+
*/
|
|
539
|
+
async waitForRender(page, options, errors) {
|
|
540
|
+
const timeout = options.timeout || 10000; // 10 seconds default
|
|
541
|
+
try {
|
|
542
|
+
if (options.waitForSelector) {
|
|
543
|
+
await this.browserManager.waitForSelector(options.waitForSelector, { timeout });
|
|
156
544
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if (!fs.existsSync(absolutePath)) {
|
|
166
|
-
throw new Error(`Component file not found: ${absolutePath}`);
|
|
545
|
+
if (options.waitForLoadState) {
|
|
546
|
+
await this.browserManager.waitForLoadState(options.waitForLoadState);
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
// Default wait for React to finish rendering
|
|
550
|
+
await page.waitForTimeout(100);
|
|
551
|
+
}
|
|
552
|
+
return true;
|
|
167
553
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
554
|
+
catch (timeoutError) {
|
|
555
|
+
errors.push(`Component rendering timeout after ${timeout}ms - possible infinite render loop`);
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Gets the render count from the page
|
|
561
|
+
*/
|
|
562
|
+
async getRenderCount(page) {
|
|
563
|
+
return await page.evaluate(() => window.__testHarnessRenderCount || 0);
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Determines if the component execution was successful
|
|
567
|
+
*/
|
|
568
|
+
determineSuccess(errors, criticalWarnings, renderCount, hasTimeout) {
|
|
569
|
+
const additionalErrors = [];
|
|
570
|
+
if (renderCount > ComponentRunner.MAX_RENDER_COUNT) {
|
|
571
|
+
additionalErrors.push(`Excessive render count: ${renderCount} renders detected`);
|
|
572
|
+
}
|
|
573
|
+
const success = errors.length === 0 &&
|
|
574
|
+
criticalWarnings.length === 0 &&
|
|
575
|
+
!hasTimeout &&
|
|
576
|
+
renderCount <= ComponentRunner.MAX_RENDER_COUNT;
|
|
577
|
+
return { success, additionalErrors };
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* Analyze component errors to identify failed components
|
|
581
|
+
* @param errors Array of error messages
|
|
582
|
+
* @returns Array of component names that failed
|
|
583
|
+
*/
|
|
584
|
+
static analyzeComponentErrors(errors) {
|
|
585
|
+
return react_runtime_1.ComponentErrorAnalyzer.identifyFailedComponents(errors);
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Get detailed error analysis
|
|
589
|
+
* @param errors Array of error messages
|
|
590
|
+
* @returns Detailed failure information
|
|
591
|
+
*/
|
|
592
|
+
static getDetailedErrorAnalysis(errors) {
|
|
593
|
+
return react_runtime_1.ComponentErrorAnalyzer.analyzeComponentErrors(errors);
|
|
174
594
|
}
|
|
175
595
|
}
|
|
176
596
|
exports.ComponentRunner = ComponentRunner;
|
|
597
|
+
// Critical warning patterns that should fail tests
|
|
598
|
+
ComponentRunner.CRITICAL_WARNING_PATTERNS = [
|
|
599
|
+
/Maximum update depth exceeded/i,
|
|
600
|
+
/Cannot update a component .* while rendering a different component/i,
|
|
601
|
+
/Cannot update during an existing state transition/i,
|
|
602
|
+
/Warning: setState.*unmounted component/i,
|
|
603
|
+
/Warning: Can't perform a React state update on an unmounted component/i,
|
|
604
|
+
/Encountered two children with the same key/i,
|
|
605
|
+
/Error: Minified React error/i,
|
|
606
|
+
/too many re-renders/i,
|
|
607
|
+
];
|
|
608
|
+
// Maximum allowed renders before considering it excessive
|
|
609
|
+
ComponentRunner.MAX_RENDER_COUNT = 1000;
|
|
177
610
|
//# sourceMappingURL=component-runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-runner.js","sourceRoot":"","sources":["../../src/lib/component-runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"component-runner.js","sourceRoot":"","sources":["../../src/lib/component-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { BrowserContextOptions } from './browser-context';
|
|
3
|
-
import { ComponentExecutionOptions, ComponentExecutionResult
|
|
3
|
+
import { ComponentExecutionOptions, ComponentExecutionResult } from './component-runner';
|
|
4
4
|
import { AssertionHelpers } from './assertion-helpers';
|
|
5
|
+
import { ComponentRootSpec, ComponentChildSpec } from '@memberjunction/interactive-component-types';
|
|
5
6
|
export interface TestHarnessOptions extends BrowserContextOptions {
|
|
6
7
|
debug?: boolean;
|
|
7
8
|
screenshotOnError?: boolean;
|
|
@@ -13,11 +14,23 @@ export declare class ReactTestHarness {
|
|
|
13
14
|
private options;
|
|
14
15
|
constructor(options?: TestHarnessOptions);
|
|
15
16
|
initialize(): Promise<void>;
|
|
16
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Test a root component with its full hierarchy of child components
|
|
19
|
+
*/
|
|
20
|
+
testRootComponent(rootSpec: ComponentRootSpec, props?: Record<string, any>, options?: Partial<ComponentExecutionOptions>): Promise<ComponentExecutionResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Test a single child component
|
|
23
|
+
*/
|
|
24
|
+
testChildComponent(childSpec: ComponentChildSpec, props?: Record<string, any>, options?: Partial<ComponentExecutionOptions>): Promise<ComponentExecutionResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Convert Skip child specs to test harness ComponentSpec format
|
|
27
|
+
*/
|
|
28
|
+
private convertSkipChildSpecs;
|
|
29
|
+
/**
|
|
30
|
+
* Test a component from a file path
|
|
31
|
+
* This is a convenience method for the CLI
|
|
32
|
+
*/
|
|
17
33
|
testComponentFromFile(filePath: string, props?: Record<string, any>, options?: Partial<ComponentExecutionOptions>): Promise<ComponentExecutionResult>;
|
|
18
|
-
testComponentHierarchy(rootSpec: ComponentSpec, props?: Record<string, any>, options?: Partial<ComponentExecutionOptions>): Promise<ComponentExecutionResult>;
|
|
19
|
-
testComponentFromFileWithChildren(filePath: string, childComponents: ComponentSpec[], props?: Record<string, any>, options?: Partial<ComponentExecutionOptions>): Promise<ComponentExecutionResult>;
|
|
20
|
-
private collectChildComponents;
|
|
21
34
|
runTest(name: string, testFn: () => Promise<void>): Promise<{
|
|
22
35
|
name: string;
|
|
23
36
|
passed: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-harness.d.ts","sourceRoot":"","sources":["../../src/lib/test-harness.ts"],"names":[],"mappings":";AAAA,OAAO,EAAkB,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAmB,yBAAyB,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"test-harness.d.ts","sourceRoot":"","sources":["../../src/lib/test-harness.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/test-harness.js
CHANGED
|
@@ -27,8 +27,6 @@ exports.ReactTestHarness = void 0;
|
|
|
27
27
|
const browser_context_1 = require("./browser-context");
|
|
28
28
|
const component_runner_1 = require("./component-runner");
|
|
29
29
|
const assertion_helpers_1 = require("./assertion-helpers");
|
|
30
|
-
const path = __importStar(require("path"));
|
|
31
|
-
const fs = __importStar(require("fs"));
|
|
32
30
|
class ReactTestHarness {
|
|
33
31
|
constructor(options = {}) {
|
|
34
32
|
this.options = {
|
|
@@ -43,14 +41,24 @@ class ReactTestHarness {
|
|
|
43
41
|
async initialize() {
|
|
44
42
|
await this.browserManager.initialize();
|
|
45
43
|
}
|
|
46
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Test a root component with its full hierarchy of child components
|
|
46
|
+
*/
|
|
47
|
+
async testRootComponent(rootSpec, props, options) {
|
|
48
|
+
// Convert ComponentRootSpec to ComponentSpec format
|
|
49
|
+
const spec = {
|
|
50
|
+
componentName: rootSpec.componentName,
|
|
51
|
+
componentCode: rootSpec.componentCode,
|
|
52
|
+
childComponents: this.convertSkipChildSpecs(rootSpec.childComponents)
|
|
53
|
+
};
|
|
47
54
|
const result = await this.componentRunner.executeComponent({
|
|
48
|
-
|
|
55
|
+
componentSpec: spec,
|
|
49
56
|
props,
|
|
50
57
|
...options
|
|
51
58
|
});
|
|
52
59
|
if (this.options.debug) {
|
|
53
60
|
console.log('=== Test Execution Debug Info ===');
|
|
61
|
+
console.log('Component:', spec.componentName);
|
|
54
62
|
console.log('Success:', result.success);
|
|
55
63
|
console.log('Execution Time:', result.executionTime, 'ms');
|
|
56
64
|
console.log('Errors:', result.errors);
|
|
@@ -60,63 +68,60 @@ class ReactTestHarness {
|
|
|
60
68
|
if (!result.success && this.options.screenshotOnError && result.screenshot) {
|
|
61
69
|
const screenshotPath = this.options.screenshotPath || './error-screenshot.png';
|
|
62
70
|
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
71
|
+
// Ensure the screenshot Buffer is properly typed for writeFileSync
|
|
63
72
|
fs.writeFileSync(screenshotPath, result.screenshot);
|
|
64
73
|
console.log(`Screenshot saved to: ${screenshotPath}`);
|
|
65
74
|
}
|
|
66
75
|
return result;
|
|
67
76
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
async
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
componentCode: rootSpec.componentCode,
|
|
77
|
+
/**
|
|
78
|
+
* Test a single child component
|
|
79
|
+
*/
|
|
80
|
+
async testChildComponent(childSpec, props, options) {
|
|
81
|
+
const spec = {
|
|
82
|
+
componentName: childSpec.componentName,
|
|
83
|
+
componentCode: childSpec.componentCode || '',
|
|
84
|
+
childComponents: childSpec.components ? this.convertSkipChildSpecs(childSpec.components) : []
|
|
85
|
+
};
|
|
86
|
+
return this.componentRunner.executeComponent({
|
|
87
|
+
componentSpec: spec,
|
|
80
88
|
props,
|
|
81
|
-
childComponents,
|
|
82
|
-
registerChildren: true,
|
|
83
89
|
...options
|
|
84
90
|
});
|
|
85
|
-
if (this.options.debug) {
|
|
86
|
-
console.log('=== Component Hierarchy Test Debug Info ===');
|
|
87
|
-
console.log('Root Component:', rootSpec.componentName);
|
|
88
|
-
console.log('Child Components:', childComponents.map(c => c.componentName));
|
|
89
|
-
console.log('==========================================');
|
|
90
|
-
}
|
|
91
|
-
return result;
|
|
92
91
|
}
|
|
93
|
-
|
|
92
|
+
/**
|
|
93
|
+
* Convert Skip child specs to test harness ComponentSpec format
|
|
94
|
+
*/
|
|
95
|
+
convertSkipChildSpecs(children) {
|
|
96
|
+
return children.map(child => ({
|
|
97
|
+
componentName: child.componentName,
|
|
98
|
+
componentCode: child.componentCode,
|
|
99
|
+
childComponents: child.components ? this.convertSkipChildSpecs(child.components) : []
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Test a component from a file path
|
|
104
|
+
* This is a convenience method for the CLI
|
|
105
|
+
*/
|
|
106
|
+
async testComponentFromFile(filePath, props, options) {
|
|
107
|
+
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
108
|
+
const path = await Promise.resolve().then(() => __importStar(require('path')));
|
|
94
109
|
const absolutePath = path.resolve(filePath);
|
|
95
110
|
if (!fs.existsSync(absolutePath)) {
|
|
96
111
|
throw new Error(`Component file not found: ${absolutePath}`);
|
|
97
112
|
}
|
|
98
113
|
const componentCode = fs.readFileSync(absolutePath, 'utf-8');
|
|
99
|
-
|
|
114
|
+
const componentName = path.basename(absolutePath, path.extname(absolutePath));
|
|
115
|
+
// Create a minimal ComponentChildSpec for the file
|
|
116
|
+
const childSpec = {
|
|
117
|
+
componentName,
|
|
100
118
|
componentCode,
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
collectChildComponents(spec) {
|
|
108
|
-
const collected = [];
|
|
109
|
-
const processSpec = (s) => {
|
|
110
|
-
const children = s.childComponents || s.components || [];
|
|
111
|
-
children.forEach(child => {
|
|
112
|
-
if (child.componentCode) {
|
|
113
|
-
collected.push(child);
|
|
114
|
-
}
|
|
115
|
-
processSpec(child);
|
|
116
|
-
});
|
|
119
|
+
description: `Component loaded from ${filePath}`,
|
|
120
|
+
exampleUsage: `<${componentName} />`,
|
|
121
|
+
statePath: componentName.toLowerCase(),
|
|
122
|
+
components: []
|
|
117
123
|
};
|
|
118
|
-
|
|
119
|
-
return collected;
|
|
124
|
+
return this.testChildComponent(childSpec, props, options);
|
|
120
125
|
}
|
|
121
126
|
async runTest(name, testFn) {
|
|
122
127
|
const startTime = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-harness.js","sourceRoot":"","sources":["../../src/lib/test-harness.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAA0E;AAC1E,yDAAyH;AACzH,2DAAuD;
|
|
1
|
+
{"version":3,"file":"test-harness.js","sourceRoot":"","sources":["../../src/lib/test-harness.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAA0E;AAC1E,yDAAyH;AACzH,2DAAuD;AASvD,MAAa,gBAAgB;IAK3B,YAAY,UAA8B,EAAE;QAC1C,IAAI,CAAC,OAAO,GAAG;YACb,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,KAAK;YACZ,iBAAiB,EAAE,IAAI;YACvB,GAAG,OAAO;SACX,CAAC;QAEF,IAAI,CAAC,cAAc,GAAG,IAAI,gCAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,eAAe,GAAG,IAAI,kCAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAA2B,EAC3B,KAA2B,EAC3B,OAA4C;QAE5C,oDAAoD;QACpD,MAAM,IAAI,GAAkB;YAC1B,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,eAAe,EAAE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,eAAe,CAAC;SACtE,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC;YACzD,aAAa,EAAE,IAAI;YACnB,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3E,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,wBAAwB,CAAC;YAC/E,MAAM,EAAE,GAAG,wDAAa,IAAI,GAAC,CAAC;YAC9B,mEAAmE;YACnE,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,CAAC,UAAiB,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,wBAAwB,cAAc,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,SAA6B,EAC7B,KAA2B,EAC3B,OAA4C;QAE5C,MAAM,IAAI,GAAkB;YAC1B,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,aAAa,EAAE,SAAS,CAAC,aAAa,IAAI,EAAE;YAC5C,eAAe,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;SAC9F,CAAC;QAEF,OAAO,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC;YAC3C,aAAa,EAAE,IAAI;YACnB,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,QAA8B;QAC1D,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,eAAe,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;SACtF,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,qBAAqB,CACzB,QAAgB,EAChB,KAA2B,EAC3B,OAA4C;QAE5C,MAAM,EAAE,GAAG,wDAAa,IAAI,GAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,wDAAa,MAAM,GAAC,CAAC;QAElC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,YAAY,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QAE9E,mDAAmD;QACnD,MAAM,SAAS,GAAuB;YACpC,aAAa;YACb,aAAa;YACb,WAAW,EAAE,yBAAyB,QAAQ,EAAE;YAChD,YAAY,EAAE,IAAI,aAAa,KAAK;YACpC,SAAS,EAAE,aAAa,CAAC,WAAW,EAAE;YACtC,UAAU,EAAE,EAAE;SACf,CAAC;QAEF,OAAO,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,MAA2B;QAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,MAAM,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,QAAQ,KAAK,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAE5E,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,QAAQ,KAAK,CAAC,CAAC;gBACzC,OAAO,CAAC,KAAK,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC;YAC5C,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAuD;QAOpE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,EAAE,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QACpD,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACtD,CAAC;IAED,mBAAmB;QACjB,OAAO,oCAAgB,CAAC;IAC1B,CAAC;IAED,aAAa,CAAC,IAAY;QACxB,OAAO,oCAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAa;QAC5B,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW;QAC1B,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,cAAc,CAAI,EAAyB,EAAE,GAAG,IAAW;QAC/D,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;CACF;AAvND,4CAuNC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/react-test-harness",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.72.0",
|
|
4
4
|
"description": "React component test harness for MemberJunction using Playwright",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
"typescript": "^5.4.5"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@memberjunction/react-runtime": "^2.
|
|
25
|
+
"@memberjunction/react-runtime": "^2.72.0",
|
|
26
|
+
"@memberjunction/interactive-component-types": "^2.72.0",
|
|
26
27
|
"@playwright/test": "^1.40.0",
|
|
27
28
|
"playwright": "^1.40.0",
|
|
28
29
|
"commander": "^11.1.0",
|