playwright-automation-core 1.0.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/LICENSE +21 -0
- package/README.md +225 -0
- package/dist/api/api.assertions.d.ts +196 -0
- package/dist/api/api.assertions.d.ts.map +1 -0
- package/dist/api/api.assertions.js +462 -0
- package/dist/api/api.assertions.js.map +1 -0
- package/dist/api/api.builder.d.ts +134 -0
- package/dist/api/api.builder.d.ts.map +1 -0
- package/dist/api/api.builder.js +273 -0
- package/dist/api/api.builder.js.map +1 -0
- package/dist/api/api.client.d.ts +157 -0
- package/dist/api/api.client.d.ts.map +1 -0
- package/dist/api/api.client.js +493 -0
- package/dist/api/api.client.js.map +1 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +17 -0
- package/dist/api/index.js.map +1 -0
- package/dist/core/base.driver.d.ts +130 -0
- package/dist/core/base.driver.d.ts.map +1 -0
- package/dist/core/base.driver.js +264 -0
- package/dist/core/base.driver.js.map +1 -0
- package/dist/core/driver.factory.d.ts +120 -0
- package/dist/core/driver.factory.d.ts.map +1 -0
- package/dist/core/driver.factory.js +222 -0
- package/dist/core/driver.factory.js.map +1 -0
- package/dist/core/element.actions.d.ts +119 -0
- package/dist/core/element.actions.d.ts.map +1 -0
- package/dist/core/element.actions.js +379 -0
- package/dist/core/element.actions.js.map +1 -0
- package/dist/core/hook.manager.d.ts +186 -0
- package/dist/core/hook.manager.d.ts.map +1 -0
- package/dist/core/hook.manager.js +297 -0
- package/dist/core/hook.manager.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +22 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/dist/mobile/index.d.ts +7 -0
- package/dist/mobile/index.d.ts.map +1 -0
- package/dist/mobile/index.js +14 -0
- package/dist/mobile/index.js.map +1 -0
- package/dist/mobile/mobile.assertions.d.ts +146 -0
- package/dist/mobile/mobile.assertions.d.ts.map +1 -0
- package/dist/mobile/mobile.assertions.js +333 -0
- package/dist/mobile/mobile.assertions.js.map +1 -0
- package/dist/mobile/mobile.driver.d.ts +297 -0
- package/dist/mobile/mobile.driver.d.ts.map +1 -0
- package/dist/mobile/mobile.driver.js +808 -0
- package/dist/mobile/mobile.driver.js.map +1 -0
- package/dist/types/common.types.d.ts +200 -0
- package/dist/types/common.types.d.ts.map +1 -0
- package/dist/types/common.types.js +3 -0
- package/dist/types/common.types.js.map +1 -0
- package/dist/types/config.types.d.ts +192 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +3 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/driver.types.d.ts +500 -0
- package/dist/types/driver.types.d.ts.map +1 -0
- package/dist/types/driver.types.js +3 -0
- package/dist/types/driver.types.js.map +1 -0
- package/dist/types/enums.d.ts +53 -0
- package/dist/types/enums.d.ts.map +1 -0
- package/dist/types/enums.js +62 -0
- package/dist/types/enums.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.manager.d.ts +144 -0
- package/dist/utils/config.manager.d.ts.map +1 -0
- package/dist/utils/config.manager.js +473 -0
- package/dist/utils/config.manager.js.map +1 -0
- package/dist/utils/errors.d.ts +149 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +290 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/helpers.d.ts +124 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +421 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +78 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +145 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +235 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/wait.utils.d.ts +95 -0
- package/dist/utils/wait.utils.d.ts.map +1 -0
- package/dist/utils/wait.utils.js +306 -0
- package/dist/utils/wait.utils.js.map +1 -0
- package/dist/web/index.d.ts +8 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +16 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/web.assertions.d.ts +164 -0
- package/dist/web/web.assertions.d.ts.map +1 -0
- package/dist/web/web.assertions.js +427 -0
- package/dist/web/web.assertions.js.map +1 -0
- package/dist/web/web.driver.d.ts +174 -0
- package/dist/web/web.driver.d.ts.map +1 -0
- package/dist/web/web.driver.js +571 -0
- package/dist/web/web.driver.js.map +1 -0
- package/dist/web/web.page.d.ts +286 -0
- package/dist/web/web.page.d.ts.map +1 -0
- package/dist/web/web.page.js +570 -0
- package/dist/web/web.page.js.map +1 -0
- package/package.json +115 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { WebConfig, ApiConfig, MobileConfig, FrameworkConfig, Platform } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration source type
|
|
4
|
+
*/
|
|
5
|
+
export type ConfigSource = "env" | "file" | "object" | "default";
|
|
6
|
+
/**
|
|
7
|
+
* Configuration load result
|
|
8
|
+
*/
|
|
9
|
+
export interface ConfigLoadResult {
|
|
10
|
+
config: FrameworkConfig;
|
|
11
|
+
sources: ConfigSource[];
|
|
12
|
+
warnings: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Config Manager class for loading and managing configuration
|
|
16
|
+
*/
|
|
17
|
+
export declare class ConfigManager {
|
|
18
|
+
private static instance;
|
|
19
|
+
private config;
|
|
20
|
+
private logger;
|
|
21
|
+
private loadedSources;
|
|
22
|
+
/**
|
|
23
|
+
* Default web configuration
|
|
24
|
+
*/
|
|
25
|
+
private static readonly DEFAULT_WEB_CONFIG;
|
|
26
|
+
/**
|
|
27
|
+
* Default API configuration
|
|
28
|
+
*/
|
|
29
|
+
private static readonly DEFAULT_API_CONFIG;
|
|
30
|
+
/**
|
|
31
|
+
* Default Mobile configuration
|
|
32
|
+
*/
|
|
33
|
+
private static readonly DEFAULT_MOBILE_CONFIG;
|
|
34
|
+
constructor();
|
|
35
|
+
/**
|
|
36
|
+
* Get singleton instance
|
|
37
|
+
*/
|
|
38
|
+
static getInstance(): ConfigManager;
|
|
39
|
+
/**
|
|
40
|
+
* Reset the singleton instance
|
|
41
|
+
*/
|
|
42
|
+
static resetInstance(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Load configuration from environment variables
|
|
45
|
+
*/
|
|
46
|
+
loadFromEnv(envPath?: string): this;
|
|
47
|
+
/**
|
|
48
|
+
* Load configuration from a JSON/JS file
|
|
49
|
+
*/
|
|
50
|
+
loadFromFile(filePath: string): this;
|
|
51
|
+
/**
|
|
52
|
+
* Load configuration from an object
|
|
53
|
+
*/
|
|
54
|
+
loadFromObject(config: Partial<FrameworkConfig>): this;
|
|
55
|
+
/**
|
|
56
|
+
* Apply default configuration
|
|
57
|
+
*/
|
|
58
|
+
applyDefaults(): this;
|
|
59
|
+
/**
|
|
60
|
+
* Get the full framework configuration
|
|
61
|
+
*/
|
|
62
|
+
getConfig(): FrameworkConfig;
|
|
63
|
+
/**
|
|
64
|
+
* Get web configuration
|
|
65
|
+
*/
|
|
66
|
+
getWebConfig(): WebConfig;
|
|
67
|
+
/**
|
|
68
|
+
* Get API configuration
|
|
69
|
+
*/
|
|
70
|
+
getApiConfig(): ApiConfig;
|
|
71
|
+
/**
|
|
72
|
+
* Get mobile configuration
|
|
73
|
+
*/
|
|
74
|
+
getMobileConfig(): MobileConfig;
|
|
75
|
+
/**
|
|
76
|
+
* Get configuration for a specific platform
|
|
77
|
+
*/
|
|
78
|
+
getConfigForPlatform(platform: Platform): WebConfig | ApiConfig | MobileConfig;
|
|
79
|
+
/**
|
|
80
|
+
* Get loaded sources
|
|
81
|
+
*/
|
|
82
|
+
getLoadedSources(): ConfigSource[];
|
|
83
|
+
/**
|
|
84
|
+
* Validate the configuration
|
|
85
|
+
*/
|
|
86
|
+
validate(): {
|
|
87
|
+
valid: boolean;
|
|
88
|
+
errors: string[];
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Set a specific configuration value
|
|
92
|
+
*/
|
|
93
|
+
set<K extends keyof FrameworkConfig>(key: K, value: FrameworkConfig[K]): this;
|
|
94
|
+
/**
|
|
95
|
+
* Get a specific configuration value
|
|
96
|
+
*/
|
|
97
|
+
get<K extends keyof FrameworkConfig>(key: K): FrameworkConfig[K];
|
|
98
|
+
/**
|
|
99
|
+
* Merge configuration
|
|
100
|
+
*/
|
|
101
|
+
private mergeConfig;
|
|
102
|
+
/**
|
|
103
|
+
* Parse web config from environment variables
|
|
104
|
+
*/
|
|
105
|
+
private parseWebConfigFromEnv;
|
|
106
|
+
/**
|
|
107
|
+
* Parse API config from environment variables
|
|
108
|
+
*/
|
|
109
|
+
private parseApiConfigFromEnv;
|
|
110
|
+
/**
|
|
111
|
+
* Parse mobile config from environment variables
|
|
112
|
+
*/
|
|
113
|
+
private parseMobileConfigFromEnv;
|
|
114
|
+
/**
|
|
115
|
+
* Parse proxy configuration from environment
|
|
116
|
+
*/
|
|
117
|
+
private parseProxyFromEnv;
|
|
118
|
+
/**
|
|
119
|
+
* Get string from environment
|
|
120
|
+
*/
|
|
121
|
+
private getEnvString;
|
|
122
|
+
/**
|
|
123
|
+
* Get number from environment
|
|
124
|
+
*/
|
|
125
|
+
private getEnvNumber;
|
|
126
|
+
/**
|
|
127
|
+
* Get boolean from environment
|
|
128
|
+
*/
|
|
129
|
+
private getEnvBoolean;
|
|
130
|
+
/**
|
|
131
|
+
* Get enum value from environment
|
|
132
|
+
*/
|
|
133
|
+
private getEnvEnum;
|
|
134
|
+
/**
|
|
135
|
+
* Export configuration to JSON file
|
|
136
|
+
*/
|
|
137
|
+
exportToFile(filePath: string): void;
|
|
138
|
+
/**
|
|
139
|
+
* Print configuration summary
|
|
140
|
+
*/
|
|
141
|
+
printSummary(): void;
|
|
142
|
+
}
|
|
143
|
+
export declare const getConfig: () => ConfigManager;
|
|
144
|
+
//# sourceMappingURL=config.manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.manager.d.ts","sourceRoot":"","sources":["../../src/utils/config.manager.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,SAAS,EACT,SAAS,EACT,YAAY,EACZ,eAAe,EAIf,QAAQ,EACT,MAAM,UAAU,CAAC;AAGlB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA8B;IACrD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAsB;IAE3C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAexC;IAEF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CASxC;IAEF;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAiB3C;;IAOF;;OAEG;WACW,WAAW,IAAI,aAAa;IAO1C;;OAEG;WACW,aAAa,IAAI,IAAI;IAInC;;OAEG;IACI,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAwB1C;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAuB3C;;OAEG;IACI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAM7D;;OAEG;IACI,aAAa,IAAI,IAAI;IAiB5B;;OAEG;IACI,SAAS,IAAI,eAAe;IAInC;;OAEG;IACI,YAAY,IAAI,SAAS;IAIhC;;OAEG;IACI,YAAY,IAAI,SAAS;IAIhC;;OAEG;IACI,eAAe,IAAI,YAAY;IAItC;;OAEG;IACI,oBAAoB,CACzB,QAAQ,EAAE,QAAQ,GACjB,SAAS,GAAG,SAAS,GAAG,YAAY;IAavC;;OAEG;IACI,gBAAgB,IAAI,YAAY,EAAE;IAIzC;;OAEG;IACI,QAAQ,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAuCvD;;OAEG;IACI,GAAG,CAAC,CAAC,SAAS,MAAM,eAAe,EACxC,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GACxB,IAAI;IAKP;;OAEG;IACI,GAAG,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;IAIvE;;OAEG;IACH,OAAO,CAAC,WAAW;IAqBnB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAoDhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAgBlB;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAY3C;;OAEG;IACI,YAAY,IAAI,IAAI;CAkB5B;AAGD,eAAO,MAAM,SAAS,QAAO,aAA4C,CAAC"}
|
|
@@ -0,0 +1,473 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getConfig = exports.ConfigManager = void 0;
|
|
37
|
+
const dotenv = __importStar(require("dotenv"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const types_1 = require("../types");
|
|
41
|
+
const logger_1 = require("./logger");
|
|
42
|
+
/**
|
|
43
|
+
* Config Manager class for loading and managing configuration
|
|
44
|
+
*/
|
|
45
|
+
class ConfigManager {
|
|
46
|
+
static instance = null;
|
|
47
|
+
config;
|
|
48
|
+
logger;
|
|
49
|
+
loadedSources = [];
|
|
50
|
+
/**
|
|
51
|
+
* Default web configuration
|
|
52
|
+
*/
|
|
53
|
+
static DEFAULT_WEB_CONFIG = {
|
|
54
|
+
browser: types_1.BrowserType.CHROMIUM,
|
|
55
|
+
headless: false,
|
|
56
|
+
baseURL: "",
|
|
57
|
+
viewport: { width: 1920, height: 1080 },
|
|
58
|
+
timeout: 30000,
|
|
59
|
+
slowMo: 0,
|
|
60
|
+
ignoreHTTPSErrors: false,
|
|
61
|
+
screenshotOnFailure: true,
|
|
62
|
+
screenshotDir: "./screenshots",
|
|
63
|
+
recordVideo: false,
|
|
64
|
+
videoDir: "./videos",
|
|
65
|
+
trace: false,
|
|
66
|
+
traceDir: "./traces",
|
|
67
|
+
logLevel: types_1.LogLevel.INFO,
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Default API configuration
|
|
71
|
+
*/
|
|
72
|
+
static DEFAULT_API_CONFIG = {
|
|
73
|
+
baseURL: "",
|
|
74
|
+
timeout: 30000,
|
|
75
|
+
headers: {},
|
|
76
|
+
ignoreHTTPSErrors: false,
|
|
77
|
+
enableLogging: true,
|
|
78
|
+
retryCount: 3,
|
|
79
|
+
retryDelay: 1000,
|
|
80
|
+
logLevel: types_1.LogLevel.INFO,
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Default Mobile configuration
|
|
84
|
+
*/
|
|
85
|
+
static DEFAULT_MOBILE_CONFIG = {
|
|
86
|
+
platform: types_1.MobilePlatform.ANDROID,
|
|
87
|
+
deviceName: "",
|
|
88
|
+
timeout: 60000,
|
|
89
|
+
appiumHost: "localhost",
|
|
90
|
+
appiumPort: 4723,
|
|
91
|
+
appiumPath: "/",
|
|
92
|
+
automationName: "UiAutomator2",
|
|
93
|
+
noReset: true,
|
|
94
|
+
fullReset: false,
|
|
95
|
+
autoAcceptAlerts: false,
|
|
96
|
+
autoDismissAlerts: false,
|
|
97
|
+
newCommandTimeout: 120,
|
|
98
|
+
orientation: "PORTRAIT",
|
|
99
|
+
screenshotOnFailure: true,
|
|
100
|
+
screenshotDir: "./screenshots",
|
|
101
|
+
logLevel: types_1.LogLevel.INFO,
|
|
102
|
+
};
|
|
103
|
+
constructor() {
|
|
104
|
+
this.config = {};
|
|
105
|
+
this.logger = logger_1.Logger.getInstance();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get singleton instance
|
|
109
|
+
*/
|
|
110
|
+
static getInstance() {
|
|
111
|
+
if (!ConfigManager.instance) {
|
|
112
|
+
ConfigManager.instance = new ConfigManager();
|
|
113
|
+
}
|
|
114
|
+
return ConfigManager.instance;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Reset the singleton instance
|
|
118
|
+
*/
|
|
119
|
+
static resetInstance() {
|
|
120
|
+
ConfigManager.instance = null;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Load configuration from environment variables
|
|
124
|
+
*/
|
|
125
|
+
loadFromEnv(envPath) {
|
|
126
|
+
// Load .env file if exists
|
|
127
|
+
const envFilePath = envPath ?? path.resolve(process.cwd(), ".env");
|
|
128
|
+
if (fs.existsSync(envFilePath)) {
|
|
129
|
+
dotenv.config({ path: envFilePath });
|
|
130
|
+
this.logger.debug(`Loaded environment from: ${envFilePath}`);
|
|
131
|
+
}
|
|
132
|
+
// Parse web config from env
|
|
133
|
+
this.config.web = this.parseWebConfigFromEnv();
|
|
134
|
+
// Parse API config from env
|
|
135
|
+
this.config.api = this.parseApiConfigFromEnv();
|
|
136
|
+
// Parse mobile config from env
|
|
137
|
+
this.config.mobile = this.parseMobileConfigFromEnv();
|
|
138
|
+
// Parse global settings
|
|
139
|
+
this.config.globalTimeout = this.getEnvNumber("GLOBAL_TIMEOUT", 30000);
|
|
140
|
+
this.loadedSources.push("env");
|
|
141
|
+
return this;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Load configuration from a JSON/JS file
|
|
145
|
+
*/
|
|
146
|
+
loadFromFile(filePath) {
|
|
147
|
+
const absolutePath = path.resolve(process.cwd(), filePath);
|
|
148
|
+
if (!fs.existsSync(absolutePath)) {
|
|
149
|
+
this.logger.warn(`Config file not found: ${absolutePath}`);
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
const fileContent = fs.readFileSync(absolutePath, "utf-8");
|
|
154
|
+
const fileConfig = JSON.parse(fileContent);
|
|
155
|
+
this.mergeConfig(fileConfig);
|
|
156
|
+
this.loadedSources.push("file");
|
|
157
|
+
this.logger.debug(`Loaded configuration from: ${absolutePath}`);
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
this.logger.error(`Failed to load config file: ${error.message}`);
|
|
161
|
+
}
|
|
162
|
+
return this;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Load configuration from an object
|
|
166
|
+
*/
|
|
167
|
+
loadFromObject(config) {
|
|
168
|
+
this.mergeConfig(config);
|
|
169
|
+
this.loadedSources.push("object");
|
|
170
|
+
return this;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Apply default configuration
|
|
174
|
+
*/
|
|
175
|
+
applyDefaults() {
|
|
176
|
+
this.config.web = {
|
|
177
|
+
...ConfigManager.DEFAULT_WEB_CONFIG,
|
|
178
|
+
...this.config.web,
|
|
179
|
+
};
|
|
180
|
+
this.config.api = {
|
|
181
|
+
...ConfigManager.DEFAULT_API_CONFIG,
|
|
182
|
+
...this.config.api,
|
|
183
|
+
};
|
|
184
|
+
this.config.mobile = {
|
|
185
|
+
...ConfigManager.DEFAULT_MOBILE_CONFIG,
|
|
186
|
+
...this.config.mobile,
|
|
187
|
+
};
|
|
188
|
+
this.loadedSources.push("default");
|
|
189
|
+
return this;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Get the full framework configuration
|
|
193
|
+
*/
|
|
194
|
+
getConfig() {
|
|
195
|
+
return this.config;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get web configuration
|
|
199
|
+
*/
|
|
200
|
+
getWebConfig() {
|
|
201
|
+
return this.config.web || ConfigManager.DEFAULT_WEB_CONFIG;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get API configuration
|
|
205
|
+
*/
|
|
206
|
+
getApiConfig() {
|
|
207
|
+
return this.config.api || ConfigManager.DEFAULT_API_CONFIG;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get mobile configuration
|
|
211
|
+
*/
|
|
212
|
+
getMobileConfig() {
|
|
213
|
+
return this.config.mobile || ConfigManager.DEFAULT_MOBILE_CONFIG;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get configuration for a specific platform
|
|
217
|
+
*/
|
|
218
|
+
getConfigForPlatform(platform) {
|
|
219
|
+
switch (platform) {
|
|
220
|
+
case types_1.Platform.WEB:
|
|
221
|
+
return this.getWebConfig();
|
|
222
|
+
case types_1.Platform.API:
|
|
223
|
+
return this.getApiConfig();
|
|
224
|
+
case types_1.Platform.MOBILE:
|
|
225
|
+
return this.getMobileConfig();
|
|
226
|
+
default:
|
|
227
|
+
throw new Error(`Unknown platform: ${platform}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get loaded sources
|
|
232
|
+
*/
|
|
233
|
+
getLoadedSources() {
|
|
234
|
+
return this.loadedSources;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Validate the configuration
|
|
238
|
+
*/
|
|
239
|
+
validate() {
|
|
240
|
+
const errors = [];
|
|
241
|
+
// Validate web config
|
|
242
|
+
if (this.config.web) {
|
|
243
|
+
if (!Object.values(types_1.BrowserType).includes(this.config.web.browser)) {
|
|
244
|
+
errors.push(`Invalid browser type: ${this.config.web.browser}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Validate API config
|
|
248
|
+
if (this.config.api) {
|
|
249
|
+
if (!this.config.api.baseURL) {
|
|
250
|
+
errors.push("API baseURL is required");
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// Validate mobile config
|
|
254
|
+
if (this.config.mobile) {
|
|
255
|
+
if (!this.config.mobile.deviceName) {
|
|
256
|
+
errors.push("Mobile deviceName is required");
|
|
257
|
+
}
|
|
258
|
+
if (!Object.values(types_1.MobilePlatform).includes(this.config.mobile.platform)) {
|
|
259
|
+
errors.push(`Invalid mobile platform: ${this.config.mobile.platform}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return {
|
|
263
|
+
valid: errors.length === 0,
|
|
264
|
+
errors,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Set a specific configuration value
|
|
269
|
+
*/
|
|
270
|
+
set(key, value) {
|
|
271
|
+
this.config[key] = value;
|
|
272
|
+
return this;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get a specific configuration value
|
|
276
|
+
*/
|
|
277
|
+
get(key) {
|
|
278
|
+
return this.config[key];
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Merge configuration
|
|
282
|
+
*/
|
|
283
|
+
mergeConfig(config) {
|
|
284
|
+
if (config.web) {
|
|
285
|
+
this.config.web = { ...this.config.web, ...config.web };
|
|
286
|
+
}
|
|
287
|
+
if (config.api) {
|
|
288
|
+
this.config.api = { ...this.config.api, ...config.api };
|
|
289
|
+
}
|
|
290
|
+
if (config.mobile) {
|
|
291
|
+
this.config.mobile = { ...this.config.mobile, ...config.mobile };
|
|
292
|
+
}
|
|
293
|
+
if (config.globalTimeout !== undefined) {
|
|
294
|
+
this.config.globalTimeout = config.globalTimeout;
|
|
295
|
+
}
|
|
296
|
+
if (config.parallel) {
|
|
297
|
+
this.config.parallel = { ...this.config.parallel, ...config.parallel };
|
|
298
|
+
}
|
|
299
|
+
if (config.reporting) {
|
|
300
|
+
this.config.reporting = { ...this.config.reporting, ...config.reporting };
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Parse web config from environment variables
|
|
305
|
+
*/
|
|
306
|
+
parseWebConfigFromEnv() {
|
|
307
|
+
return {
|
|
308
|
+
browser: this.getEnvEnum("BROWSER", types_1.BrowserType, types_1.BrowserType.CHROMIUM),
|
|
309
|
+
headless: this.getEnvBoolean("HEADLESS", false),
|
|
310
|
+
baseURL: this.getEnvString("BASE_URL", ""),
|
|
311
|
+
viewport: {
|
|
312
|
+
width: this.getEnvNumber("VIEWPORT_WIDTH", 1920),
|
|
313
|
+
height: this.getEnvNumber("VIEWPORT_HEIGHT", 1080),
|
|
314
|
+
},
|
|
315
|
+
timeout: this.getEnvNumber("GLOBAL_TIMEOUT", 30000),
|
|
316
|
+
slowMo: this.getEnvNumber("SLOW_MO", 0),
|
|
317
|
+
ignoreHTTPSErrors: this.getEnvBoolean("IGNORE_HTTPS_ERRORS", false),
|
|
318
|
+
deviceEmulation: this.getEnvString("DEVICE_EMULATION", undefined),
|
|
319
|
+
locale: this.getEnvString("LOCALE", "en-US"),
|
|
320
|
+
timezoneId: this.getEnvString("TIMEZONE_ID", undefined),
|
|
321
|
+
screenshotOnFailure: this.getEnvBoolean("SCREENSHOT_ON_FAILURE", true),
|
|
322
|
+
screenshotDir: this.getEnvString("SCREENSHOT_DIR", "./screenshots"),
|
|
323
|
+
recordVideo: this.getEnvBoolean("RECORD_VIDEO", false),
|
|
324
|
+
videoDir: this.getEnvString("VIDEO_DIR", "./videos"),
|
|
325
|
+
trace: this.getEnvBoolean("TRACE_ENABLED", false),
|
|
326
|
+
traceDir: this.getEnvString("TRACE_DIR", "./traces"),
|
|
327
|
+
storageState: this.getEnvString("STORAGE_STATE", undefined),
|
|
328
|
+
logLevel: this.getEnvEnum("LOG_LEVEL", types_1.LogLevel, types_1.LogLevel.INFO),
|
|
329
|
+
proxy: this.parseProxyFromEnv(),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Parse API config from environment variables
|
|
334
|
+
*/
|
|
335
|
+
parseApiConfigFromEnv() {
|
|
336
|
+
const authUsername = this.getEnvString("API_AUTH_USERNAME", undefined);
|
|
337
|
+
const authPassword = this.getEnvString("API_AUTH_PASSWORD", undefined);
|
|
338
|
+
return {
|
|
339
|
+
baseURL: this.getEnvString("API_BASE_URL", ""),
|
|
340
|
+
timeout: this.getEnvNumber("API_TIMEOUT", 30000),
|
|
341
|
+
ignoreHTTPSErrors: this.getEnvBoolean("IGNORE_HTTPS_ERRORS", false),
|
|
342
|
+
enableLogging: this.getEnvBoolean("API_LOGGING", true),
|
|
343
|
+
retryCount: this.getEnvNumber("API_RETRY_COUNT", 3),
|
|
344
|
+
retryDelay: this.getEnvNumber("API_RETRY_DELAY", 1000),
|
|
345
|
+
logLevel: this.getEnvEnum("LOG_LEVEL", types_1.LogLevel, types_1.LogLevel.INFO),
|
|
346
|
+
httpCredentials: authUsername && authPassword
|
|
347
|
+
? { username: authUsername, password: authPassword }
|
|
348
|
+
: undefined,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Parse mobile config from environment variables
|
|
353
|
+
*/
|
|
354
|
+
parseMobileConfigFromEnv() {
|
|
355
|
+
const platform = this.getEnvEnum("MOBILE_PLATFORM", types_1.MobilePlatform, types_1.MobilePlatform.ANDROID);
|
|
356
|
+
return {
|
|
357
|
+
platform,
|
|
358
|
+
deviceName: this.getEnvString("DEVICE_NAME", ""),
|
|
359
|
+
platformVersion: this.getEnvString("PLATFORM_VERSION", undefined),
|
|
360
|
+
app: this.getEnvString("APP_PATH", undefined),
|
|
361
|
+
bundleId: this.getEnvString("BUNDLE_ID", undefined),
|
|
362
|
+
appPackage: this.getEnvString("APP_PACKAGE", undefined),
|
|
363
|
+
appActivity: this.getEnvString("APP_ACTIVITY", undefined),
|
|
364
|
+
automationName: platform === types_1.MobilePlatform.ANDROID
|
|
365
|
+
? this.getEnvString("AUTOMATION_NAME", "UiAutomator2")
|
|
366
|
+
: this.getEnvString("IOS_AUTOMATION_NAME", "XCUITest"),
|
|
367
|
+
udid: this.getEnvString("UDID", undefined),
|
|
368
|
+
appiumHost: this.getEnvString("APPIUM_HOST", "localhost"),
|
|
369
|
+
appiumPort: this.getEnvNumber("APPIUM_PORT", 4723),
|
|
370
|
+
appiumPath: this.getEnvString("APPIUM_PATH", "/"),
|
|
371
|
+
noReset: this.getEnvBoolean("NO_RESET", true),
|
|
372
|
+
fullReset: this.getEnvBoolean("FULL_RESET", false),
|
|
373
|
+
autoAcceptAlerts: this.getEnvBoolean("AUTO_ACCEPT_ALERTS", false),
|
|
374
|
+
autoDismissAlerts: this.getEnvBoolean("AUTO_DISMISS_ALERTS", false),
|
|
375
|
+
newCommandTimeout: this.getEnvNumber("NEW_COMMAND_TIMEOUT", 120),
|
|
376
|
+
orientation: this.getEnvString("ORIENTATION", "PORTRAIT"),
|
|
377
|
+
timeout: this.getEnvNumber("GLOBAL_TIMEOUT", 60000),
|
|
378
|
+
screenshotOnFailure: this.getEnvBoolean("SCREENSHOT_ON_FAILURE", true),
|
|
379
|
+
screenshotDir: this.getEnvString("SCREENSHOT_DIR", "./screenshots"),
|
|
380
|
+
logLevel: this.getEnvEnum("LOG_LEVEL", types_1.LogLevel, types_1.LogLevel.INFO),
|
|
381
|
+
webviewConnectTimeout: this.getEnvNumber("WEBVIEW_CONNECT_TIMEOUT", 5000),
|
|
382
|
+
enablePerformanceLogging: this.getEnvBoolean("ENABLE_PERFORMANCE_LOGGING", false),
|
|
383
|
+
useSimulator: this.getEnvBoolean("USE_SIMULATOR", false),
|
|
384
|
+
useEmulator: this.getEnvBoolean("USE_EMULATOR", false),
|
|
385
|
+
avd: this.getEnvString("AVD_NAME", undefined),
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Parse proxy configuration from environment
|
|
390
|
+
*/
|
|
391
|
+
parseProxyFromEnv() {
|
|
392
|
+
const server = this.getEnvString("PROXY_SERVER", undefined);
|
|
393
|
+
if (!server) {
|
|
394
|
+
return undefined;
|
|
395
|
+
}
|
|
396
|
+
return {
|
|
397
|
+
server,
|
|
398
|
+
username: this.getEnvString("PROXY_USERNAME", undefined),
|
|
399
|
+
password: this.getEnvString("PROXY_PASSWORD", undefined),
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
getEnvString(key, defaultValue) {
|
|
403
|
+
return process.env[key] || defaultValue;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Get number from environment
|
|
407
|
+
*/
|
|
408
|
+
getEnvNumber(key, defaultValue) {
|
|
409
|
+
const value = process.env[key];
|
|
410
|
+
if (value === undefined) {
|
|
411
|
+
return defaultValue;
|
|
412
|
+
}
|
|
413
|
+
const parsed = parseInt(value, 10);
|
|
414
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Get boolean from environment
|
|
418
|
+
*/
|
|
419
|
+
getEnvBoolean(key, defaultValue) {
|
|
420
|
+
const value = process.env[key];
|
|
421
|
+
if (value === undefined) {
|
|
422
|
+
return defaultValue;
|
|
423
|
+
}
|
|
424
|
+
return value.toLowerCase() === "true" || value === "1";
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Get enum value from environment
|
|
428
|
+
*/
|
|
429
|
+
getEnvEnum(key, enumObj, defaultValue) {
|
|
430
|
+
const value = process.env[key];
|
|
431
|
+
if (value === undefined) {
|
|
432
|
+
return defaultValue;
|
|
433
|
+
}
|
|
434
|
+
const enumValues = Object.values(enumObj);
|
|
435
|
+
if (enumValues.includes(value)) {
|
|
436
|
+
return value;
|
|
437
|
+
}
|
|
438
|
+
return defaultValue;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Export configuration to JSON file
|
|
442
|
+
*/
|
|
443
|
+
exportToFile(filePath) {
|
|
444
|
+
const absolutePath = path.resolve(process.cwd(), filePath);
|
|
445
|
+
const dir = path.dirname(absolutePath);
|
|
446
|
+
if (!fs.existsSync(dir)) {
|
|
447
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
448
|
+
}
|
|
449
|
+
fs.writeFileSync(absolutePath, JSON.stringify(this.config, null, 2));
|
|
450
|
+
this.logger.info(`Configuration exported to: ${absolutePath}`);
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Print configuration summary
|
|
454
|
+
*/
|
|
455
|
+
printSummary() {
|
|
456
|
+
this.logger.info("=== Configuration Summary ===");
|
|
457
|
+
this.logger.info(`Sources loaded: ${this.loadedSources.join(", ")}`);
|
|
458
|
+
if (this.config.web) {
|
|
459
|
+
this.logger.info(`Web: browser=${this.config.web.browser}, headless=${this.config.web.headless}`);
|
|
460
|
+
}
|
|
461
|
+
if (this.config.api) {
|
|
462
|
+
this.logger.info(`API: baseURL=${this.config.api.baseURL}`);
|
|
463
|
+
}
|
|
464
|
+
if (this.config.mobile) {
|
|
465
|
+
this.logger.info(`Mobile: platform=${this.config.mobile.platform}, device=${this.config.mobile.deviceName}`);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
exports.ConfigManager = ConfigManager;
|
|
470
|
+
// Export convenience function
|
|
471
|
+
const getConfig = () => ConfigManager.getInstance();
|
|
472
|
+
exports.getConfig = getConfig;
|
|
473
|
+
//# sourceMappingURL=config.manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.manager.js","sourceRoot":"","sources":["../../src/utils/config.manager.ts"],"names":[],"mappings":"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"}
|