UNPKG

16.9 kBSource Map (JSON)View Raw
1{"version":3,"file":"aurelia-testing.js","sources":["../../src/compile-spy.ts","../../src/view-spy.ts","../../src/wait.ts","../../src/component-tester.ts","../../src/aurelia-testing.ts"],"sourcesContent":["import { type IStaticResourceConfig, TargetInstruction } from 'aurelia-templating';\r\nimport { getLogger } from 'aurelia-logging';\r\nimport { DOM } from 'aurelia-pal';\r\n\r\n/**\r\n * Attribute to be placed on any element to have it emit the View Compiler's\r\n * TargetInstruction into the debug console, giving you insight into all the\r\n * parsed bindings, behaviors and event handers for the targeted element.\r\n */\r\nexport class CompileSpy {\r\n /** @internal */\r\n static get inject() { return [DOM.Element, TargetInstruction]; }\r\n /** @internal */\r\n static $resource: IStaticResourceConfig = {\r\n type: 'attribute',\r\n name: 'compile-spy'\r\n }\r\n /**\r\n * Creates and instanse of CompileSpy.\r\n * @param element target element on where attribute is placed on.\r\n * @param instruction instructions for how the target element should be enhanced.\r\n */\r\n constructor(element: Element, instruction: TargetInstruction) {\r\n getLogger('compile-spy').info(element.toString(), instruction);\r\n }\r\n}\r\n","import { IStaticResourceConfig } from 'aurelia-templating';\r\nimport { getLogger, Logger } from 'aurelia-logging';\r\n\r\n/**\r\n * Attribute to be placed on any HTML element in a view to emit the View instance\r\n * to the debug console, giving you insight into the live View instance, including\r\n * all child views, live bindings, behaviors and more.\r\n */\r\nexport class ViewSpy {\r\n static $resource: IStaticResourceConfig = {\r\n type: 'attribute',\r\n name: 'view-spy'\r\n };\r\n\r\n private logger: Logger;\r\n private value: any;\r\n private view: any;\r\n\r\n /**\r\n * Creates a new instance of ViewSpy.\r\n */\r\n constructor() {\r\n this.logger = getLogger('view-spy');\r\n }\r\n\r\n private _log(lifecycleName: string, context?: {}) {\r\n if (!this.value && lifecycleName === 'created') {\r\n this.logger.info(lifecycleName, this.view);\r\n } else if (this.value && this.value.indexOf(lifecycleName) !== -1) {\r\n this.logger.info(lifecycleName, this.view, context);\r\n }\r\n }\r\n\r\n /**\r\n * Invoked when the target view is created.\r\n * @param view The target view.\r\n */\r\n public created(view: any) {\r\n this.view = view;\r\n this._log('created');\r\n }\r\n\r\n /**\r\n * Invoked when the target view is bound.\r\n * @param bindingContext The target view's binding context.\r\n */\r\n public bind(bindingContext: {}) {\r\n this._log('bind', bindingContext);\r\n }\r\n\r\n /**\r\n * Invoked when the target element is attached to the DOM.\r\n */\r\n public attached() {\r\n this._log('attached');\r\n }\r\n\r\n /**\r\n * Invoked when the target element is detached from the DOM.\r\n */\r\n public detached() {\r\n this._log('detached');\r\n }\r\n\r\n /**\r\n * Invoked when the target element is unbound.\r\n */\r\n public unbind() {\r\n this._log('unbind');\r\n }\r\n}\r\n","/**\r\n * Generic function to wait for something to happen. Uses polling\r\n * @param getter: a getter function that returns anything else than `null` or an\r\n * empty array or an empty jQuery object when the\r\n * condition is met\r\n * @param options: lookup options, defaults to\r\n * `{present: true, interval: 50, timeout: 5000}`\r\n */\r\nexport function waitFor<T>(getter: () => T, options: {\r\n present?: boolean,\r\n interval?: number,\r\n timeout?: number\r\n} = {present: true, interval: 50, timeout: 5000}): Promise<T> {\r\n // prevents infinite recursion if the request times out\r\n let timedOut = false;\r\n\r\n options = {\r\n present: true,\r\n interval: 50,\r\n timeout: 5000,\r\n ...options\r\n };\r\n\r\n function wait(): Promise<T> {\r\n const element = getter();\r\n // boolean is needed here, hence the length > 0\r\n const found = element !== null && (!(element instanceof NodeList) &&\r\n !(element as any).jquery || (element as any).length > 0);\r\n\r\n if (!options.present === !found || timedOut) {\r\n return Promise.resolve(element);\r\n }\r\n\r\n return new Promise(rs => setTimeout(rs, options.interval)).then(wait);\r\n }\r\n\r\n return Promise.race([\r\n new Promise(\r\n (_, rj) => setTimeout(() => {\r\n timedOut = true;\r\n rj(new Error(options.present ? 'Element not found' : 'Element not removed'));\r\n }, options.timeout)\r\n ),\r\n wait()\r\n ]) as Promise<T>;\r\n}\r\n\r\nexport function waitForDocumentElement(selector: string, options?: {\r\n present?: boolean,\r\n interval?: number,\r\n timeout?: number\r\n}): Promise<Element> {\r\n return waitFor(() => document.querySelector(selector) as Element, options);\r\n}\r\n\r\nexport function waitForDocumentElements(selector: string, options?: {\r\n present?: boolean,\r\n interval?: number,\r\n timeout?: number\r\n}): Promise<NodeListOf<Element>> {\r\n return waitFor(() => document.querySelectorAll(selector), options);\r\n}\r\n","import { View } from 'aurelia-templating';\r\nimport type { Aurelia, FrameworkConfiguration } from 'aurelia-framework';\r\nimport { waitFor } from './wait';\r\n\r\ninterface AureliaWithRoot extends Aurelia {\r\n root: ViewWithControllers;\r\n}\r\n\r\ninterface ViewWithControllers extends View {\r\n controllers: {viewModel: any}[];\r\n}\r\n\r\nexport class StageComponent {\r\n public static withResources<T = any>(resources: string | string[] = []): ComponentTester<T> {\r\n return new ComponentTester().withResources(resources);\r\n }\r\n}\r\n\r\nexport class ComponentTester<T = any> {\r\n public bind: (bindingContext: {}) => Promise<void>;\r\n public attached: () => Promise<void>;\r\n public detached: () => Promise<void>;\r\n public unbind: () => Promise<void>;\r\n public element: Element;\r\n public viewModel: T;\r\n\r\n private html: string;\r\n private resources: string | Function | (string | Function)[] = [];\r\n private bindingContext: {};\r\n private rootView: View;\r\n private host: HTMLDivElement;\r\n\r\n public configure(aurelia: Aurelia): FrameworkConfiguration {\r\n return aurelia.use.standardConfiguration();\r\n }\r\n\r\n public bootstrap(configure: (aurelia: Aurelia) => FrameworkConfiguration) {\r\n this.configure = configure;\r\n }\r\n\r\n public withResources(resources: string | string[]): this {\r\n this.resources = resources;\r\n return this;\r\n }\r\n\r\n public inView(html: string): this {\r\n this.html = html;\r\n return this;\r\n }\r\n\r\n public boundTo(bindingContext: {}): this {\r\n this.bindingContext = bindingContext;\r\n return this;\r\n }\r\n\r\n public manuallyHandleLifecycle(): this {\r\n this._prepareLifecycle();\r\n return this;\r\n }\r\n\r\n public create(bootstrap: (configure: (aurelia: Aurelia) => Promise<void>) => Promise<void>): Promise<void> {\r\n return bootstrap((aurelia: AureliaWithRoot) => {\r\n return Promise.resolve(this.configure(aurelia)).then(() => {\r\n if (this.resources) {\r\n aurelia.use.globalResources(this.resources);\r\n }\r\n\r\n return aurelia.start().then(() => {\r\n this.host = document.createElement('div');\r\n this.host.innerHTML = this.html;\r\n\r\n document.body.appendChild(this.host);\r\n\r\n return aurelia.enhance(this.bindingContext, this.host).then(() => {\r\n this.rootView = aurelia.root;\r\n this.element = this.host.firstElementChild as Element;\r\n\r\n if (aurelia.root.controllers.length) {\r\n this.viewModel = aurelia.root.controllers[0].viewModel;\r\n }\r\n\r\n return new Promise(resolve => setTimeout(() => resolve(), 0)) as Promise<void>;\r\n });\r\n });\r\n });\r\n });\r\n }\r\n\r\n public dispose(): Element {\r\n if (this.host === undefined || this.rootView === undefined) {\r\n throw new Error(\r\n 'Cannot call ComponentTester.dispose() before ComponentTester.create()'\r\n );\r\n }\r\n\r\n this.rootView.detached();\r\n this.rootView.unbind();\r\n\r\n return (this.host.parentNode as Node).removeChild(this.host);\r\n }\r\n\r\n private _prepareLifecycle() {\r\n // bind\r\n const bindPrototype = View.prototype.bind;\r\n // tslint:disable-next-line:no-empty\r\n View.prototype.bind = () => {};\r\n this.bind = bindingContext => new Promise(resolve => {\r\n View.prototype.bind = bindPrototype;\r\n if (bindingContext !== undefined) {\r\n this.bindingContext = bindingContext;\r\n }\r\n this.rootView.bind(this.bindingContext);\r\n setTimeout(() => resolve(), 0);\r\n });\r\n\r\n // attached\r\n const attachedPrototype = View.prototype.attached;\r\n // tslint:disable-next-line:no-empty\r\n View.prototype.attached = () => {};\r\n this.attached = () => new Promise(resolve => {\r\n View.prototype.attached = attachedPrototype;\r\n this.rootView.attached();\r\n setTimeout(() => resolve(), 0);\r\n });\r\n\r\n // detached\r\n this.detached = () => new Promise(resolve => {\r\n this.rootView.detached();\r\n setTimeout(() => resolve(), 0);\r\n });\r\n\r\n // unbind\r\n this.unbind = () => new Promise(resolve => {\r\n this.rootView.unbind();\r\n setTimeout(() => resolve(), 0);\r\n });\r\n }\r\n\r\n public waitForElement(selector: string, options?: {\r\n present?: boolean,\r\n interval?: number,\r\n timeout?: number\r\n }): Promise<Element> {\r\n return waitFor(() => this.element.querySelector(selector) as Element, options);\r\n }\r\n\r\n public waitForElements(selector: string, options?: {\r\n present?: boolean,\r\n interval?: number,\r\n timeout?: number\r\n }): Promise<NodeListOf<Element>> {\r\n return waitFor(() => this.element.querySelectorAll(selector) as NodeListOf<Element>, options);\r\n }\r\n}\r\n","import type { FrameworkConfiguration } from 'aurelia-framework';\r\nimport { CompileSpy } from './compile-spy';\r\nimport { ViewSpy } from './view-spy';\r\n\r\nexport * from './compile-spy';\r\nexport * from './view-spy';\r\nexport * from './component-tester';\r\nexport * from './wait';\r\n\r\nexport function configure(config: FrameworkConfiguration) {\r\n config.globalResources([CompileSpy, ViewSpy]);\r\n}\r\n"],"names":[],"mappings":"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"}
\No newline at end of file