@thinkwise/testwise 0.0.2-alpha.2
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/.ci/azure-pipelines.yaml +80 -0
- package/.eslintcache +1 -0
- package/.gitattributes +3 -0
- package/.gitconfig +2 -0
- package/.vscode/settings.json +18 -0
- package/Testwise.ts +22 -0
- package/components/BaseComponent.ts +95 -0
- package/components/BaseComponentObjects.ts +10 -0
- package/components/IComponentObjects.ts +5 -0
- package/components/Splitter.ts +11 -0
- package/components/TSFComponent.ts +8 -0
- package/components/actionbar/Actionbar.ts +57 -0
- package/components/actionbar/ActionbarObjects.ts +67 -0
- package/components/export/ExportComponent.ts +70 -0
- package/components/export/ExportComponentObjects.ts +23 -0
- package/components/filter/FilterForm.ts +11 -0
- package/components/filter/FindForm.ts +11 -0
- package/components/form/Form.ts +31 -0
- package/components/grid/Grid.ts +221 -0
- package/components/grid/GridObjects.ts +45 -0
- package/components/index.ts +6 -0
- package/components/pop-up/PopUpComponent.ts +14 -0
- package/components/pop-up/PopUpComponentModels.ts +13 -0
- package/components/tab/Tab.ts +29 -0
- package/components/task/TaskBar.ts +11 -0
- package/components/task/TaskTiles.ts +11 -0
- package/config.json +10 -0
- package/dist/Testwise.d.ts +2 -0
- package/dist/Testwise.js +14 -0
- package/dist/Testwise.js.map +1 -0
- package/dist/components/BaseComponent.d.ts +29 -0
- package/dist/components/BaseComponent.js +67 -0
- package/dist/components/BaseComponent.js.map +1 -0
- package/dist/components/BaseComponentObjects.d.ts +6 -0
- package/dist/components/BaseComponentObjects.js +6 -0
- package/dist/components/BaseComponentObjects.js.map +1 -0
- package/dist/components/IComponentObjects.d.ts +4 -0
- package/dist/components/IComponentObjects.js +2 -0
- package/dist/components/IComponentObjects.js.map +1 -0
- package/dist/components/Splitter.d.ts +5 -0
- package/dist/components/Splitter.js +10 -0
- package/dist/components/Splitter.js.map +1 -0
- package/dist/components/TSFComponent.d.ts +6 -0
- package/dist/components/TSFComponent.js +2 -0
- package/dist/components/TSFComponent.js.map +1 -0
- package/dist/components/actionbar/Actionbar.d.ts +27 -0
- package/dist/components/actionbar/Actionbar.js +35 -0
- package/dist/components/actionbar/Actionbar.js.map +1 -0
- package/dist/components/actionbar/ActionbarObjects.d.ts +24 -0
- package/dist/components/actionbar/ActionbarObjects.js +30 -0
- package/dist/components/actionbar/ActionbarObjects.js.map +1 -0
- package/dist/components/export/ExportComponent.d.ts +12 -0
- package/dist/components/export/ExportComponent.js +55 -0
- package/dist/components/export/ExportComponent.js.map +1 -0
- package/dist/components/export/ExportComponentObjects.d.ts +11 -0
- package/dist/components/export/ExportComponentObjects.js +12 -0
- package/dist/components/export/ExportComponentObjects.js.map +1 -0
- package/dist/components/form/Form.d.ts +7 -0
- package/dist/components/form/Form.js +31 -0
- package/dist/components/form/Form.js.map +1 -0
- package/dist/components/grid/Grid.d.ts +93 -0
- package/dist/components/grid/Grid.js +183 -0
- package/dist/components/grid/Grid.js.map +1 -0
- package/dist/components/grid/GridObjects.d.ts +20 -0
- package/dist/components/grid/GridObjects.js +25 -0
- package/dist/components/grid/GridObjects.js.map +1 -0
- package/dist/components/index.d.ts +6 -0
- package/dist/components/index.js +7 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/pop-up/PopUpComponent.d.ts +7 -0
- package/dist/components/pop-up/PopUpComponent.js +9 -0
- package/dist/components/pop-up/PopUpComponent.js.map +1 -0
- package/dist/components/pop-up/PopUpComponentModels.d.ts +7 -0
- package/dist/components/pop-up/PopUpComponentModels.js +8 -0
- package/dist/components/pop-up/PopUpComponentModels.js.map +1 -0
- package/dist/config.json +10 -0
- package/dist/enums/ActionbarRegions.d.ts +5 -0
- package/dist/enums/ActionbarRegions.js +7 -0
- package/dist/enums/ActionbarRegions.js.map +1 -0
- package/dist/enums/ButtonEnums.d.ts +24 -0
- package/dist/enums/ButtonEnums.js +29 -0
- package/dist/enums/ButtonEnums.js.map +1 -0
- package/dist/enums/ExportFormat.d.ts +5 -0
- package/dist/enums/ExportFormat.js +7 -0
- package/dist/enums/ExportFormat.js.map +1 -0
- package/dist/enums/LogLevel.d.ts +8 -0
- package/dist/enums/LogLevel.js +11 -0
- package/dist/enums/LogLevel.js.map +1 -0
- package/dist/example-code/TestifyService.d.ts +22 -0
- package/dist/example-code/TestifyService.js +191 -0
- package/dist/example-code/TestifyService.js.map +1 -0
- package/dist/helpers/InflightRequestTracker.d.ts +10 -0
- package/dist/helpers/InflightRequestTracker.js +26 -0
- package/dist/helpers/InflightRequestTracker.js.map +1 -0
- package/dist/helpers/LoginHelper.d.ts +38 -0
- package/dist/helpers/LoginHelper.js +112 -0
- package/dist/helpers/LoginHelper.js.map +1 -0
- package/dist/helpers/UserSimulationHelper.d.ts +20 -0
- package/dist/helpers/UserSimulationHelper.js +62 -0
- package/dist/helpers/UserSimulationHelper.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/page-extensions/GoToDeepLink.d.ts +11 -0
- package/dist/page-extensions/GoToDeepLink.js +17 -0
- package/dist/page-extensions/GoToDeepLink.js.map +1 -0
- package/dist/page-extensions/LoginFeatures.d.ts +16 -0
- package/dist/page-extensions/LoginFeatures.js +30 -0
- package/dist/page-extensions/LoginFeatures.js.map +1 -0
- package/dist/page-extensions/UserSimulation.d.ts +15 -0
- package/dist/page-extensions/UserSimulation.js +30 -0
- package/dist/page-extensions/UserSimulation.js.map +1 -0
- package/dist/page-overrides/ClickOverride.d.ts +6 -0
- package/dist/page-overrides/ClickOverride.js +73 -0
- package/dist/page-overrides/ClickOverride.js.map +1 -0
- package/dist/services/ConfigBuilder.d.ts +12 -0
- package/dist/services/ConfigBuilder.js +30 -0
- package/dist/services/ConfigBuilder.js.map +1 -0
- package/dist/services/Logger.d.ts +8 -0
- package/dist/services/Logger.js +106 -0
- package/dist/services/Logger.js.map +1 -0
- package/dist/services/ReportingService.d.ts +8 -0
- package/dist/services/ReportingService.js +29 -0
- package/dist/services/ReportingService.js.map +1 -0
- package/dist/types/CoreTypes.d.ts +2 -0
- package/dist/types/CoreTypes.js +2 -0
- package/dist/types/CoreTypes.js.map +1 -0
- package/dist/types/universal.d.ts +25 -0
- package/dist/types/universal.js +2 -0
- package/dist/types/universal.js.map +1 -0
- package/enums/ActionbarRegions.ts +5 -0
- package/enums/ButtonEnums.ts +28 -0
- package/enums/ExportFormat.ts +5 -0
- package/enums/LogLevel.ts +9 -0
- package/example-code/TestifyService.ts +201 -0
- package/helpers/InflightRequestTracker.ts +33 -0
- package/helpers/LoginHelper.ts +140 -0
- package/helpers/UserSimulationHelper.ts +72 -0
- package/index.ts +28 -0
- package/package.json +40 -0
- package/page-extensions/GoToDeepLink.ts +29 -0
- package/page-extensions/LoginFeatures.ts +50 -0
- package/page-extensions/UserSimulation.ts +49 -0
- package/page-overrides/ClickOverride.ts +89 -0
- package/promptCredentials.js +113 -0
- package/scripts/Testwise.template.json +19 -0
- package/scripts/add-config.js +23 -0
- package/services/ConfigBuilder.ts +40 -0
- package/services/Logger.ts +125 -0
- package/services/ReportingService.ts +41 -0
- package/types/CoreTypes.ts +9 -0
- package/types/universal.ts +26 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
declare const originalLog: {
|
|
2
|
+
(...data: any[]): void;
|
|
3
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
4
|
+
};
|
|
5
|
+
declare const originalInfo: {
|
|
6
|
+
(...data: any[]): void;
|
|
7
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
8
|
+
};
|
|
9
|
+
declare const originalWarn: {
|
|
10
|
+
(...data: any[]): void;
|
|
11
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
12
|
+
};
|
|
13
|
+
declare const originalError: {
|
|
14
|
+
(...data: any[]): void;
|
|
15
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
16
|
+
};
|
|
17
|
+
declare const originalDebug: {
|
|
18
|
+
(...data: any[]): void;
|
|
19
|
+
(message?: any, ...optionalParams: any[]): void;
|
|
20
|
+
};
|
|
21
|
+
export { originalLog, originalInfo, originalWarn, originalError, originalDebug };
|
|
22
|
+
export * from './services/ConfigBuilder.js';
|
|
23
|
+
export * from './Testwise.js';
|
|
24
|
+
export * from './helpers/LoginHelper.js';
|
|
25
|
+
export * from './page-extensions/GoToDeepLink.js';
|
|
26
|
+
export * from './page-extensions/LoginFeatures.js';
|
|
27
|
+
export * from './page-extensions/UserSimulation.js';
|
|
28
|
+
export * from './page-overrides/ClickOverride.js';
|
|
29
|
+
export * from './types/CoreTypes.js';
|
|
30
|
+
export * from './types/universal.js';
|
|
31
|
+
export * from './enums/ButtonEnums.js';
|
|
32
|
+
export * from './enums/ActionbarRegions.js';
|
|
33
|
+
export * from './enums/ExportFormat.js';
|
|
34
|
+
export * from './components/index.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { logger } from './services/Logger.js';
|
|
2
|
+
const originalLog = console.log;
|
|
3
|
+
const originalInfo = console.info;
|
|
4
|
+
const originalWarn = console.warn;
|
|
5
|
+
const originalError = console.error;
|
|
6
|
+
const originalDebug = console.debug;
|
|
7
|
+
console.log = (...args) => logger.info(args.join(' '));
|
|
8
|
+
console.info = (...args) => logger.info(args.join(' '));
|
|
9
|
+
console.warn = (...args) => logger.warn(args.join(' '));
|
|
10
|
+
console.error = (...args) => logger.error(args.join(' '));
|
|
11
|
+
console.debug = (...args) => logger.debug(args.join(' '));
|
|
12
|
+
export { originalLog, originalInfo, originalWarn, originalError, originalDebug };
|
|
13
|
+
export * from './services/ConfigBuilder.js';
|
|
14
|
+
export * from './Testwise.js';
|
|
15
|
+
export * from './helpers/LoginHelper.js';
|
|
16
|
+
export * from './page-extensions/GoToDeepLink.js';
|
|
17
|
+
export * from './page-extensions/LoginFeatures.js';
|
|
18
|
+
export * from './page-extensions/UserSimulation.js';
|
|
19
|
+
export * from './page-overrides/ClickOverride.js';
|
|
20
|
+
export * from './types/CoreTypes.js';
|
|
21
|
+
export * from './types/universal.js';
|
|
22
|
+
export * from './enums/ButtonEnums.js';
|
|
23
|
+
export * from './enums/ActionbarRegions.js';
|
|
24
|
+
export * from './enums/ExportFormat.js';
|
|
25
|
+
export * from './components/index.js';
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;AAChC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;AAClC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;AAClC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;AACpC,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;AAEpC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAClE,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,OAAO,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AACjF,cAAc,6BAA6B,CAAC;AAC5C,cAAc,eAAe,CAAC;AAC9B,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Test } from '../types/CoreTypes.js';
|
|
2
|
+
declare module '@playwright/test' {
|
|
3
|
+
interface Page {
|
|
4
|
+
goToDeepLink(deepLink: string): Promise<null | import('@playwright/test').Response>;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export declare class GoToDeepLink {
|
|
8
|
+
private _test;
|
|
9
|
+
constructor(test: Test);
|
|
10
|
+
get test(): Test;
|
|
11
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class GoToDeepLink {
|
|
2
|
+
constructor(test) {
|
|
3
|
+
this._test = test.extend({
|
|
4
|
+
page: async ({ page }, use) => {
|
|
5
|
+
page.goToDeepLink = async (deepLink) => {
|
|
6
|
+
const url = new URL(await page.url());
|
|
7
|
+
return await page.goto(`${url}/${deepLink}`);
|
|
8
|
+
};
|
|
9
|
+
await use(page);
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
get test() {
|
|
14
|
+
return this._test;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=GoToDeepLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoToDeepLink.js","sourceRoot":"","sources":["../../page-extensions/GoToDeepLink.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,YAAY;IAGvB,YAAY,IAAU;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;gBAC5B,IAAI,CAAC,YAAY,GAAG,KAAK,EAAE,QAAgB,EAAuD,EAAE;oBAClG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBAEtC,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC;gBAC/C,CAAC,CAAC;gBAEF,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Test } from '../types/CoreTypes.js';
|
|
2
|
+
import type { UniversalLoginOptions } from '../types/universal.js';
|
|
3
|
+
declare module '@playwright/test' {
|
|
4
|
+
interface Page {
|
|
5
|
+
logIn(): Promise<void>;
|
|
6
|
+
logInWithCredentials(username: string, password: string): Promise<void>;
|
|
7
|
+
logInWithOptions(options: UniversalLoginOptions): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export declare class LoginFeatures {
|
|
11
|
+
private _loginHelper;
|
|
12
|
+
private _test;
|
|
13
|
+
constructor(test: Test);
|
|
14
|
+
private get loginHelper();
|
|
15
|
+
get test(): Test;
|
|
16
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { LoginHelper } from '../helpers/LoginHelper.js';
|
|
2
|
+
export class LoginFeatures {
|
|
3
|
+
constructor(test) {
|
|
4
|
+
this._test = test.extend({
|
|
5
|
+
page: async ({ page }, use) => {
|
|
6
|
+
this._loginHelper = new LoginHelper(page);
|
|
7
|
+
page.logIn = async () => {
|
|
8
|
+
await this.loginHelper.logIn();
|
|
9
|
+
};
|
|
10
|
+
page.logInWithCredentials = async (username, password) => {
|
|
11
|
+
await this.loginHelper.logInWithCredentials(username, password);
|
|
12
|
+
};
|
|
13
|
+
page.logInWithOptions = async (options) => {
|
|
14
|
+
await this.loginHelper.logInWithOptions(options);
|
|
15
|
+
};
|
|
16
|
+
await use(page);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
get loginHelper() {
|
|
21
|
+
if (!this._loginHelper) {
|
|
22
|
+
throw new Error('LoginHelper is not initialized');
|
|
23
|
+
}
|
|
24
|
+
return this._loginHelper;
|
|
25
|
+
}
|
|
26
|
+
get test() {
|
|
27
|
+
return this._test;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=LoginFeatures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoginFeatures.js","sourceRoot":"","sources":["../../page-extensions/LoginFeatures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAYxD,MAAM,OAAO,aAAa;IAIxB,YAAY,IAAU;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;gBAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;gBAE1C,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE;oBACtB,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACjC,CAAC,CAAC;gBAEF,IAAI,CAAC,oBAAoB,GAAG,KAAK,EAAE,QAAgB,EAAE,QAAgB,EAAE,EAAE;oBACvE,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAClE,CAAC,CAAC;gBAEF,IAAI,CAAC,gBAAgB,GAAG,KAAK,EAAE,OAA8B,EAAE,EAAE;oBAC/D,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACnD,CAAC,CAAC;gBAEF,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAY,WAAW;QACrB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Test } from '../types/CoreTypes.js';
|
|
2
|
+
declare module '@playwright/test' {
|
|
3
|
+
interface Page {
|
|
4
|
+
simulateUser(username: string): Promise<void>;
|
|
5
|
+
getSimulatedUser(): Promise<string>;
|
|
6
|
+
stopSimulation(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export declare class UserSimulation {
|
|
10
|
+
private _userSimulationHelper;
|
|
11
|
+
private _test;
|
|
12
|
+
constructor(test: Test);
|
|
13
|
+
private get userSimulationHelper();
|
|
14
|
+
get test(): Test;
|
|
15
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { UserSimulationHelper } from '../helpers/UserSimulationHelper.js';
|
|
2
|
+
export class UserSimulation {
|
|
3
|
+
constructor(test) {
|
|
4
|
+
this._test = test.extend({
|
|
5
|
+
page: async ({ page }, use) => {
|
|
6
|
+
this._userSimulationHelper = new UserSimulationHelper(page);
|
|
7
|
+
page.simulateUser = async (username) => {
|
|
8
|
+
await this.userSimulationHelper.simulateUser(username);
|
|
9
|
+
};
|
|
10
|
+
page.getSimulatedUser = async () => {
|
|
11
|
+
return await this.userSimulationHelper.getSimulatedUser();
|
|
12
|
+
};
|
|
13
|
+
page.stopSimulation = async () => {
|
|
14
|
+
await this.userSimulationHelper.stopSimulation();
|
|
15
|
+
};
|
|
16
|
+
await use(page);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
get userSimulationHelper() {
|
|
21
|
+
if (!this._userSimulationHelper) {
|
|
22
|
+
throw new Error('UserSimulationHelper is not initialized');
|
|
23
|
+
}
|
|
24
|
+
return this._userSimulationHelper;
|
|
25
|
+
}
|
|
26
|
+
get test() {
|
|
27
|
+
return this._test;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=UserSimulation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserSimulation.js","sourceRoot":"","sources":["../../page-extensions/UserSimulation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAW1E,MAAM,OAAO,cAAc;IAIzB,YAAY,IAAU;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YACvB,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;gBAC5B,IAAI,CAAC,qBAAqB,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBAE5D,IAAI,CAAC,YAAY,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;oBAC7C,MAAM,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACzD,CAAC,CAAC;gBAEF,IAAI,CAAC,gBAAgB,GAAG,KAAK,IAAI,EAAE;oBACjC,OAAO,MAAM,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,CAAC;gBAC5D,CAAC,CAAC;gBAEF,IAAI,CAAC,cAAc,GAAG,KAAK,IAAI,EAAE;oBAC/B,MAAM,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE,CAAC;gBACnD,CAAC,CAAC;gBAEF,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,IAAY,oBAAoB;QAC9B,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { expect } from '@playwright/test';
|
|
2
|
+
import { InflightRequestsTracker } from '../helpers/InflightRequestTracker.js';
|
|
3
|
+
import { testwiseConfig } from '../services/ConfigBuilder.js';
|
|
4
|
+
export class ClickOverride {
|
|
5
|
+
constructor(test) {
|
|
6
|
+
this._test = test.extend({
|
|
7
|
+
page: async ({ page }, use) => {
|
|
8
|
+
const overrideClickMethod = (locator) => {
|
|
9
|
+
const originalClickMethod = locator.click.bind(locator);
|
|
10
|
+
locator.click = async (options) => {
|
|
11
|
+
if (testwiseConfig().get('InflightRequests.waitForRequestsToComplete') === true) {
|
|
12
|
+
const tracker = new InflightRequestsTracker(page);
|
|
13
|
+
await Promise.all([
|
|
14
|
+
originalClickMethod(options),
|
|
15
|
+
// Ensure at least one XHR request is issued
|
|
16
|
+
Promise.race([
|
|
17
|
+
page.waitForRequest((request) => request.resourceType() === 'xhr'),
|
|
18
|
+
new Promise((resolve) => setTimeout(resolve, 50)) // Wait briefly to ensure the XHR request is in flight
|
|
19
|
+
])
|
|
20
|
+
]);
|
|
21
|
+
// Wait for all XHR requests to finish
|
|
22
|
+
try {
|
|
23
|
+
await expect
|
|
24
|
+
.poll(() => tracker.inflightRequests().filter((request) => request.resourceType() === 'xhr').length, {
|
|
25
|
+
timeout: 3000
|
|
26
|
+
})
|
|
27
|
+
.toBe(0);
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
console.warn('Exception while waiting for inflight requests to finish:', e);
|
|
31
|
+
if (testwiseConfig().get('InflightRequests.swallowPollingExceptions') === false)
|
|
32
|
+
throw e;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
await originalClickMethod(options);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
return locator;
|
|
40
|
+
};
|
|
41
|
+
// Override the getByTestId.click method
|
|
42
|
+
const originalGetByTestId = page.getByTestId.bind(page);
|
|
43
|
+
page.getByTestId = (...args) => overrideClickMethod(originalGetByTestId(...args));
|
|
44
|
+
// Override the locator.click method
|
|
45
|
+
const originalLocator = page.locator.bind(page);
|
|
46
|
+
page.locator = (...args) => overrideClickMethod(originalLocator(...args));
|
|
47
|
+
// Override the getByAltText.click method
|
|
48
|
+
const originalGetByAltText = page.getByAltText.bind(page);
|
|
49
|
+
page.getByAltText = (...args) => overrideClickMethod(originalGetByAltText(...args));
|
|
50
|
+
// Override the getByLabel.click method
|
|
51
|
+
const originalGetByLabel = page.getByLabel.bind(page);
|
|
52
|
+
page.getByLabel = (...args) => overrideClickMethod(originalGetByLabel(...args));
|
|
53
|
+
// Override the getByRole.click method
|
|
54
|
+
const originalGetByRole = page.getByRole.bind(page);
|
|
55
|
+
page.getByRole = (...args) => overrideClickMethod(originalGetByRole(...args));
|
|
56
|
+
// Override the getByPlaceholder.click method
|
|
57
|
+
const originalGetByPlaceholder = page.getByPlaceholder.bind(page);
|
|
58
|
+
page.getByPlaceholder = (...args) => overrideClickMethod(originalGetByPlaceholder(...args));
|
|
59
|
+
// Override the getByText.click method
|
|
60
|
+
const originalGetByText = page.getByText.bind(page);
|
|
61
|
+
page.getByText = (...args) => overrideClickMethod(originalGetByText(...args));
|
|
62
|
+
// Override the getByTitle.click method
|
|
63
|
+
const originalGetByTitle = page.getByTitle.bind(page);
|
|
64
|
+
page.getByTitle = (...args) => overrideClickMethod(originalGetByTitle(...args));
|
|
65
|
+
await use(page);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
get test() {
|
|
70
|
+
return this._test;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=ClickOverride.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClickOverride.js","sourceRoot":"","sources":["../../page-overrides/ClickOverride.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare class ConfigBuilder {
|
|
2
|
+
private config;
|
|
3
|
+
constructor();
|
|
4
|
+
/**
|
|
5
|
+
* Retrieves a value from the config using a dot-separated key.
|
|
6
|
+
* @param key - The dot-separated key to retrieve the value.
|
|
7
|
+
* @returns The value associated with the key, or undefined if not found.
|
|
8
|
+
*/
|
|
9
|
+
get<T>(key: string): T | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare function testwiseConfig(): ConfigBuilder;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
class ConfigBuilder {
|
|
4
|
+
constructor() {
|
|
5
|
+
const configFilePath = path.resolve(process.cwd(), 'Testwise.json');
|
|
6
|
+
if (!fs.existsSync(configFilePath)) {
|
|
7
|
+
throw new Error(`Config file not found at path: ${configFilePath}`);
|
|
8
|
+
}
|
|
9
|
+
const fileContent = fs.readFileSync(configFilePath, 'utf-8');
|
|
10
|
+
this.config = JSON.parse(fileContent);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Retrieves a value from the config using a dot-separated key.
|
|
14
|
+
* @param key - The dot-separated key to retrieve the value.
|
|
15
|
+
* @returns The value associated with the key, or undefined if not found.
|
|
16
|
+
*/
|
|
17
|
+
get(key) {
|
|
18
|
+
return key
|
|
19
|
+
.split('.')
|
|
20
|
+
.reduce((obj, segment) => obj?.[segment], this.config);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
let instance = null;
|
|
24
|
+
export function testwiseConfig() {
|
|
25
|
+
if (!instance) {
|
|
26
|
+
instance = new ConfigBuilder();
|
|
27
|
+
}
|
|
28
|
+
return instance;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ConfigBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigBuilder.js","sourceRoot":"","sources":["../../services/ConfigBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,aAAa;IAGjB;QACE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;QAEpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,kCAAkC,cAAc,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACI,GAAG,CAAI,GAAW;QACvB,OAAO,GAAG;aACP,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CACL,CAAC,GAAwC,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAA4B,EAChG,IAAI,CAAC,MAAM,CACP,CAAC;IACX,CAAC;CACF;AAED,IAAI,QAAQ,GAAyB,IAAI,CAAC;AAE1C,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const logger: {
|
|
2
|
+
fatal: (msg?: string, ...optionalParams: unknown[]) => void;
|
|
3
|
+
error: (msg?: string, ...optionalParams: unknown[]) => void;
|
|
4
|
+
warn: (msg?: string, ...optionalParams: unknown[]) => void;
|
|
5
|
+
step: (msg?: string, ...optionalParams: unknown[]) => void;
|
|
6
|
+
info: (msg?: string, ...optionalParams: unknown[]) => void;
|
|
7
|
+
debug: (msg?: string, ...optionalParams: unknown[]) => void;
|
|
8
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { LogLevel } from '../enums/LogLevel.js';
|
|
4
|
+
import { originalDebug, originalError, originalInfo, originalLog, originalWarn } from '../index.js';
|
|
5
|
+
import { testwiseConfig } from './ConfigBuilder.js';
|
|
6
|
+
const logDir = path.resolve(process.cwd(), testwiseConfig().get('featureSettings.logger.logDir') ?? 'logs');
|
|
7
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
8
|
+
const sanitizedTimestamp = new Date().toISOString().split('T')[0];
|
|
9
|
+
const logFilePath = path.join(logDir, testwiseConfig().get('featureSettings.logger.logByDay') === true
|
|
10
|
+
? `test-log-${sanitizedTimestamp}.log`
|
|
11
|
+
: 'test-log.log');
|
|
12
|
+
let logBuffer = [];
|
|
13
|
+
const bufferSizeLimit = testwiseConfig().get('featureSettings.logger.bufferSizeLimit') ?? 1000;
|
|
14
|
+
let linesAlreadyWritten = 0;
|
|
15
|
+
if (fs.existsSync(logFilePath)) {
|
|
16
|
+
const existingLogs = fs.readFileSync(logFilePath, 'utf-8').split('\n').filter(Boolean);
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
18
|
+
linesAlreadyWritten = existingLogs.length;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Flushes the log buffer to the log file.
|
|
22
|
+
* @returns {void}
|
|
23
|
+
* @throws {Error} If the log buffer cannot be flushed.
|
|
24
|
+
*/
|
|
25
|
+
function flushLogs() {
|
|
26
|
+
try {
|
|
27
|
+
if (logBuffer.length > 0) {
|
|
28
|
+
const existingLogs = fs.existsSync(logFilePath)
|
|
29
|
+
? fs.readFileSync(logFilePath, 'utf-8').split('\n').filter(Boolean)
|
|
30
|
+
: [];
|
|
31
|
+
const combinedLogs = [...existingLogs, ...logBuffer];
|
|
32
|
+
const trimmedLogs = bufferSizeLimit > -1 ? combinedLogs.slice(-bufferSizeLimit) : combinedLogs;
|
|
33
|
+
fs.writeFileSync(logFilePath, `${trimmedLogs.join('\n')}\n`);
|
|
34
|
+
logBuffer = [];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
console.error('Failed to flush:', err);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Logs a message to the console and a log file.
|
|
43
|
+
* @param message
|
|
44
|
+
* @param level
|
|
45
|
+
* @param optionalParams
|
|
46
|
+
*/
|
|
47
|
+
function log(message, level = LogLevel.INFO, ...optionalParams) {
|
|
48
|
+
const timestamp = new Date().toISOString();
|
|
49
|
+
const origin = getCallerInfo();
|
|
50
|
+
const formatted = `[${timestamp}] [${level}] [${origin}] ${message}`;
|
|
51
|
+
switch (level) {
|
|
52
|
+
case LogLevel.FATAL:
|
|
53
|
+
case LogLevel.ERROR:
|
|
54
|
+
originalError(formatted, ...optionalParams);
|
|
55
|
+
break;
|
|
56
|
+
case LogLevel.WARN:
|
|
57
|
+
originalWarn(formatted, ...optionalParams);
|
|
58
|
+
break;
|
|
59
|
+
case LogLevel.DEBUG:
|
|
60
|
+
originalDebug(formatted, ...optionalParams);
|
|
61
|
+
break;
|
|
62
|
+
case LogLevel.INFO:
|
|
63
|
+
originalInfo(formatted, ...optionalParams);
|
|
64
|
+
break;
|
|
65
|
+
default:
|
|
66
|
+
originalLog(formatted, ...optionalParams);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
logBuffer.push(`${formatted} ${optionalParams}`);
|
|
70
|
+
flushLogs();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Retrieves the caller information from the stack trace.
|
|
74
|
+
* @returns {string} The caller information in the format "file:line:column"
|
|
75
|
+
*/
|
|
76
|
+
function getCallerInfo() {
|
|
77
|
+
const stack = new Error().stack;
|
|
78
|
+
if (!stack)
|
|
79
|
+
return 'unknown origin';
|
|
80
|
+
const stackLines = stack.split('\n');
|
|
81
|
+
for (const line of stackLines) {
|
|
82
|
+
if (!line.includes('Logger.ts') && !line.includes('index.ts')) {
|
|
83
|
+
const match = line.match(/\((.*):(\d+):(\d+)\)/);
|
|
84
|
+
if (match) {
|
|
85
|
+
let file = match[1];
|
|
86
|
+
const lineNumber = match[2];
|
|
87
|
+
const columnNumber = match[3];
|
|
88
|
+
if (file.startsWith('file:///')) {
|
|
89
|
+
file = decodeURI(file.replace('file:///', ''));
|
|
90
|
+
}
|
|
91
|
+
return `${file}:${lineNumber}:${columnNumber}`;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return 'unknown origin';
|
|
96
|
+
}
|
|
97
|
+
export const logger = {
|
|
98
|
+
// Order by severity level
|
|
99
|
+
fatal: (msg, ...optionalParams) => log(msg, LogLevel.FATAL, ...optionalParams),
|
|
100
|
+
error: (msg, ...optionalParams) => log(msg, LogLevel.ERROR, ...optionalParams),
|
|
101
|
+
warn: (msg, ...optionalParams) => log(msg, LogLevel.WARN, ...optionalParams),
|
|
102
|
+
step: (msg, ...optionalParams) => log(msg, LogLevel.STEP, ...optionalParams),
|
|
103
|
+
info: (msg, ...optionalParams) => log(msg, LogLevel.INFO, ...optionalParams),
|
|
104
|
+
debug: (msg, ...optionalParams) => log(msg, LogLevel.DEBUG, ...optionalParams)
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=Logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Logger.js","sourceRoot":"","sources":["../../services/Logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FullResult, Reporter, TestCase, TestResult } from '@playwright/test/reporter';
|
|
2
|
+
declare class ReportingService implements Reporter {
|
|
3
|
+
private _testifyService;
|
|
4
|
+
private _results;
|
|
5
|
+
onTestEnd(test: TestCase, result: TestResult): void;
|
|
6
|
+
onEnd(result: FullResult): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export default ReportingService;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// This is tightly coupled to the Testify reporting service integration and is subject to change.
|
|
2
|
+
import { TestifyService } from '../example-code/TestifyService.js';
|
|
3
|
+
class ReportingService {
|
|
4
|
+
constructor() {
|
|
5
|
+
this._testifyService = null;
|
|
6
|
+
this._results = [];
|
|
7
|
+
}
|
|
8
|
+
onTestEnd(test, result) {
|
|
9
|
+
console.info(`Test ended: ${test.title}, status: ${result.status}`);
|
|
10
|
+
if (process.env.REPORTING_ENABLED !== 'true')
|
|
11
|
+
return;
|
|
12
|
+
this._results.push({ title: test.title, status: result.status });
|
|
13
|
+
}
|
|
14
|
+
async onEnd(result) {
|
|
15
|
+
if (process.env.REPORTING_ENABLED !== 'true')
|
|
16
|
+
return;
|
|
17
|
+
this._testifyService = new TestifyService();
|
|
18
|
+
await this._testifyService.createTestRun();
|
|
19
|
+
if (this._testifyService) {
|
|
20
|
+
for (const testResult of this._results) {
|
|
21
|
+
await this._testifyService.reportTestResult(testResult.title, testResult.status === 'passed');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (result.status === 'passed' && process.env.AUTO_CLOSE_PASSING_RUNS === 'true')
|
|
25
|
+
await this._testifyService?.closeTestRun();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export default ReportingService;
|
|
29
|
+
//# sourceMappingURL=ReportingService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReportingService.js","sourceRoot":"","sources":["../../services/ReportingService.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAGjG,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAOnE,MAAM,gBAAgB;IAAtB;QACU,oBAAe,GAA0B,IAAI,CAAC;QAC9C,aAAQ,GAAuB,EAAE,CAAC;IA0B5C,CAAC;IAxBC,SAAS,CAAC,IAAc,EAAE,MAAkB;QAC1C,OAAO,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,KAAK,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAEpE,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM;YAAE,OAAO;QAErD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAkB;QAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM;YAAE,OAAO;QAErD,IAAI,CAAC,eAAe,GAAG,IAAI,cAAc,EAAE,CAAC;QAE5C,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;QAE3C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACvC,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,MAAM;YAC9E,MAAM,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC;IAC/C,CAAC;CACF;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoreTypes.js","sourceRoot":"","sources":["../../types/CoreTypes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type UniversalConfigOptions = {
|
|
2
|
+
barcodeScannerSymbologies?: string;
|
|
3
|
+
cortexEnabledSymbologies?: string[];
|
|
4
|
+
cortexLicense?: string;
|
|
5
|
+
debugMode?: boolean;
|
|
6
|
+
devDisableProcessFlows?: boolean;
|
|
7
|
+
useFormFieldBackgroundColor?: boolean;
|
|
8
|
+
defaultApplication?: string;
|
|
9
|
+
defaultPlatform?: number;
|
|
10
|
+
loginOptionsDisabled?: boolean;
|
|
11
|
+
loginOptionsHidden?: boolean;
|
|
12
|
+
installNotificationDisabled?: boolean;
|
|
13
|
+
enableDragDrop?: boolean;
|
|
14
|
+
installNotificationExpirationInDays?: number;
|
|
15
|
+
spacingMode?: string;
|
|
16
|
+
serviceUrl?: string;
|
|
17
|
+
useServiceWorker?: boolean;
|
|
18
|
+
};
|
|
19
|
+
export type UniversalLoginOptions = {
|
|
20
|
+
username?: string;
|
|
21
|
+
password?: string;
|
|
22
|
+
serviceUrl?: string;
|
|
23
|
+
metaEndpoint?: string;
|
|
24
|
+
config?: UniversalConfigOptions;
|
|
25
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"universal.js","sourceRoot":"","sources":["../../types/universal.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export enum ButtonType {
|
|
2
|
+
// --- CRUD buttons ---
|
|
3
|
+
ADD = 'actionbar__add',
|
|
4
|
+
SAVE = 'actionbar__save',
|
|
5
|
+
CANCEL = 'actionbar__cancel',
|
|
6
|
+
COPY = 'actionbar__copy',
|
|
7
|
+
UPDATE = 'actionbar__update',
|
|
8
|
+
DELETE = 'actionbar__delete',
|
|
9
|
+
REFRESH = 'actionbar__refresh',
|
|
10
|
+
|
|
11
|
+
// --- Overflow menu buttons
|
|
12
|
+
QuickFilter = 'actionbar__quick-filter',
|
|
13
|
+
Filter = 'actionbar__filter',
|
|
14
|
+
ClearAllFilters = 'actionbar__clear-filters',
|
|
15
|
+
Sort = 'actionbar__sort',
|
|
16
|
+
RestoreSortOrder = 'actionbar__restore-sort',
|
|
17
|
+
Import = 'actionbar__import',
|
|
18
|
+
Export = 'actionbar__export',
|
|
19
|
+
ExportImmediately = 'actionbar__export-immediately',
|
|
20
|
+
MassUpdate = 'actionbar__mass-update'
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export enum ButtonState {
|
|
24
|
+
ENABLED = 'enabled',
|
|
25
|
+
DISABLED = 'disabled',
|
|
26
|
+
HIDDEN = 'hidden',
|
|
27
|
+
NON_EXISTENT = 'nonExistent'
|
|
28
|
+
}
|