UNPKG

@applitools/eyes

Version:
703 lines (702 loc) 29.2 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Target = exports.TargetAutomation = exports.TargetImage = exports.CheckSettingsAutomationFluent = exports.CheckSettingsImageFluent = exports.CheckSettingsBaseFluent = void 0; const AccessibilityRegionType_1 = require("../enums/AccessibilityRegionType"); const MatchLevel_1 = require("../enums/MatchLevel"); const utils = __importStar(require("@applitools/utils")); class CheckSettingsBaseFluent { constructor(settings, parent) { var _a; this._settings = {}; this.childs = []; this._settings = utils.types.instanceOf(settings, CheckSettingsBaseFluent) ? settings.toObject() : settings !== null && settings !== void 0 ? settings : {}; this.parent = (parent !== null && parent !== void 0 ? parent : settings === null || settings === void 0 ? void 0 : settings.parent); if (parent) { (_a = parent.childs) !== null && _a !== void 0 ? _a : (parent.childs = []); parent.childs.push(this); } else { this._settings = utils.types.instanceOf(settings, CheckSettingsBaseFluent) ? settings.toObject() : settings !== null && settings !== void 0 ? settings : {}; } } region(region) { this._settings.region = region; return this; } name(name) { this._settings.name = name; return this; } withName(name) { return this.name(name); } ignoreRegion(region) { if (region) { if (!this._settings.ignoreRegions) this._settings.ignoreRegions = []; this._settings.ignoreRegions.push(region); } return this; } ignoreRegions(...regions) { regions.forEach(region => this.ignoreRegion(region)); return this; } /** @deprecated */ ignore(region) { return this.ignoreRegion(region); } /** @deprecated */ ignores(...regions) { return this.ignoreRegions(...regions); } layoutRegion(region) { if (region) { if (!this._settings.layoutRegions) this._settings.layoutRegions = []; this._settings.layoutRegions.push(region); } return this; } layoutRegions(...regions) { regions.forEach(region => this.layoutRegion(region)); return this; } strictRegion(region) { if (region) { if (!this._settings.strictRegions) this._settings.strictRegions = []; this._settings.strictRegions.push(region); } return this; } strictRegions(...regions) { regions.forEach(region => this.strictRegion(region)); return this; } contentRegion(region) { if (region) { if (!this._settings.contentRegions) this._settings.contentRegions = []; this._settings.contentRegions.push(region); } return this; } contentRegions(...regions) { regions.forEach(region => this.contentRegion(region)); return this; } floatingRegion(region, maxUpOffset, maxDownOffset, maxLeftOffset, maxRightOffset) { if (region) { let floatingRegion; if (utils.types.has(region, 'region')) { const { maxUpOffset, maxDownOffset, maxLeftOffset, maxRightOffset, ...rest } = region; floatingRegion = { offset: { top: maxUpOffset, bottom: maxDownOffset, left: maxLeftOffset, right: maxRightOffset }, ...rest, }; } else { floatingRegion = { region, offset: { top: maxUpOffset, bottom: maxDownOffset, left: maxLeftOffset, right: maxRightOffset }, }; } if (!this._settings.floatingRegions) this._settings.floatingRegions = []; this._settings.floatingRegions.push(floatingRegion); } return this; } floatingRegions(regionOrMaxOffset, ...regions) { let maxOffset; if (utils.types.isNumber(regionOrMaxOffset)) { maxOffset = regionOrMaxOffset; } else { this.floatingRegion(regionOrMaxOffset); } regions.forEach(region => { if (utils.types.has(region, 'region')) this.floatingRegion(region); else this.floatingRegion(region, maxOffset, maxOffset, maxOffset, maxOffset); }); return this; } floating(region, maxUpOffset, maxDownOffset, maxLeftOffset, maxRightOffset) { if (utils.types.has(region, 'region')) return this.floatingRegion(region); else return this.floatingRegion(region, maxUpOffset, maxDownOffset, maxLeftOffset, maxRightOffset); } floatings(regionOrMaxOffset, ...regions) { return this.floatingRegions(regionOrMaxOffset, ...regions); } accessibilityRegion(region, type) { if (region) { const accessibilityRegion = utils.types.has(region, 'region') ? region : { region, type }; if (!this._settings.accessibilityRegions) this._settings.accessibilityRegions = []; this._settings.accessibilityRegions.push(accessibilityRegion); } return this; } accessibilityRegions(regionOrType, ...regions) { let type; if (utils.types.isEnumValue(regionOrType, AccessibilityRegionType_1.AccessibilityRegionTypeEnum)) { type = regionOrType; } else { this.accessibilityRegion(regionOrType); } regions.forEach(region => { if (utils.types.has(region, 'region')) this.accessibilityRegion(region); else this.accessibilityRegion(region, type); }); return this; } dynamicRegion(region, type) { if (region) { const dynamicRegion = utils.types.has(region, 'region') ? region : { region, type }; if (!this._settings.dynamicRegions) this._settings.dynamicRegions = []; this._settings.dynamicRegions.push(dynamicRegion); } return this; } dynamicRegions(regionOrTypes, ...regions) { let types; if (utils.types.isArray(regionOrTypes) || utils.types.isString(regionOrTypes)) { types = regionOrTypes; } else { this.dynamicRegions(regionOrTypes); } regions.forEach(region => { if (utils.types.has(region, 'region')) this.dynamicRegion(region); else this.dynamicRegion(region, types); }); return this; } matchLevel(matchLevel) { this._settings.matchLevel = matchLevel; return this; } layout() { this._settings.matchLevel = MatchLevel_1.MatchLevelEnum.Layout; return this; } exact() { this._settings.matchLevel = MatchLevel_1.MatchLevelEnum.Exact; return this; } strict() { this._settings.matchLevel = MatchLevel_1.MatchLevelEnum.Strict; return this; } ignoreColors() { this._settings.matchLevel = MatchLevel_1.MatchLevelEnum.IgnoreColors; return this; } dynamic() { this._settings.matchLevel = MatchLevel_1.MatchLevelEnum.Dynamic; return this; } /** @deprecated */ content() { this._settings.matchLevel = MatchLevel_1.MatchLevelEnum.Content; return this; } enablePatterns(enablePatterns = true) { this._settings.enablePatterns = enablePatterns; return this; } ignoreDisplacements(ignoreDisplacements = true) { this._settings.ignoreDisplacements = ignoreDisplacements; return this; } ignoreCaret(ignoreCaret = true) { this._settings.ignoreCaret = ignoreCaret; return this; } useDom(useDom = true) { this._settings.useDom = useDom; return this; } sendDom(sendDom = true) { this._settings.sendDom = sendDom; return this; } pageId(pageId) { this._settings.pageId = pageId; return this; } variationGroupId(variationGroupId) { this._settings.variationGroupId = variationGroupId; return this; } /** @internal */ toObject() { return this._settings; } /** @internal */ toString() { return utils.general.toString(this); } /** @internal */ assumesMutability() { // if this is a leaf of a linked list (i.e., has no children and all ancestors have exactly one child), them making the CheckSettings mutable is safe if (this.childs.length) return true; for (let parent = this.parent; parent; parent = parent.parent) { if (parent.childs.length !== 1) return true; } return undefined; } static makeMutableTreeProxy(self, ctor) { const shouldNotBeProxied = ['assumesMutability', 'childs', 'parent']; // these properties should not be proxied as they are used to determine if the tree is mutable const shouldNotCreateChild = ['toObject', 'toJSON', 'toString']; // these properties should not create a child return new Proxy(self, { get(target, prop, receiver) { if (shouldNotBeProxied.includes(String(prop))) return Reflect.get(target, prop, receiver); let rootTarget = target; while (rootTarget.parent) rootTarget = rootTarget.parent; const origProp = Reflect.get(rootTarget, prop, receiver); if (typeof origProp !== 'function') return origProp; if (shouldNotCreateChild.includes(String(prop))) return origProp; return function (...args) { // @ts-ignore const result = origProp.call(rootTarget, ...args); if (result instanceof CheckSettingsBaseFluent) { if (result instanceof CheckSettingsImageFluent || result instanceof CheckSettingsAutomationFluent) { return new ctor(null, null, target); } else { // should not happen - the only known types to be proxied are CheckSettingsImageFluent and CheckSettingsAutomationFluent throw new Error('Unknown CheckSettings type'); } } return result; }; }, }); } // protected toCoreCodedRegion(region: CodedRegion<TRegion>): Core.CodedRegion<TRegion | utils.Region> // protected toCoreCodedRegion(region: Region | LegacyRegion | TRegion): utils.Region | TRegion toCoreCodedRegion(region) { if (utils.types.has(region, ['region'])) { return { ...region, region: this.toCoreRegion(region.region) }; } else { return this.toCoreRegion(region); } } toCoreCodedFloatingRegion(region) { if (utils.types.has(region, 'region')) { const { maxUpOffset, maxDownOffset, maxLeftOffset, maxRightOffset, ...rest } = region; return { offset: { top: maxUpOffset, bottom: maxDownOffset, left: maxLeftOffset, right: maxRightOffset }, ...this.toCoreCodedRegion(rest), }; } else { return this.toCoreRegion(region); } } toCoreRegion(region) { if (utils.types.has(region, ['left', 'top', 'width', 'height'])) { return { x: region.left, y: region.top, width: region.width, height: region.height }; } else { return region; } } } exports.CheckSettingsBaseFluent = CheckSettingsBaseFluent; class CheckSettingsImageFluent extends CheckSettingsBaseFluent { constructor(settings, target, parent) { super(undefined, parent); const self = CheckSettingsBaseFluent.makeMutableTreeProxy(this, CheckSettingsImageFluent); this._target = null; self._target = target !== null && target !== void 0 ? target : settings === null || settings === void 0 ? void 0 : settings._target; self._settings = utils.types.instanceOf(settings, CheckSettingsImageFluent) ? settings.toObject() : settings !== null && settings !== void 0 ? settings : {}; if (settings instanceof CheckSettingsImageFluent) { parent !== null && parent !== void 0 ? parent : (parent = settings.parent); // copy constructor does not considered as a new child parent === null || parent === void 0 ? void 0 : parent.childs.pop(); } return self; } image(image) { var _a; (_a = this._target) !== null && _a !== void 0 ? _a : (this._target = {}); this._target.image = image; return this; } buffer(imageBuffer) { return this.image(imageBuffer); } base64(imageBase64) { return this.image(imageBase64); } path(imagePath) { return this.image(imagePath); } url(imageUrl) { return this.image(imageUrl); } name(name) { this._target.name = name; return super.name(name); } withDom(dom) { this._settings.sendDom = true; this._target.dom = dom; return this; } withLocation(locationInViewport) { this._target.locationInViewport = locationInViewport; return this; } /** @internal */ toJSON() { var _a, _b, _c, _d, _e, _f, _g; return { target: this._target, settings: utils.general.removeUndefinedProps({ name: this._settings.name, region: this._settings.region ? this.toCoreRegion(this._settings.region) : this._settings.region, matchLevel: this._settings.matchLevel, useDom: this._settings.useDom, sendDom: this._settings.sendDom, enablePatterns: this._settings.enablePatterns, ignoreDisplacements: this._settings.ignoreDisplacements, ignoreCaret: this._settings.ignoreCaret, ignoreRegions: (_a = this._settings.ignoreRegions) === null || _a === void 0 ? void 0 : _a.map(this.toCoreCodedRegion), layoutRegions: (_b = this._settings.layoutRegions) === null || _b === void 0 ? void 0 : _b.map(this.toCoreCodedRegion), strictRegions: (_c = this._settings.strictRegions) === null || _c === void 0 ? void 0 : _c.map(this.toCoreCodedRegion), contentRegions: (_d = this._settings.contentRegions) === null || _d === void 0 ? void 0 : _d.map(this.toCoreCodedRegion), floatingRegions: (_e = this._settings.floatingRegions) === null || _e === void 0 ? void 0 : _e.map(this.toCoreCodedFloatingRegion), accessibilityRegions: (_f = this._settings.accessibilityRegions) === null || _f === void 0 ? void 0 : _f.map(this.toCoreCodedRegion), dynamicRegions: (_g = this._settings.dynamicRegions) === null || _g === void 0 ? void 0 : _g.map(this.toCoreCodedRegion), pageId: this._settings.pageId, userCommandId: this._settings.variationGroupId, assumesMutability: this.assumesMutability(), }), }; } } exports.CheckSettingsImageFluent = CheckSettingsImageFluent; class CheckSettingsAutomationFluent extends CheckSettingsBaseFluent { _isElementReference(value) { var _a, _b, _c; const spec = (_a = this._spec) !== null && _a !== void 0 ? _a : this.constructor._spec; return !!((_b = spec.isElement) === null || _b === void 0 ? void 0 : _b.call(spec, value)) || !!((_c = spec.isSecondaryElement) === null || _c === void 0 ? void 0 : _c.call(spec, value)) || this._isSelectorReference(value); } _isSelectorReference(selector) { var _a, _b, _c, _d, _e; const spec = (_a = this._spec) !== null && _a !== void 0 ? _a : this.constructor._spec; return (!!((_b = spec.isSelector) === null || _b === void 0 ? void 0 : _b.call(spec, selector)) || !!((_c = spec.isSecondarySelector) === null || _c === void 0 ? void 0 : _c.call(spec, selector)) || utils.types.isString(selector) || (utils.types.isPlainObject(selector) && utils.types.has(selector, 'selector') && (utils.types.isString(selector.selector) || !!((_d = spec.isSelector) === null || _d === void 0 ? void 0 : _d.call(spec, selector.selector)) || !!((_e = spec.isSecondarySelector) === null || _e === void 0 ? void 0 : _e.call(spec, selector))))); } _isFrameReference(value) { return utils.types.isNumber(value) || utils.types.isString(value) || this._isElementReference(value); } constructor(settings, spec, parent) { super(undefined, parent !== null && parent !== void 0 ? parent : settings === null || settings === void 0 ? void 0 : settings.parent); this._settings = null; this._spec = null; const self = CheckSettingsBaseFluent.makeMutableTreeProxy(this, (CheckSettingsAutomationFluent)); self._spec = spec; self._settings = utils.types.instanceOf(settings, CheckSettingsAutomationFluent) ? settings.toObject() : settings !== null && settings !== void 0 ? settings : {}; if (settings instanceof CheckSettingsAutomationFluent) { parent !== null && parent !== void 0 ? parent : (parent = settings.parent); // copy constructor does not considered as a new child parent === null || parent === void 0 ? void 0 : parent.childs.pop(); } return self; } region(region) { if (this._isSelectorReference(region) && this._isSelectorReference(this._settings.region) && utils.types.has(this._settings.region, 'selector')) { let lastSelector = this._settings.region; while (lastSelector.shadow) lastSelector = lastSelector.shadow; lastSelector.shadow = region; return this; } return super.region(region); } shadow(selector) { selector = utils.types.has(selector, 'selector') ? selector : { selector }; if (!this._settings.region) { this._settings.region = selector; } else if (this._isSelectorReference(this._settings.region)) { let lastSelector; if (utils.types.has(this._settings.region, 'selector')) { lastSelector = this._settings.region; while (lastSelector.shadow) lastSelector = lastSelector.shadow; } else { lastSelector = { selector: this._settings.region }; } lastSelector.shadow = selector; } return this; } frame(contextOrFrame, scrollRootElement) { const context = this._isFrameReference(contextOrFrame) || this._isSelectorReference(contextOrFrame) ? { frame: contextOrFrame, scrollRootElement } : contextOrFrame; if (!this._settings.frames) this._settings.frames = []; this._settings.frames.push(context); return this; } webview(webview) { this._settings.webview = webview !== null && webview !== void 0 ? webview : true; return this; } scrollRootElement(scrollRootElement) { if (this._settings.frames && this._settings.frames.length > 0) { const context = this._settings.frames[this._settings.frames.length - 1]; context.scrollRootElement = scrollRootElement; } this._settings.scrollRootElement = scrollRootElement; return this; } fully(fully = true) { this._settings.fully = fully; return this; } /** @deprecated */ stitchContent(stitchContent = true) { return this.fully(stitchContent); } disableBrowserFetching(disableBrowserFetching) { this._settings.disableBrowserFetching = disableBrowserFetching; return this; } layoutBreakpoints(breakpoints = true, heightBreakpointsOrSettings, settings) { if (utils.types.isBoolean(heightBreakpointsOrSettings)) { this._settings.layoutBreakpoints = { breakpoints: breakpoints, heightBreakpoints: heightBreakpointsOrSettings, reload: settings === null || settings === void 0 ? void 0 : settings.reload, }; } else { this._settings.layoutBreakpoints = { breakpoints: utils.types.isArray(breakpoints) ? Array.from(new Set(breakpoints)).sort((a, b) => (a < b ? 1 : -1)) : breakpoints, reload: heightBreakpointsOrSettings === null || heightBreakpointsOrSettings === void 0 ? void 0 : heightBreakpointsOrSettings.reload, }; } return this; } hook(name, script) { this._settings.hooks = { ...this._settings.hooks, [name]: script }; return this; } beforeRenderScreenshotHook(script) { return this.hook('beforeCaptureScreenshot', script); } /** @deprecated */ webHook(script) { return this.beforeRenderScreenshotHook(script); } ufgOption(key, value) { this._settings.ufgOptions = { ...this._settings.ufgOptions, [key]: value }; return this; } ufgOptions(options) { this._settings.ufgOptions = options; return this; } /** @deprecated */ nmgOption(key, value) { this._settings.nmgOptions = { ...this._settings.nmgOptions, [key]: value }; return this; } /** @deprecated */ nmgOptions(options) { this._settings.nmgOptions = options; return this; } /** @deprecated */ visualGridOption(key, value) { return this.ufgOption(key, value); } /** @deprecated */ visualGridOptions(options) { return this.ufgOptions(options); } useSystemScreenshot(useSystemScreenshot = true) { this._settings.useSystemScreenshot = useSystemScreenshot; return this; } timeout(timeout) { this._settings.timeout = timeout; return this; } waitBeforeCapture(waitBeforeCapture) { this._settings.waitBeforeCapture = waitBeforeCapture; return this; } lazyLoad(options) { this._settings.lazyLoad = options !== null && options !== void 0 ? options : true; return this; } densityMetrics(options) { this._settings.densityMetrics = options; return this; } stitchMode(stitchMode) { this._settings.stitchMode = stitchMode; return this; } /** @internal */ toLayoutBreakpoints() { var _a; let layoutBreakpoints; if (utils.types.has(this._settings.layoutBreakpoints, 'breakpoints')) { layoutBreakpoints = this._settings.layoutBreakpoints; } else { layoutBreakpoints = { breakpoints: (_a = this._settings.layoutBreakpoints) !== null && _a !== void 0 ? _a : false }; } return layoutBreakpoints; } /** @internal */ toJSON() { var _a, _b, _c, _d, _e, _f, _g, _h; return { target: undefined, settings: utils.general.removeUndefinedProps({ name: this._settings.name, region: this._settings.region ? this.toCoreRegion(this._settings.region) : this._settings.region, frames: this._settings.frames, webview: this._settings.webview, scrollRootElement: this._settings.scrollRootElement, fully: this._settings.fully, matchLevel: this._settings.matchLevel, useDom: this._settings.useDom, sendDom: this._settings.sendDom, enablePatterns: this._settings.enablePatterns, ignoreDisplacements: this._settings.ignoreDisplacements, ignoreCaret: this._settings.ignoreCaret, ignoreRegions: (_a = this._settings.ignoreRegions) === null || _a === void 0 ? void 0 : _a.map(this.toCoreCodedRegion), layoutRegions: (_b = this._settings.layoutRegions) === null || _b === void 0 ? void 0 : _b.map(this.toCoreCodedRegion), strictRegions: (_c = this._settings.strictRegions) === null || _c === void 0 ? void 0 : _c.map(this.toCoreCodedRegion), contentRegions: (_d = this._settings.contentRegions) === null || _d === void 0 ? void 0 : _d.map(this.toCoreCodedRegion), floatingRegions: (_e = this._settings.floatingRegions) === null || _e === void 0 ? void 0 : _e.map(this.toCoreCodedFloatingRegion), accessibilityRegions: (_f = this._settings.accessibilityRegions) === null || _f === void 0 ? void 0 : _f.map(this.toCoreCodedRegion), dynamicRegions: (_g = this._settings.dynamicRegions) === null || _g === void 0 ? void 0 : _g.map(this.toCoreCodedRegion), disableBrowserFetching: this._settings.disableBrowserFetching, layoutBreakpoints: utils.types.isDefined(this._settings.layoutBreakpoints) ? this.toLayoutBreakpoints() : undefined, ufgOptions: (_h = this._settings.ufgOptions) !== null && _h !== void 0 ? _h : this._settings.visualGridOptions, nmgOptions: this._settings.nmgOptions, screenshotMode: this._settings.useSystemScreenshot ? 'default' : undefined, hooks: this._settings.hooks, pageId: this._settings.pageId, lazyLoad: this._settings.lazyLoad, waitBeforeCapture: this._settings.waitBeforeCapture, retryTimeout: this._settings.timeout, userCommandId: this._settings.variationGroupId, densityMetrics: this._settings.densityMetrics, assumesMutability: this.assumesMutability(), stitchMode: this._settings.stitchMode, }), }; } } exports.CheckSettingsAutomationFluent = CheckSettingsAutomationFluent; exports.TargetImage = { image(image) { return new CheckSettingsImageFluent().image(image); }, buffer(imageBuffer) { return new CheckSettingsImageFluent().image(imageBuffer); }, base64(imageBase64) { return new CheckSettingsImageFluent().image(imageBase64); }, path(imagePath) { return new CheckSettingsImageFluent().image(imagePath); }, url(imageUrl) { return new CheckSettingsImageFluent().image(imageUrl); }, }; exports.TargetAutomation = { spec: null, window() { return new CheckSettingsAutomationFluent({}, this.spec); }, region(region) { if (!region) { // eslint-disable-next-line no-console console.warn('Target.region() called with no region. Will take a screenshot of the entire window instead.'); // eslint-disable-next-line no-console console.trace(); } return new CheckSettingsAutomationFluent({}, this.spec).region(region); }, frame(contextOrFrame, scrollRootElement) { return new CheckSettingsAutomationFluent({}, this.spec).frame(contextOrFrame, scrollRootElement); }, shadow(selector) { return new CheckSettingsAutomationFluent({}, this.spec).shadow(selector); }, webview(webview) { return new CheckSettingsAutomationFluent({}, this.spec).webview(webview); }, }; exports.Target = { ...exports.TargetImage, ...exports.TargetAutomation };