@stencil/playwright 0.2.3 → 1.2.3-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +13 -10
- package/dist/index.js.map +2 -2
- package/dist/playwright-page.d.ts +1 -1
- package/package.json +22 -10
- package/dist/index.cjs +0 -957
- package/dist/index.cjs.map +0 -7
package/dist/index.js
CHANGED
|
@@ -163,7 +163,7 @@ var require_fast_deep_equal = __commonJS({
|
|
|
163
163
|
});
|
|
164
164
|
|
|
165
165
|
// src/create-config.ts
|
|
166
|
-
var import_deepmerge = __toESM(require_cjs());
|
|
166
|
+
var import_deepmerge = __toESM(require_cjs(), 1);
|
|
167
167
|
|
|
168
168
|
// src/load-config-meta.ts
|
|
169
169
|
import { loadConfig } from "@stencil/core/compiler";
|
|
@@ -210,6 +210,9 @@ var Queue = class {
|
|
|
210
210
|
}
|
|
211
211
|
this.#head = this.#head.next;
|
|
212
212
|
this.#size--;
|
|
213
|
+
if (!this.#head) {
|
|
214
|
+
this.#tail = void 0;
|
|
215
|
+
}
|
|
213
216
|
return current.value;
|
|
214
217
|
}
|
|
215
218
|
peek() {
|
|
@@ -477,7 +480,7 @@ var createConfig = async (overrides = {}) => {
|
|
|
477
480
|
};
|
|
478
481
|
|
|
479
482
|
// src/matchers/to-have-first-received-event-detail.ts
|
|
480
|
-
var import_fast_deep_equal = __toESM(require_fast_deep_equal());
|
|
483
|
+
var import_fast_deep_equal = __toESM(require_fast_deep_equal(), 1);
|
|
481
484
|
import { expect } from "@playwright/test";
|
|
482
485
|
function toHaveFirstReceivedEventDetail(eventSpy, eventDetail) {
|
|
483
486
|
if (eventSpy === null || eventSpy === void 0) {
|
|
@@ -513,7 +516,7 @@ function toHaveFirstReceivedEventDetail(eventSpy, eventDetail) {
|
|
|
513
516
|
}
|
|
514
517
|
|
|
515
518
|
// src/matchers/to-have-nth-received-event-detail.ts
|
|
516
|
-
var import_fast_deep_equal2 = __toESM(require_fast_deep_equal());
|
|
519
|
+
var import_fast_deep_equal2 = __toESM(require_fast_deep_equal(), 1);
|
|
517
520
|
import { expect as expect2 } from "@playwright/test";
|
|
518
521
|
function toHaveNthReceivedEventDetail(eventSpy, index, eventDetail) {
|
|
519
522
|
if (eventSpy === null || eventSpy === void 0) {
|
|
@@ -583,7 +586,7 @@ function toHaveReceivedEvent(eventSpy) {
|
|
|
583
586
|
}
|
|
584
587
|
|
|
585
588
|
// src/matchers/to-have-received-event-detail.ts
|
|
586
|
-
var import_fast_deep_equal3 = __toESM(require_fast_deep_equal());
|
|
589
|
+
var import_fast_deep_equal3 = __toESM(require_fast_deep_equal(), 1);
|
|
587
590
|
import { expect as expect3 } from "@playwright/test";
|
|
588
591
|
function toHaveReceivedEventDetail(eventSpy, eventDetail) {
|
|
589
592
|
if (eventSpy === null || eventSpy === void 0) {
|
|
@@ -671,13 +674,13 @@ var goto = async (page, url, originalFn, options) => {
|
|
|
671
674
|
var EventSpy = class {
|
|
672
675
|
constructor(eventName) {
|
|
673
676
|
this.eventName = eventName;
|
|
674
|
-
/**
|
|
675
|
-
* Keeping track of a cursor ensures that no two spy.next() calls point to the same event.
|
|
676
|
-
*/
|
|
677
|
-
this.cursor = 0;
|
|
678
|
-
this.queuedHandler = [];
|
|
679
|
-
this.events = [];
|
|
680
677
|
}
|
|
678
|
+
/**
|
|
679
|
+
* Keeping track of a cursor ensures that no two spy.next() calls point to the same event.
|
|
680
|
+
*/
|
|
681
|
+
cursor = 0;
|
|
682
|
+
queuedHandler = [];
|
|
683
|
+
events = [];
|
|
681
684
|
get length() {
|
|
682
685
|
return this.events.length;
|
|
683
686
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../node_modules/deepmerge/dist/cjs.js", "../node_modules/fast-deep-equal/index.js", "../src/create-config.ts", "../src/load-config-meta.ts", "../node_modules/find-up/index.js", "../node_modules/locate-path/index.js", "../node_modules/p-locate/node_modules/yocto-queue/index.js", "../node_modules/p-locate/node_modules/p-limit/index.js", "../node_modules/p-locate/index.js", "../node_modules/unicorn-magic/node.js", "../src/matchers/to-have-first-received-event-detail.ts", "../src/matchers/to-have-nth-received-event-detail.ts", "../src/matchers/to-have-received-event.ts", "../src/matchers/to-have-received-event-detail.ts", "../src/matchers/to-have-received-event-times.ts", "../src/matchers/index.ts", "../src/page/utils/goto.ts", "../src/page/event-spy.ts", "../src/page/utils/locator.ts", "../src/page/utils/set-content.ts", "../src/page/utils/spy-on-event.ts", "../src/page/utils/wait-for-changes.ts", "../src/playwright-page.ts"],
|
|
4
|
-
"sourcesContent": ["'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n", "'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n", "import { PlaywrightTestConfig } from '@playwright/test';\nimport merge from 'deepmerge';\n\nimport { loadConfigMeta } from './load-config-meta';\nimport { ProcessConstants } from './process-constants';\n\n// Recursively apply the `Partial` type to all nested object types in the provided generic type\ntype DeepPartial<T> = T extends object\n ? {\n [P in keyof T]?: DeepPartial<T[P]>;\n }\n : T;\n\n/**\n * Helper function to easily create a Playwright config for Stencil projects. This function will\n * automatically load the Stencil config meta to set default values for the Playwright config respecting the\n * Stencil dev server configuration, and set the Stencil namespace and entry path as environment variables for use\n * in the Playwright tests.\n *\n * @param overrides Values to override in the default config. Any Playwright config option can be overridden.\n * @returns A {@link PlaywrightTestConfig} object\n */\nexport const createConfig = async (\n overrides: DeepPartial<PlaywrightTestConfig> = {},\n): Promise<PlaywrightTestConfig> => {\n const { webServerUrl, baseURL, stencilEntryPath, stencilNamespace } = await loadConfigMeta();\n\n // Set the Stencil namespace and entry path as environment variables so we can use them when constructing\n // the HTML `head` content in the `setContent` function. This is just an easy way for us to maintain some context\n // about the current Stencil project's configuration.\n process.env[ProcessConstants.STENCIL_NAMESPACE] = stencilNamespace;\n process.env[ProcessConstants.STENCIL_ENTRY_PATH] = stencilEntryPath;\n\n return merge<DeepPartial<PlaywrightTestConfig>>(\n {\n testMatch: '*.e2e.ts',\n use: {\n baseURL,\n },\n webServer: {\n command: 'stencil build --dev --watch --serve --no-open',\n url: webServerUrl,\n reuseExistingServer: !!!process.env.CI,\n // Max time to wait for dev server to start before aborting, defaults to 60000 (60 seconds)\n timeout: undefined,\n // Pipe the dev server output to the console\n // Gives visibility to the developer if the dev server fails to start\n stdout: 'pipe',\n },\n },\n overrides,\n ) as PlaywrightTestConfig;\n};\n", "import { loadConfig } from '@stencil/core/compiler';\nimport { OutputTargetWww } from '@stencil/core/internal';\nimport { findUp } from 'find-up';\nimport { existsSync } from 'fs';\nimport { relative } from 'path';\n\nconst DEFAULT_NAMESPACE = 'app';\nconst DEFAULT_BASE_URL = 'http://localhost:3333';\nconst DEFAULT_WEB_SERVER_URL = `${DEFAULT_BASE_URL}/ping`;\n\nconst DEFAULT_STENCIL_ENTRY_PATH_PREFIX = './build';\nconst DEFAULT_STENCIL_ENTRY_PATH = `${DEFAULT_STENCIL_ENTRY_PATH_PREFIX}/${DEFAULT_NAMESPACE}`;\n\n/**\n * For internal use only.\n *\n * Loads and validates the project's Stencil config.\n *\n * @returns The processed Stencil config metadata.\n */\nexport const loadConfigMeta = async () => {\n let baseURL = DEFAULT_BASE_URL;\n let webServerUrl = DEFAULT_WEB_SERVER_URL;\n let stencilNamespace = DEFAULT_NAMESPACE;\n let stencilEntryPath = DEFAULT_STENCIL_ENTRY_PATH;\n\n // Find the Stencil config file in either the current directory, or the nearest ancestor directory.\n // This allows for the Playwright config to exist in a different directory than the Stencil config.\n const stencilConfigPath = await findUp(['stencil.config.ts', 'stencil.config.js']);\n\n // Only load the Stencil config if the user has created one\n if (stencilConfigPath && existsSync(stencilConfigPath)) {\n const { devServer, fsNamespace, outputTargets } = (await loadConfig({ configPath: stencilConfigPath })).config;\n\n // Grab the WWW output target. If one doesn't exist, we'll throw a warning and roll\n // with the default value for the entry path.\n const wwwTarget = outputTargets.find((o): o is OutputTargetWww => o.type === 'www');\n if (wwwTarget) {\n // Get path from dev-server root to www\n let relativePath = relative(devServer.root!, wwwTarget.dir!);\n relativePath = relativePath === '' ? '.' : relativePath;\n if (!relativePath.startsWith('.')) {\n relativePath = `./${relativePath}`;\n }\n\n stencilEntryPath = `${relativePath}/build/${fsNamespace}`;\n } else {\n // Make a best guess at the entry path\n stencilEntryPath = `${DEFAULT_STENCIL_ENTRY_PATH_PREFIX}/${fsNamespace}`;\n\n console.warn(\n `No \"www\" output target found in the Stencil config. Using default entry path: \"${stencilEntryPath}\". Tests using 'setContent' may fail to execute.`,\n );\n }\n\n baseURL = `${devServer.protocol}://${devServer.address}:${devServer.port}`;\n webServerUrl = `${baseURL}${devServer.pingRoute ?? ''}`;\n stencilNamespace = fsNamespace;\n } else {\n const msg = stencilConfigPath\n ? `Unable to find your project's Stencil configuration file, starting from '${stencilConfigPath}'. Falling back to defaults.`\n : `No Stencil config file was found matching the glob 'stencil.config.{ts,js}' in the current or parent directories. Falling back to defaults.`;\n\n console.warn(msg);\n }\n\n return {\n baseURL,\n webServerUrl,\n stencilNamespace,\n stencilEntryPath,\n };\n};\n", "import path from 'node:path';\nimport fs from 'node:fs';\nimport {locatePath, locatePathSync} from 'locate-path';\nimport {toPath} from 'unicorn-magic';\n\nexport const findUpStop = Symbol('findUpStop');\n\nexport async function findUpMultiple(name, options = {}) {\n\tlet directory = path.resolve(toPath(options.cwd) ?? '');\n\tconst {root} = path.parse(directory);\n\tconst stopAt = path.resolve(directory, toPath(options.stopAt) ?? root);\n\tconst limit = options.limit ?? Number.POSITIVE_INFINITY;\n\tconst paths = [name].flat();\n\n\tconst runMatcher = async locateOptions => {\n\t\tif (typeof name !== 'function') {\n\t\t\treturn locatePath(paths, locateOptions);\n\t\t}\n\n\t\tconst foundPath = await name(locateOptions.cwd);\n\t\tif (typeof foundPath === 'string') {\n\t\t\treturn locatePath([foundPath], locateOptions);\n\t\t}\n\n\t\treturn foundPath;\n\t};\n\n\tconst matches = [];\n\twhile (true) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst foundPath = await runMatcher({...options, cwd: directory});\n\n\t\tif (foundPath === findUpStop) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (foundPath) {\n\t\t\tmatches.push(path.resolve(directory, foundPath));\n\t\t}\n\n\t\tif (directory === stopAt || matches.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdirectory = path.dirname(directory);\n\t}\n\n\treturn matches;\n}\n\nexport function findUpMultipleSync(name, options = {}) {\n\tlet directory = path.resolve(toPath(options.cwd) ?? '');\n\tconst {root} = path.parse(directory);\n\tconst stopAt = path.resolve(directory, toPath(options.stopAt) ?? root);\n\tconst limit = options.limit ?? Number.POSITIVE_INFINITY;\n\tconst paths = [name].flat();\n\n\tconst runMatcher = locateOptions => {\n\t\tif (typeof name !== 'function') {\n\t\t\treturn locatePathSync(paths, locateOptions);\n\t\t}\n\n\t\tconst foundPath = name(locateOptions.cwd);\n\t\tif (typeof foundPath === 'string') {\n\t\t\treturn locatePathSync([foundPath], locateOptions);\n\t\t}\n\n\t\treturn foundPath;\n\t};\n\n\tconst matches = [];\n\twhile (true) {\n\t\tconst foundPath = runMatcher({...options, cwd: directory});\n\n\t\tif (foundPath === findUpStop) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (foundPath) {\n\t\t\tmatches.push(path.resolve(directory, foundPath));\n\t\t}\n\n\t\tif (directory === stopAt || matches.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdirectory = path.dirname(directory);\n\t}\n\n\treturn matches;\n}\n\nexport async function findUp(name, options = {}) {\n\tconst matches = await findUpMultiple(name, {...options, limit: 1});\n\treturn matches[0];\n}\n\nexport function findUpSync(name, options = {}) {\n\tconst matches = findUpMultipleSync(name, {...options, limit: 1});\n\treturn matches[0];\n}\n\nasync function findDownDepthFirst(directory, paths, maxDepth, locateOptions, currentDepth = 0) {\n\tconst found = await locatePath(paths, {cwd: directory, ...locateOptions});\n\tif (found) {\n\t\treturn path.resolve(directory, found);\n\t}\n\n\tif (currentDepth >= maxDepth) {\n\t\treturn undefined;\n\t}\n\n\ttry {\n\t\tconst entries = await fs.promises.readdir(directory, {withFileTypes: true});\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\tconst result = await findDownDepthFirst(\n\t\t\t\t\tpath.join(directory, entry.name),\n\t\t\t\t\tpaths,\n\t\t\t\t\tmaxDepth,\n\t\t\t\t\tlocateOptions,\n\t\t\t\t\tcurrentDepth + 1,\n\t\t\t\t);\n\t\t\t\tif (result) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\treturn undefined;\n}\n\nfunction findDownDepthFirstSync(directory, paths, maxDepth, locateOptions, currentDepth = 0) {\n\tconst found = locatePathSync(paths, {cwd: directory, ...locateOptions});\n\tif (found) {\n\t\treturn path.resolve(directory, found);\n\t}\n\n\tif (currentDepth >= maxDepth) {\n\t\treturn undefined;\n\t}\n\n\ttry {\n\t\tconst entries = fs.readdirSync(directory, {withFileTypes: true});\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst result = findDownDepthFirstSync(\n\t\t\t\t\tpath.join(directory, entry.name),\n\t\t\t\t\tpaths,\n\t\t\t\t\tmaxDepth,\n\t\t\t\t\tlocateOptions,\n\t\t\t\t\tcurrentDepth + 1,\n\t\t\t\t);\n\t\t\t\tif (result) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\treturn undefined;\n}\n\nfunction prepareFindDownOptions(name, options) {\n\tconst startDirectory = path.resolve(toPath(options.cwd) ?? '');\n\tconst maxDepth = Math.max(0, options.depth ?? 1);\n\tconst paths = [name].flat();\n\tconst {type = 'file', allowSymlinks = true, strategy = 'breadth'} = options;\n\tconst locateOptions = {type, allowSymlinks};\n\treturn {\n\t\tstartDirectory,\n\t\tmaxDepth,\n\t\tpaths,\n\t\tlocateOptions,\n\t\tstrategy,\n\t};\n}\n\nasync function findDownBreadthFirst(startDirectory, paths, maxDepth, locateOptions) {\n\tconst queue = [{directory: startDirectory, depth: 0}];\n\n\twhile (queue.length > 0) {\n\t\tconst {directory, depth} = queue.shift();\n\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst found = await locatePath(paths, {cwd: directory, ...locateOptions});\n\t\tif (found) {\n\t\t\treturn path.resolve(directory, found);\n\t\t}\n\n\t\tif (depth >= maxDepth) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tconst entries = await fs.promises.readdir(directory, {withFileTypes: true});\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isDirectory()) {\n\t\t\t\t\tqueue.push({directory: path.join(directory, entry.name), depth: depth + 1});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t}\n\n\treturn undefined;\n}\n\nfunction findDownBreadthFirstSync(startDirectory, paths, maxDepth, locateOptions) {\n\tconst queue = [{directory: startDirectory, depth: 0}];\n\n\twhile (queue.length > 0) {\n\t\tconst {directory, depth} = queue.shift();\n\n\t\tconst found = locatePathSync(paths, {cwd: directory, ...locateOptions});\n\t\tif (found) {\n\t\t\treturn path.resolve(directory, found);\n\t\t}\n\n\t\tif (depth >= maxDepth) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst entries = fs.readdirSync(directory, {withFileTypes: true});\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isDirectory()) {\n\t\t\t\t\tqueue.push({directory: path.join(directory, entry.name), depth: depth + 1});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t}\n\n\treturn undefined;\n}\n\nexport async function findDown(name, options = {}) {\n\tconst {startDirectory, maxDepth, paths, locateOptions, strategy} = prepareFindDownOptions(name, options);\n\n\treturn strategy === 'depth'\n\t\t? findDownDepthFirst(startDirectory, paths, maxDepth, locateOptions)\n\t\t: findDownBreadthFirst(startDirectory, paths, maxDepth, locateOptions);\n}\n\nexport function findDownSync(name, options = {}) {\n\tconst {startDirectory, maxDepth, paths, locateOptions, strategy} = prepareFindDownOptions(name, options);\n\n\treturn strategy === 'depth'\n\t\t? findDownDepthFirstSync(startDirectory, paths, maxDepth, locateOptions)\n\t\t: findDownBreadthFirstSync(startDirectory, paths, maxDepth, locateOptions);\n}\n\n", "import process from 'node:process';\nimport path from 'node:path';\nimport fs, {promises as fsPromises} from 'node:fs';\nimport {fileURLToPath} from 'node:url';\nimport pLocate from 'p-locate';\n\nconst typeMappings = {\n\tdirectory: 'isDirectory',\n\tfile: 'isFile',\n};\n\nfunction checkType(type) {\n\tif (type === 'both' || Object.hasOwn(typeMappings, type)) {\n\t\treturn;\n\t}\n\n\tthrow new Error(`Invalid type specified: ${type}`);\n}\n\nconst matchType = (type, stat) => type === 'both' ? (stat.isFile() || stat.isDirectory()) : stat[typeMappings[type]]();\n\nconst toPath = urlOrPath => urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n\nexport async function locatePath(\n\tpaths,\n\t{\n\t\tcwd = process.cwd(),\n\t\ttype = 'file',\n\t\tallowSymlinks = true,\n\t\tconcurrency,\n\t\tpreserveOrder,\n\t} = {},\n) {\n\tcheckType(type);\n\tcwd = toPath(cwd);\n\n\tconst statFunction = allowSymlinks ? fsPromises.stat : fsPromises.lstat;\n\n\treturn pLocate(paths, async path_ => {\n\t\ttry {\n\t\t\tconst stat = await statFunction(path.resolve(cwd, path_));\n\t\t\treturn matchType(type, stat);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}, {concurrency, preserveOrder});\n}\n\nexport function locatePathSync(\n\tpaths,\n\t{\n\t\tcwd = process.cwd(),\n\t\ttype = 'file',\n\t\tallowSymlinks = true,\n\t} = {},\n) {\n\tcheckType(type);\n\tcwd = toPath(cwd);\n\n\tconst statFunction = allowSymlinks ? fs.statSync : fs.lstatSync;\n\n\tfor (const path_ of paths) {\n\t\ttry {\n\t\t\tconst stat = statFunction(path.resolve(cwd, path_), {\n\t\t\t\tthrowIfNoEntry: false,\n\t\t\t});\n\n\t\t\tif (!stat) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (matchType(type, stat)) {\n\t\t\t\treturn path_;\n\t\t\t}\n\t\t} catch {}\n\t}\n}\n", "/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n", "import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tif (queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst run = async (fn, resolve, args) => {\n\t\tactiveCount++;\n\n\t\tconst result = (async () => fn(...args))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (fn, resolve, args) => {\n\t\tqueue.enqueue(run.bind(undefined, fn, resolve, args));\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// when the run function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\t\tqueue.dequeue()();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (fn, ...args) => new Promise(resolve => {\n\t\tenqueue(fn, resolve, args);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue: () => {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n", "import pLimit from 'p-limit';\n\nclass EndError extends Error {\n\tconstructor(value) {\n\t\tsuper();\n\t\tthis.value = value;\n\t}\n}\n\n// The input can also be a promise, so we await it.\nconst testElement = async (element, tester) => tester(await element);\n\n// The input can also be a promise, so we `Promise.all()` them both.\nconst finder = async element => {\n\tconst values = await Promise.all(element);\n\tif (values[1] === true) {\n\t\tthrow new EndError(values[0]);\n\t}\n\n\treturn false;\n};\n\nexport default async function pLocate(\n\titerable,\n\ttester,\n\t{\n\t\tconcurrency = Number.POSITIVE_INFINITY,\n\t\tpreserveOrder = true,\n\t} = {},\n) {\n\tconst limit = pLimit(concurrency);\n\n\t// Start all the promises concurrently with optional limit.\n\tconst items = [...iterable].map(element => [element, limit(testElement, element, tester)]);\n\n\t// Check the promises either serially or concurrently.\n\tconst checkLimit = pLimit(preserveOrder ? 1 : Number.POSITIVE_INFINITY);\n\n\ttry {\n\t\tawait Promise.all(items.map(element => checkLimit(finder, element)));\n\t} catch (error) {\n\t\tif (error instanceof EndError) {\n\t\t\treturn error.value;\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n", "import {promisify} from 'node:util';\nimport {execFile as execFileCallback, execFileSync as execFileSyncOriginal} from 'node:child_process';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nconst execFileOriginal = promisify(execFileCallback);\n\nexport function toPath(urlOrPath) {\n\treturn urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n}\n\nexport function rootDirectory(pathInput) {\n\treturn path.parse(toPath(pathInput)).root;\n}\n\nexport function traversePathUp(startPath) {\n\treturn {\n\t\t* [Symbol.iterator]() {\n\t\t\tlet currentPath = path.resolve(toPath(startPath));\n\t\t\tlet previousPath;\n\n\t\t\twhile (previousPath !== currentPath) {\n\t\t\t\tyield currentPath;\n\t\t\t\tpreviousPath = currentPath;\n\t\t\t\tcurrentPath = path.resolve(currentPath, '..');\n\t\t\t}\n\t\t},\n\t};\n}\n\nconst TEN_MEGABYTES_IN_BYTES = 10 * 1024 * 1024;\n\nexport async function execFile(file, arguments_, options = {}) {\n\treturn execFileOriginal(file, arguments_, {\n\t\tmaxBuffer: TEN_MEGABYTES_IN_BYTES,\n\t\t...options,\n\t});\n}\n\nexport function execFileSync(file, arguments_ = [], options = {}) {\n\treturn execFileSyncOriginal(file, arguments_, {\n\t\tmaxBuffer: TEN_MEGABYTES_IN_BYTES,\n\t\tencoding: 'utf8',\n\t\tstdio: 'pipe',\n\t\t...options,\n\t});\n}\n\nexport * from './default.js';\n", "import { expect } from '@playwright/test';\nimport deepEqual from 'fast-deep-equal';\n\nimport { EventSpy } from '../page/event-spy';\n\nexport function toHaveFirstReceivedEventDetail(eventSpy: EventSpy, eventDetail: any) {\n if (eventSpy === null || eventSpy === undefined) {\n return {\n message: () => `expected spy to have received event, but it was not defined`,\n pass: false,\n };\n }\n\n if (typeof (eventSpy as any).then === 'function') {\n return {\n message: () =>\n `expected spy to have received event, but it was not resolved (did you forget an await operator?).`,\n pass: false,\n };\n }\n\n if (eventSpy.eventName === null || eventSpy.eventName === undefined) {\n return {\n message: () => `toHaveReceivedEventDetail did not receive an event spy`,\n pass: false,\n };\n }\n\n if (eventSpy.firstEvent === null || eventSpy.firstEvent === undefined) {\n return {\n message: () => `event \"${eventSpy.eventName}\" was not received`,\n pass: false,\n };\n }\n\n const pass = deepEqual(eventSpy.firstEvent.detail, eventDetail);\n\n expect(eventSpy.lastEvent.detail).toEqual(eventDetail);\n\n return {\n message: () => `expected event \"${eventSpy.eventName}\" detail to ${pass ? 'not ' : ''}equal`,\n pass: pass,\n };\n}\n", "import { expect } from '@playwright/test';\nimport deepEqual from 'fast-deep-equal';\n\nimport { EventSpy } from '../page/event-spy';\n\nexport function toHaveNthReceivedEventDetail(eventSpy: EventSpy, index: number, eventDetail: any) {\n if (eventSpy === null || eventSpy === undefined) {\n return {\n message: () => `expected spy to have received event, but it was not defined`,\n pass: false,\n };\n }\n\n if (typeof (eventSpy as any).then === 'function') {\n return {\n message: () =>\n `expected spy to have received event, but it was not resolved (did you forget an await operator?).`,\n pass: false,\n };\n }\n\n if (eventSpy.eventName === null || eventSpy.eventName === undefined) {\n return {\n message: () => `toHaveReceivedEventDetail did not receive an event spy`,\n pass: false,\n };\n }\n\n if (eventSpy.firstEvent === null || eventSpy.firstEvent === undefined) {\n return {\n message: () => `event \"${eventSpy.eventName}\" was not received`,\n pass: false,\n };\n }\n\n const event = eventSpy.events[index];\n\n if (event === null || event === undefined) {\n return {\n message: () => `event at index ${index} was not received`,\n pass: false,\n };\n }\n\n const pass = deepEqual(event.detail, eventDetail);\n\n expect(event.detail).toEqual(eventDetail);\n\n return {\n message: () => `expected event \"${eventSpy.eventName}\" detail to ${pass ? 'not ' : ''}equal`,\n pass: pass,\n };\n}\n", "import type { EventSpy } from '../page/event-spy';\n\nexport function toHaveReceivedEvent(eventSpy: EventSpy) {\n if (eventSpy === undefined || eventSpy === null) {\n return {\n message: () => `expected spy to have received event, but it was not defined`,\n pass: false,\n };\n }\n if (typeof (eventSpy as any).then === 'function') {\n return {\n message: () =>\n `expected spy to have received event, but it was not resolved (did you forget an await operator?).`,\n pass: false,\n };\n }\n const pass = eventSpy.events.length > 0;\n if (pass) {\n return {\n message: () => `expected to have called ${eventSpy.eventName} event`,\n pass: true,\n };\n }\n return {\n message: () => `expected to have not called ${eventSpy.eventName} event`,\n pass: false,\n };\n}\n", "import { expect } from '@playwright/test';\nimport deepEqual from 'fast-deep-equal';\n\nimport type { EventSpy } from '../page/event-spy';\n\nexport function toHaveReceivedEventDetail(eventSpy: EventSpy, eventDetail: any) {\n if (eventSpy === null || eventSpy === undefined) {\n return {\n message: () => `toHaveReceivedEventDetail event spy is null`,\n pass: false,\n };\n }\n\n if (typeof (eventSpy as any).then === 'function') {\n return {\n message: () =>\n `expected spy to have received event, but it was not resolved (did you forget an await operator?).`,\n pass: false,\n };\n }\n\n if (!eventSpy.eventName) {\n return {\n message: () => `toHaveReceivedEventDetail did not receive an event spy`,\n pass: false,\n };\n }\n\n if (eventSpy.lastEvent === null || eventSpy.lastEvent === undefined) {\n return {\n message: () => `event \"${eventSpy.eventName}\" was not received`,\n pass: false,\n };\n }\n\n const pass = deepEqual(eventSpy.lastEvent.detail, eventDetail);\n\n expect(eventSpy.lastEvent.detail).toEqual(eventDetail);\n\n return {\n message: () => `expected event \"${eventSpy.eventName}\" detail to ${pass ? 'not ' : ''}equal`,\n pass: pass,\n };\n}\n", "import type { EventSpy } from '../page/event-spy';\n\nexport function toHaveReceivedEventTimes(eventSpy: EventSpy, count: number) {\n if (!eventSpy) {\n return {\n message: () => `toHaveReceivedEventTimes event spy is null`,\n pass: false,\n };\n }\n\n if (typeof (eventSpy as any).then === 'function') {\n return {\n message: () =>\n `expected spy to have received event, but it was not resolved (did you forget an await operator?).`,\n pass: false,\n };\n }\n\n if (!eventSpy.eventName) {\n return {\n message: () => `toHaveReceivedEventTimes did not receive an event spy`,\n pass: false,\n };\n }\n\n const pass = eventSpy.length === count;\n\n return {\n message: () =>\n `expected event \"${eventSpy.eventName}\" to have been called ${count} times, but it was called ${eventSpy.events.length} times`,\n pass: pass,\n };\n}\n", "import { toHaveFirstReceivedEventDetail } from './to-have-first-received-event-detail';\nimport { toHaveNthReceivedEventDetail } from './to-have-nth-received-event-detail';\nimport { toHaveReceivedEvent } from './to-have-received-event';\nimport { toHaveReceivedEventDetail } from './to-have-received-event-detail';\nimport { toHaveReceivedEventTimes } from './to-have-received-event-times';\n\nexport const matchers = {\n toHaveReceivedEvent,\n toHaveReceivedEventDetail,\n toHaveReceivedEventTimes,\n toHaveFirstReceivedEventDetail,\n toHaveNthReceivedEventDetail,\n};\n", "/* eslint-disable jsdoc/require-param */\n/* eslint-disable jsdoc/require-returns */\nimport type { Page } from '@playwright/test';\n\nimport type { E2EPageOptions } from '../../playwright-declarations';\n\n/**\n * This is an extended version of Playwright's `page.goto` method. In addition to performing\n * the normal `page.goto` work, this code also automatically waits for the Stencil components\n * to be hydrated before proceeding with the test.\n */\nexport const goto = async (page: Page, url: string, originalFn: typeof page.goto, options?: E2EPageOptions) => {\n const result = await Promise.all([\n page.waitForFunction(() => (window as any).testAppLoaded === true, {\n // This timeout was taken from the existing Playwright adapter in the Ionic Framework repository.\n // They tested this number and found it to be a reliable timeout for the Stencil components to be hydrated.\n timeout: 4750,\n }),\n originalFn(url, options),\n ]);\n\n return result[1];\n};\n", "import type { JSHandle } from '@playwright/test';\n\nimport type { E2EPage } from '../playwright-declarations';\n\n/**\n * The EventSpy class allows developers to listen for a particular event emission and\n * pass/fail the test based on whether or not the event was emitted.\n * Based off https://github.com/ionic-team/stencil/blob/16b8ea4dabb22024872a38bc58ba1dcf1c7cc25b/src/testing/puppeteer/puppeteer-events.ts#L64\n */\nexport class EventSpy {\n /**\n * Keeping track of a cursor ensures that no two spy.next() calls point to the same event.\n */\n private cursor = 0;\n private queuedHandler: (() => void)[] = [];\n public events: CustomEvent[] = [];\n\n constructor(public eventName: string) {}\n\n get length() {\n return this.events.length;\n }\n\n get firstEvent() {\n return this.events[0] ?? null;\n }\n\n get lastEvent() {\n return this.events[this.events.length - 1] ?? null;\n }\n\n public next() {\n const { cursor } = this;\n this.cursor++;\n\n const next = this.events[cursor];\n if (next !== undefined) {\n return Promise.resolve(next);\n } else {\n /**\n * If the event has not already been emitted, then add it to the queuedHandler.\n * When the event is emitted, the push method is called which results in the Promise below being resolved.\n */\n let resolve: () => void;\n const promise = new Promise<void>((r) => (resolve = r));\n // @ts-ignore\n this.queuedHandler.push(resolve);\n\n return promise.then(() => this.events[cursor]);\n }\n }\n\n public push(ev: CustomEvent) {\n this.events.push(ev);\n const next = this.queuedHandler.shift();\n if (next) {\n next();\n }\n }\n}\n\n/**\n * For internal use only.\n *\n * Initializes information required to spy on events.\n * The stencilOnEvent function is called in the context of the current page.\n * This lets us respond to an event listener created within the page itself.\n *\n * @param page The Playwright test page object.\n */\nexport const initPageEvents = async (page: E2EPage) => {\n page._e2eEventsIds = 0;\n page._e2eEvents = new Map();\n\n await page.exposeFunction('stencilOnEvent', (id: number, ev: any) => {\n const context = page._e2eEvents.get(id);\n if (context) {\n context.callback(ev);\n }\n });\n};\n\n/**\n * For internal use only.\n *\n * Adds a new event listener in the current page context to updates\n * the _e2eEvents map when an event is fired.\n *\n * @param page The Playwright test page object.\n * @param elmHandle A {@link JSHandle} representing the element to listen for events on.\n * @param eventName The event name to listen for.\n * @param callback The callback to execute when the event is fired.\n */\nexport const addE2EListener = async (\n page: E2EPage,\n elmHandle: JSHandle,\n eventName: string,\n callback: (ev: any) => void,\n) => {\n const id = page._e2eEventsIds++;\n page._e2eEvents.set(id, {\n eventName,\n callback,\n });\n\n await elmHandle.evaluate(\n (elm, [eventName, id]) => {\n (window as any).stencilSerializeEventTarget = (target: any) => {\n // BROWSER CONTEXT\n if (!target) {\n return null;\n }\n if (target === window) {\n return { serializedWindow: true };\n }\n if (target === document) {\n return { serializedDocument: true };\n }\n if (target.nodeType != null) {\n const serializedElement: any = {\n serializedElement: true,\n nodeName: target.nodeName,\n nodeValue: target.nodeValue,\n nodeType: target.nodeType,\n tagName: target.tagName,\n className: target.className,\n id: target.id,\n };\n return serializedElement;\n }\n return null;\n };\n\n (window as any).serializeStencilEvent = (orgEv: CustomEvent) => {\n const serializedEvent = {\n bubbles: orgEv.bubbles,\n cancelBubble: orgEv.cancelBubble,\n cancelable: orgEv.cancelable,\n composed: orgEv.composed,\n currentTarget: (window as any).stencilSerializeEventTarget(orgEv.currentTarget),\n defaultPrevented: orgEv.defaultPrevented,\n detail: orgEv.detail,\n eventPhase: orgEv.eventPhase,\n isTrusted: orgEv.isTrusted,\n returnValue: orgEv.returnValue,\n srcElement: (window as any).stencilSerializeEventTarget(orgEv.srcElement),\n target: (window as any).stencilSerializeEventTarget(orgEv.target),\n timeStamp: orgEv.timeStamp,\n type: orgEv.type,\n isSerializedEvent: true,\n };\n return serializedEvent;\n };\n\n elm.addEventListener(eventName as string, (ev: Event) => {\n (window as any).stencilOnEvent(id, (window as any).serializeStencilEvent(ev));\n });\n },\n [eventName, id],\n );\n};\n", "import type { Locator } from '@playwright/test';\n\nimport type { E2EPage } from '../../playwright-declarations';\nimport { addE2EListener, EventSpy } from '../event-spy';\n\nexport type LocatorOptions = {\n hasText?: string | RegExp;\n has?: Locator;\n};\n\nexport interface E2ELocator extends Locator {\n /**\n * Creates a new EventSpy and listens on the element for an event.\n * The test will timeout if the event never fires.\n *\n * Usage:\n * const input = page.locator('ion-input');\n * const ionChange = await locator.spyOnEvent('ionChange');\n * ...\n * await ionChange.next();\n */\n spyOnEvent: (eventName: string) => Promise<EventSpy>;\n}\n\nexport const locator = (\n page: E2EPage,\n originalFn: typeof page.locator,\n selector: string,\n options?: LocatorOptions,\n): E2ELocator => {\n const locator = originalFn(selector, options) as E2ELocator;\n locator.spyOnEvent = async (eventName: string) => {\n const spy = new EventSpy(eventName);\n const handle = await locator.evaluateHandle((node: HTMLElement) => node);\n await addE2EListener(page, handle, eventName, (ev: CustomEvent) => spy.push(ev));\n return spy;\n };\n return locator;\n};\n", "import type { Page, TestInfo } from '@playwright/test';\n\nimport type { E2EPageOptions } from '../../playwright-declarations';\n\n/**\n * Overwrites the default Playwright page.setContent method.\n *\n * Navigates to a blank page, sets the content, and waits for the\n * Stencil components to be hydrated before proceeding with the test.\n *\n * @param page The Playwright page object.\n * @param html The HTML content to set on the page.\n * @param testInfo Test information from the test bed. Used to access base URL.\n * @param options The test config associated with the current test run.\n */\nexport const setContent = async (page: Page, html: string, testInfo: TestInfo, options?: E2EPageOptions) => {\n if (page.isClosed()) {\n throw new Error('setContent unavailable: page is already closed');\n }\n\n const baseUrl = testInfo.project.use.baseURL;\n const baseEntryPath = process.env.STENCIL_ENTRY_PATH;\n\n const output = `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <title>Stencil Playwright Test</title>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0\" />\n <script src=\"${baseEntryPath}.js\" nomodule></script>\n <script type=\"module\" src=\"${baseEntryPath}.esm.js\"></script>\n </head>\n <body>\n ${html}\n </body>\n </html>\n `;\n\n if (baseUrl) {\n await page.route(baseUrl, (route) => {\n if (route.request().url() === `${baseUrl}/`) {\n /**\n * Intercepts the empty page request and returns the\n * HTML content that was passed in.\n */\n route.fulfill({\n status: 200,\n contentType: 'text/html',\n body: output,\n });\n } else {\n // Allow all other requests to pass through\n route.continue();\n }\n });\n\n await page.goto(`${baseUrl}#`, options);\n } else {\n throw new Error('setContent unavailable: no dev server base URL provided');\n }\n};\n", "import type { E2EPage } from '../../playwright-declarations';\nimport { addE2EListener, EventSpy } from '../event-spy';\n\nexport const spyOnEvent = async (page: E2EPage, eventName: string): Promise<EventSpy> => {\n const spy = new EventSpy(eventName);\n\n const handle = await page.evaluateHandle(() => window);\n\n await addE2EListener(page, handle, eventName, (ev: CustomEvent) => spy.push(ev));\n\n return spy;\n};\n", "import type { Page } from '@playwright/test';\nimport type { HostElement } from '@stencil/core/internal';\n\n/**\n * Waits for a combined threshold of a Stencil web component to be re-hydrated in the next repaint + 100ms.\n * Used for testing changes to a web component that does not modify CSS classes or introduce new DOM nodes.\n *\n * Original source: https://github.com/ionic-team/stencil/blob/main/src/testing/puppeteer/puppeteer-page.ts#L298-L363\n *\n * @param page The Playwright page object.\n * @param timeoutMs The time to wait for the changes to occur.\n */\nexport const waitForChanges = async (page: Page, timeoutMs = 100) => {\n try {\n if (page.isClosed()) {\n /**\n * If the page is already closed, we can skip the long execution of this method\n * and return early.\n */\n return;\n }\n await page.evaluate(() => {\n // BROWSER CONTEXT\n return new Promise<void>((resolve) => {\n // Wait for the next repaint to happen\n requestAnimationFrame(() => {\n const promiseChain: Promise<any>[] = [];\n\n const waitComponentOnReady = (elm: Element | ShadowRoot, promises: Promise<any>[]) => {\n if ('shadowRoot' in elm && elm.shadowRoot instanceof ShadowRoot) {\n waitComponentOnReady(elm.shadowRoot, promises);\n }\n const children = elm.children;\n const len = children.length;\n for (let i = 0; i < len; i++) {\n const childElm = children[i];\n const childStencilElm = childElm as HostElement;\n if (childElm.tagName.includes('-') && typeof childStencilElm.componentOnReady === 'function') {\n /**\n * We are only using the lazy loaded bundle\n * here so we can safely use the\n * componentOnReady method.\n */\n promises.push(childStencilElm.componentOnReady());\n }\n waitComponentOnReady(childElm, promises);\n }\n };\n\n waitComponentOnReady(document.documentElement, promiseChain);\n\n Promise.all(promiseChain)\n .then(() => resolve())\n .catch(() => resolve());\n });\n });\n });\n if (page.isClosed()) {\n return;\n }\n await page.waitForTimeout(timeoutMs);\n } catch (e) {\n console.error(e);\n }\n};\n", "import type {\n PlaywrightTestArgs,\n PlaywrightTestOptions,\n PlaywrightWorkerArgs,\n PlaywrightWorkerOptions,\n} from '@playwright/test';\nimport { test as base } from '@playwright/test';\n\nimport { loadConfigMeta } from './load-config-meta.js';\nimport { initPageEvents } from './page/event-spy';\nimport type { LocatorOptions } from './page/utils';\nimport { goto as goToPage, locator, setContent, spyOnEvent, waitForChanges } from './page/utils';\nimport type { BrowserNameOrCallback, E2EPage, E2EPageOptions, E2ESkip } from './playwright-declarations';\nimport { ProcessConstants } from './process-constants.js';\n\ntype CustomTestArgs = PlaywrightTestArgs &\n PlaywrightTestOptions &\n PlaywrightWorkerArgs &\n PlaywrightWorkerOptions & {\n page: E2EPage;\n };\n\ntype CustomFixtures = {\n page: E2EPage;\n skip: E2ESkip;\n};\n\n/**\n * Extends the base `page` test figure within Playwright.\n * @param page The page to extend.\n * @returns The modified playwright page with extended functionality.\n */\nasync function extendPageFixture(page: E2EPage) {\n // Make sure the Stencil namespace and entry path are set on the process so we can use them in the `setContent` tests.\n // These wouldn't be set if the user didn't setup the Playwright config with the `createConfig()` helper.\n if (!process.env[ProcessConstants.STENCIL_NAMESPACE] || !process.env[ProcessConstants.STENCIL_ENTRY_PATH]) {\n const { stencilNamespace, stencilEntryPath } = await loadConfigMeta();\n\n if (!process.env[ProcessConstants.STENCIL_NAMESPACE]) {\n process.env[ProcessConstants.STENCIL_NAMESPACE] = stencilNamespace;\n }\n if (!process.env[ProcessConstants.STENCIL_ENTRY_PATH]) {\n process.env[ProcessConstants.STENCIL_ENTRY_PATH] = stencilEntryPath;\n }\n }\n\n const originalGoto = page.goto.bind(page);\n const originalLocator = page.locator.bind(page);\n\n await page.addInitScript(() => {\n window.addEventListener('appload', () => {\n (window as any).testAppLoaded = true;\n });\n });\n\n // Overridden Playwright methods\n page.goto = (url: string, options?: E2EPageOptions) => goToPage(page, url, originalGoto, options);\n page.setContent = (html: string, options?: E2EPageOptions) => setContent(page, html, test.info(), options);\n page.locator = (selector: string, options?: LocatorOptions) => locator(page, originalLocator, selector, options);\n\n // Custom adapter methods\n page.waitForChanges = (timeoutMs?: number) => waitForChanges(page, timeoutMs);\n page.spyOnEvent = (eventName: string) => spyOnEvent(page, eventName);\n\n // Custom event behavior\n await initPageEvents(page);\n\n return page;\n}\n\nexport const test = base.extend<CustomFixtures>({\n page: async ({ page }: CustomTestArgs, use: (r: E2EPage) => Promise<void>) => {\n page = await extendPageFixture(page);\n await use(page);\n },\n skip: {\n browser: (\n browserNameOrFunction: BrowserNameOrCallback,\n reason = `The functionality that is being tested is not applicable to this browser.`,\n ) => {\n const browserName = base.info().project.use.browserName!;\n\n if (typeof browserNameOrFunction === 'function') {\n base.skip(browserNameOrFunction(browserName), reason);\n } else {\n base.skip(browserName === browserNameOrFunction, reason);\n }\n },\n mode: (mode: string, reason = `The functionality that is being tested is not applicable to ${mode} mode`) => {\n base.skip(base.info().project.metadata.mode === mode, reason);\n },\n },\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n", "'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n", "import { PlaywrightTestConfig } from '@playwright/test';\nimport merge from 'deepmerge';\n\nimport { loadConfigMeta } from './load-config-meta';\nimport { ProcessConstants } from './process-constants';\n\n// Recursively apply the `Partial` type to all nested object types in the provided generic type\ntype DeepPartial<T> = T extends object\n ? {\n [P in keyof T]?: DeepPartial<T[P]>;\n }\n : T;\n\n/**\n * Helper function to easily create a Playwright config for Stencil projects. This function will\n * automatically load the Stencil config meta to set default values for the Playwright config respecting the\n * Stencil dev server configuration, and set the Stencil namespace and entry path as environment variables for use\n * in the Playwright tests.\n *\n * @param overrides Values to override in the default config. Any Playwright config option can be overridden.\n * @returns A {@link PlaywrightTestConfig} object\n */\nexport const createConfig = async (\n overrides: DeepPartial<PlaywrightTestConfig> = {},\n): Promise<PlaywrightTestConfig> => {\n const { webServerUrl, baseURL, stencilEntryPath, stencilNamespace } = await loadConfigMeta();\n\n // Set the Stencil namespace and entry path as environment variables so we can use them when constructing\n // the HTML `head` content in the `setContent` function. This is just an easy way for us to maintain some context\n // about the current Stencil project's configuration.\n process.env[ProcessConstants.STENCIL_NAMESPACE] = stencilNamespace;\n process.env[ProcessConstants.STENCIL_ENTRY_PATH] = stencilEntryPath;\n\n return merge<DeepPartial<PlaywrightTestConfig>>(\n {\n testMatch: '*.e2e.ts',\n use: {\n baseURL,\n },\n webServer: {\n command: 'stencil build --dev --watch --serve --no-open',\n url: webServerUrl,\n reuseExistingServer: !!!process.env.CI,\n // Max time to wait for dev server to start before aborting, defaults to 60000 (60 seconds)\n timeout: undefined,\n // Pipe the dev server output to the console\n // Gives visibility to the developer if the dev server fails to start\n stdout: 'pipe',\n },\n },\n overrides,\n ) as PlaywrightTestConfig;\n};\n", "import { loadConfig, OutputTargetWww } from '@stencil/core/compiler';\nimport { findUp } from 'find-up';\nimport { existsSync } from 'fs';\nimport { relative } from 'path';\n\nconst DEFAULT_NAMESPACE = 'app';\nconst DEFAULT_BASE_URL = 'http://localhost:3333';\nconst DEFAULT_WEB_SERVER_URL = `${DEFAULT_BASE_URL}/ping`;\n\nconst DEFAULT_STENCIL_ENTRY_PATH_PREFIX = './build';\nconst DEFAULT_STENCIL_ENTRY_PATH = `${DEFAULT_STENCIL_ENTRY_PATH_PREFIX}/${DEFAULT_NAMESPACE}`;\n\n/**\n * For internal use only.\n *\n * Loads and validates the project's Stencil config.\n *\n * @returns The processed Stencil config metadata.\n */\nexport const loadConfigMeta = async () => {\n let baseURL = DEFAULT_BASE_URL;\n let webServerUrl = DEFAULT_WEB_SERVER_URL;\n let stencilNamespace = DEFAULT_NAMESPACE;\n let stencilEntryPath = DEFAULT_STENCIL_ENTRY_PATH;\n\n // Find the Stencil config file in either the current directory, or the nearest ancestor directory.\n // This allows for the Playwright config to exist in a different directory than the Stencil config.\n const stencilConfigPath = await findUp(['stencil.config.ts', 'stencil.config.js']);\n\n // Only load the Stencil config if the user has created one\n if (stencilConfigPath && existsSync(stencilConfigPath)) {\n const { devServer, fsNamespace, outputTargets } = (await loadConfig({ configPath: stencilConfigPath })).config;\n\n // Grab the WWW output target. If one doesn't exist, we'll throw a warning and roll\n // with the default value for the entry path.\n const wwwTarget = outputTargets.find((o): o is OutputTargetWww => o.type === 'www');\n if (wwwTarget) {\n // Get path from dev-server root to www\n let relativePath = relative(devServer.root!, wwwTarget.dir!);\n relativePath = relativePath === '' ? '.' : relativePath;\n if (!relativePath.startsWith('.')) {\n relativePath = `./${relativePath}`;\n }\n\n stencilEntryPath = `${relativePath}/build/${fsNamespace}`;\n } else {\n // Make a best guess at the entry path\n stencilEntryPath = `${DEFAULT_STENCIL_ENTRY_PATH_PREFIX}/${fsNamespace}`;\n\n console.warn(\n `No \"www\" output target found in the Stencil config. Using default entry path: \"${stencilEntryPath}\". Tests using 'setContent' may fail to execute.`,\n );\n }\n\n baseURL = `${devServer.protocol}://${devServer.address}:${devServer.port}`;\n webServerUrl = `${baseURL}${devServer.pingRoute ?? ''}`;\n stencilNamespace = fsNamespace;\n } else {\n const msg = stencilConfigPath\n ? `Unable to find your project's Stencil configuration file, starting from '${stencilConfigPath}'. Falling back to defaults.`\n : `No Stencil config file was found matching the glob 'stencil.config.{ts,js}' in the current or parent directories. Falling back to defaults.`;\n\n console.warn(msg);\n }\n\n return {\n baseURL,\n webServerUrl,\n stencilNamespace,\n stencilEntryPath,\n };\n};\n", "import path from 'node:path';\nimport fs from 'node:fs';\nimport {locatePath, locatePathSync} from 'locate-path';\nimport {toPath} from 'unicorn-magic';\n\nexport const findUpStop = Symbol('findUpStop');\n\nexport async function findUpMultiple(name, options = {}) {\n\tlet directory = path.resolve(toPath(options.cwd) ?? '');\n\tconst {root} = path.parse(directory);\n\tconst stopAt = path.resolve(directory, toPath(options.stopAt) ?? root);\n\tconst limit = options.limit ?? Number.POSITIVE_INFINITY;\n\tconst paths = [name].flat();\n\n\tconst runMatcher = async locateOptions => {\n\t\tif (typeof name !== 'function') {\n\t\t\treturn locatePath(paths, locateOptions);\n\t\t}\n\n\t\tconst foundPath = await name(locateOptions.cwd);\n\t\tif (typeof foundPath === 'string') {\n\t\t\treturn locatePath([foundPath], locateOptions);\n\t\t}\n\n\t\treturn foundPath;\n\t};\n\n\tconst matches = [];\n\twhile (true) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst foundPath = await runMatcher({...options, cwd: directory});\n\n\t\tif (foundPath === findUpStop) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (foundPath) {\n\t\t\tmatches.push(path.resolve(directory, foundPath));\n\t\t}\n\n\t\tif (directory === stopAt || matches.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdirectory = path.dirname(directory);\n\t}\n\n\treturn matches;\n}\n\nexport function findUpMultipleSync(name, options = {}) {\n\tlet directory = path.resolve(toPath(options.cwd) ?? '');\n\tconst {root} = path.parse(directory);\n\tconst stopAt = path.resolve(directory, toPath(options.stopAt) ?? root);\n\tconst limit = options.limit ?? Number.POSITIVE_INFINITY;\n\tconst paths = [name].flat();\n\n\tconst runMatcher = locateOptions => {\n\t\tif (typeof name !== 'function') {\n\t\t\treturn locatePathSync(paths, locateOptions);\n\t\t}\n\n\t\tconst foundPath = name(locateOptions.cwd);\n\t\tif (typeof foundPath === 'string') {\n\t\t\treturn locatePathSync([foundPath], locateOptions);\n\t\t}\n\n\t\treturn foundPath;\n\t};\n\n\tconst matches = [];\n\twhile (true) {\n\t\tconst foundPath = runMatcher({...options, cwd: directory});\n\n\t\tif (foundPath === findUpStop) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (foundPath) {\n\t\t\tmatches.push(path.resolve(directory, foundPath));\n\t\t}\n\n\t\tif (directory === stopAt || matches.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdirectory = path.dirname(directory);\n\t}\n\n\treturn matches;\n}\n\nexport async function findUp(name, options = {}) {\n\tconst matches = await findUpMultiple(name, {...options, limit: 1});\n\treturn matches[0];\n}\n\nexport function findUpSync(name, options = {}) {\n\tconst matches = findUpMultipleSync(name, {...options, limit: 1});\n\treturn matches[0];\n}\n\nasync function findDownDepthFirst(directory, paths, maxDepth, locateOptions, currentDepth = 0) {\n\tconst found = await locatePath(paths, {cwd: directory, ...locateOptions});\n\tif (found) {\n\t\treturn path.resolve(directory, found);\n\t}\n\n\tif (currentDepth >= maxDepth) {\n\t\treturn undefined;\n\t}\n\n\ttry {\n\t\tconst entries = await fs.promises.readdir(directory, {withFileTypes: true});\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\tconst result = await findDownDepthFirst(\n\t\t\t\t\tpath.join(directory, entry.name),\n\t\t\t\t\tpaths,\n\t\t\t\t\tmaxDepth,\n\t\t\t\t\tlocateOptions,\n\t\t\t\t\tcurrentDepth + 1,\n\t\t\t\t);\n\t\t\t\tif (result) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\treturn undefined;\n}\n\nfunction findDownDepthFirstSync(directory, paths, maxDepth, locateOptions, currentDepth = 0) {\n\tconst found = locatePathSync(paths, {cwd: directory, ...locateOptions});\n\tif (found) {\n\t\treturn path.resolve(directory, found);\n\t}\n\n\tif (currentDepth >= maxDepth) {\n\t\treturn undefined;\n\t}\n\n\ttry {\n\t\tconst entries = fs.readdirSync(directory, {withFileTypes: true});\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isDirectory()) {\n\t\t\t\tconst result = findDownDepthFirstSync(\n\t\t\t\t\tpath.join(directory, entry.name),\n\t\t\t\t\tpaths,\n\t\t\t\t\tmaxDepth,\n\t\t\t\t\tlocateOptions,\n\t\t\t\t\tcurrentDepth + 1,\n\t\t\t\t);\n\t\t\t\tif (result) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\treturn undefined;\n}\n\nfunction prepareFindDownOptions(name, options) {\n\tconst startDirectory = path.resolve(toPath(options.cwd) ?? '');\n\tconst maxDepth = Math.max(0, options.depth ?? 1);\n\tconst paths = [name].flat();\n\tconst {type = 'file', allowSymlinks = true, strategy = 'breadth'} = options;\n\tconst locateOptions = {type, allowSymlinks};\n\treturn {\n\t\tstartDirectory,\n\t\tmaxDepth,\n\t\tpaths,\n\t\tlocateOptions,\n\t\tstrategy,\n\t};\n}\n\nasync function findDownBreadthFirst(startDirectory, paths, maxDepth, locateOptions) {\n\tconst queue = [{directory: startDirectory, depth: 0}];\n\n\twhile (queue.length > 0) {\n\t\tconst {directory, depth} = queue.shift();\n\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst found = await locatePath(paths, {cwd: directory, ...locateOptions});\n\t\tif (found) {\n\t\t\treturn path.resolve(directory, found);\n\t\t}\n\n\t\tif (depth >= maxDepth) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tconst entries = await fs.promises.readdir(directory, {withFileTypes: true});\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isDirectory()) {\n\t\t\t\t\tqueue.push({directory: path.join(directory, entry.name), depth: depth + 1});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t}\n\n\treturn undefined;\n}\n\nfunction findDownBreadthFirstSync(startDirectory, paths, maxDepth, locateOptions) {\n\tconst queue = [{directory: startDirectory, depth: 0}];\n\n\twhile (queue.length > 0) {\n\t\tconst {directory, depth} = queue.shift();\n\n\t\tconst found = locatePathSync(paths, {cwd: directory, ...locateOptions});\n\t\tif (found) {\n\t\t\treturn path.resolve(directory, found);\n\t\t}\n\n\t\tif (depth >= maxDepth) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tconst entries = fs.readdirSync(directory, {withFileTypes: true});\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (entry.isDirectory()) {\n\t\t\t\t\tqueue.push({directory: path.join(directory, entry.name), depth: depth + 1});\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t}\n\n\treturn undefined;\n}\n\nexport async function findDown(name, options = {}) {\n\tconst {startDirectory, maxDepth, paths, locateOptions, strategy} = prepareFindDownOptions(name, options);\n\n\treturn strategy === 'depth'\n\t\t? findDownDepthFirst(startDirectory, paths, maxDepth, locateOptions)\n\t\t: findDownBreadthFirst(startDirectory, paths, maxDepth, locateOptions);\n}\n\nexport function findDownSync(name, options = {}) {\n\tconst {startDirectory, maxDepth, paths, locateOptions, strategy} = prepareFindDownOptions(name, options);\n\n\treturn strategy === 'depth'\n\t\t? findDownDepthFirstSync(startDirectory, paths, maxDepth, locateOptions)\n\t\t: findDownBreadthFirstSync(startDirectory, paths, maxDepth, locateOptions);\n}\n\n", "import process from 'node:process';\nimport path from 'node:path';\nimport fs, {promises as fsPromises} from 'node:fs';\nimport {fileURLToPath} from 'node:url';\nimport pLocate from 'p-locate';\n\nconst typeMappings = {\n\tdirectory: 'isDirectory',\n\tfile: 'isFile',\n};\n\nfunction checkType(type) {\n\tif (type === 'both' || Object.hasOwn(typeMappings, type)) {\n\t\treturn;\n\t}\n\n\tthrow new Error(`Invalid type specified: ${type}`);\n}\n\nconst matchType = (type, stat) => type === 'both' ? (stat.isFile() || stat.isDirectory()) : stat[typeMappings[type]]();\n\nconst toPath = urlOrPath => urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n\nexport async function locatePath(\n\tpaths,\n\t{\n\t\tcwd = process.cwd(),\n\t\ttype = 'file',\n\t\tallowSymlinks = true,\n\t\tconcurrency,\n\t\tpreserveOrder,\n\t} = {},\n) {\n\tcheckType(type);\n\tcwd = toPath(cwd);\n\n\tconst statFunction = allowSymlinks ? fsPromises.stat : fsPromises.lstat;\n\n\treturn pLocate(paths, async path_ => {\n\t\ttry {\n\t\t\tconst stat = await statFunction(path.resolve(cwd, path_));\n\t\t\treturn matchType(type, stat);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}, {concurrency, preserveOrder});\n}\n\nexport function locatePathSync(\n\tpaths,\n\t{\n\t\tcwd = process.cwd(),\n\t\ttype = 'file',\n\t\tallowSymlinks = true,\n\t} = {},\n) {\n\tcheckType(type);\n\tcwd = toPath(cwd);\n\n\tconst statFunction = allowSymlinks ? fs.statSync : fs.lstatSync;\n\n\tfor (const path_ of paths) {\n\t\ttry {\n\t\t\tconst stat = statFunction(path.resolve(cwd, path_), {\n\t\t\t\tthrowIfNoEntry: false,\n\t\t\t});\n\n\t\t\tif (!stat) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (matchType(type, stat)) {\n\t\t\t\treturn path_;\n\t\t\t}\n\t\t} catch {}\n\t}\n}\n", "/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nexport default class Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\n\t\t// Clean up tail reference when queue becomes empty\n\t\tif (!this.#head) {\n\t\t\tthis.#tail = undefined;\n\t\t}\n\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n", "import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tif (queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst run = async (fn, resolve, args) => {\n\t\tactiveCount++;\n\n\t\tconst result = (async () => fn(...args))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (fn, resolve, args) => {\n\t\tqueue.enqueue(run.bind(undefined, fn, resolve, args));\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// when the run function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\t\tqueue.dequeue()();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (fn, ...args) => new Promise(resolve => {\n\t\tenqueue(fn, resolve, args);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue: () => {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n", "import pLimit from 'p-limit';\n\nclass EndError extends Error {\n\tconstructor(value) {\n\t\tsuper();\n\t\tthis.value = value;\n\t}\n}\n\n// The input can also be a promise, so we await it.\nconst testElement = async (element, tester) => tester(await element);\n\n// The input can also be a promise, so we `Promise.all()` them both.\nconst finder = async element => {\n\tconst values = await Promise.all(element);\n\tif (values[1] === true) {\n\t\tthrow new EndError(values[0]);\n\t}\n\n\treturn false;\n};\n\nexport default async function pLocate(\n\titerable,\n\ttester,\n\t{\n\t\tconcurrency = Number.POSITIVE_INFINITY,\n\t\tpreserveOrder = true,\n\t} = {},\n) {\n\tconst limit = pLimit(concurrency);\n\n\t// Start all the promises concurrently with optional limit.\n\tconst items = [...iterable].map(element => [element, limit(testElement, element, tester)]);\n\n\t// Check the promises either serially or concurrently.\n\tconst checkLimit = pLimit(preserveOrder ? 1 : Number.POSITIVE_INFINITY);\n\n\ttry {\n\t\tawait Promise.all(items.map(element => checkLimit(finder, element)));\n\t} catch (error) {\n\t\tif (error instanceof EndError) {\n\t\t\treturn error.value;\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n", "import {promisify} from 'node:util';\nimport {execFile as execFileCallback, execFileSync as execFileSyncOriginal} from 'node:child_process';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\n\nconst execFileOriginal = promisify(execFileCallback);\n\nexport function toPath(urlOrPath) {\n\treturn urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n}\n\nexport function rootDirectory(pathInput) {\n\treturn path.parse(toPath(pathInput)).root;\n}\n\nexport function traversePathUp(startPath) {\n\treturn {\n\t\t* [Symbol.iterator]() {\n\t\t\tlet currentPath = path.resolve(toPath(startPath));\n\t\t\tlet previousPath;\n\n\t\t\twhile (previousPath !== currentPath) {\n\t\t\t\tyield currentPath;\n\t\t\t\tpreviousPath = currentPath;\n\t\t\t\tcurrentPath = path.resolve(currentPath, '..');\n\t\t\t}\n\t\t},\n\t};\n}\n\nconst TEN_MEGABYTES_IN_BYTES = 10 * 1024 * 1024;\n\nexport async function execFile(file, arguments_, options = {}) {\n\treturn execFileOriginal(file, arguments_, {\n\t\tmaxBuffer: TEN_MEGABYTES_IN_BYTES,\n\t\t...options,\n\t});\n}\n\nexport function execFileSync(file, arguments_ = [], options = {}) {\n\treturn execFileSyncOriginal(file, arguments_, {\n\t\tmaxBuffer: TEN_MEGABYTES_IN_BYTES,\n\t\tencoding: 'utf8',\n\t\tstdio: 'pipe',\n\t\t...options,\n\t});\n}\n\nexport * from './default.js';\n", "import { expect } from '@playwright/test';\nimport deepEqual from 'fast-deep-equal';\n\nimport { EventSpy } from '../page/event-spy';\n\nexport function toHaveFirstReceivedEventDetail(eventSpy: EventSpy, eventDetail: any) {\n if (eventSpy === null || eventSpy === undefined) {\n return {\n message: () => `expected spy to have received event, but it was not defined`,\n pass: false,\n };\n }\n\n if (typeof (eventSpy as any).then === 'function') {\n return {\n message: () =>\n `expected spy to have received event, but it was not resolved (did you forget an await operator?).`,\n pass: false,\n };\n }\n\n if (eventSpy.eventName === null || eventSpy.eventName === undefined) {\n return {\n message: () => `toHaveReceivedEventDetail did not receive an event spy`,\n pass: false,\n };\n }\n\n if (eventSpy.firstEvent === null || eventSpy.firstEvent === undefined) {\n return {\n message: () => `event \"${eventSpy.eventName}\" was not received`,\n pass: false,\n };\n }\n\n const pass = deepEqual(eventSpy.firstEvent.detail, eventDetail);\n\n expect(eventSpy.lastEvent.detail).toEqual(eventDetail);\n\n return {\n message: () => `expected event \"${eventSpy.eventName}\" detail to ${pass ? 'not ' : ''}equal`,\n pass: pass,\n };\n}\n", "import { expect } from '@playwright/test';\nimport deepEqual from 'fast-deep-equal';\n\nimport { EventSpy } from '../page/event-spy';\n\nexport function toHaveNthReceivedEventDetail(eventSpy: EventSpy, index: number, eventDetail: any) {\n if (eventSpy === null || eventSpy === undefined) {\n return {\n message: () => `expected spy to have received event, but it was not defined`,\n pass: false,\n };\n }\n\n if (typeof (eventSpy as any).then === 'function') {\n return {\n message: () =>\n `expected spy to have received event, but it was not resolved (did you forget an await operator?).`,\n pass: false,\n };\n }\n\n if (eventSpy.eventName === null || eventSpy.eventName === undefined) {\n return {\n message: () => `toHaveReceivedEventDetail did not receive an event spy`,\n pass: false,\n };\n }\n\n if (eventSpy.firstEvent === null || eventSpy.firstEvent === undefined) {\n return {\n message: () => `event \"${eventSpy.eventName}\" was not received`,\n pass: false,\n };\n }\n\n const event = eventSpy.events[index];\n\n if (event === null || event === undefined) {\n return {\n message: () => `event at index ${index} was not received`,\n pass: false,\n };\n }\n\n const pass = deepEqual(event.detail, eventDetail);\n\n expect(event.detail).toEqual(eventDetail);\n\n return {\n message: () => `expected event \"${eventSpy.eventName}\" detail to ${pass ? 'not ' : ''}equal`,\n pass: pass,\n };\n}\n", "import type { EventSpy } from '../page/event-spy';\n\nexport function toHaveReceivedEvent(eventSpy: EventSpy) {\n if (eventSpy === undefined || eventSpy === null) {\n return {\n message: () => `expected spy to have received event, but it was not defined`,\n pass: false,\n };\n }\n if (typeof (eventSpy as any).then === 'function') {\n return {\n message: () =>\n `expected spy to have received event, but it was not resolved (did you forget an await operator?).`,\n pass: false,\n };\n }\n const pass = eventSpy.events.length > 0;\n if (pass) {\n return {\n message: () => `expected to have called ${eventSpy.eventName} event`,\n pass: true,\n };\n }\n return {\n message: () => `expected to have not called ${eventSpy.eventName} event`,\n pass: false,\n };\n}\n", "import { expect } from '@playwright/test';\nimport deepEqual from 'fast-deep-equal';\n\nimport type { EventSpy } from '../page/event-spy';\n\nexport function toHaveReceivedEventDetail(eventSpy: EventSpy, eventDetail: any) {\n if (eventSpy === null || eventSpy === undefined) {\n return {\n message: () => `toHaveReceivedEventDetail event spy is null`,\n pass: false,\n };\n }\n\n if (typeof (eventSpy as any).then === 'function') {\n return {\n message: () =>\n `expected spy to have received event, but it was not resolved (did you forget an await operator?).`,\n pass: false,\n };\n }\n\n if (!eventSpy.eventName) {\n return {\n message: () => `toHaveReceivedEventDetail did not receive an event spy`,\n pass: false,\n };\n }\n\n if (eventSpy.lastEvent === null || eventSpy.lastEvent === undefined) {\n return {\n message: () => `event \"${eventSpy.eventName}\" was not received`,\n pass: false,\n };\n }\n\n const pass = deepEqual(eventSpy.lastEvent.detail, eventDetail);\n\n expect(eventSpy.lastEvent.detail).toEqual(eventDetail);\n\n return {\n message: () => `expected event \"${eventSpy.eventName}\" detail to ${pass ? 'not ' : ''}equal`,\n pass: pass,\n };\n}\n", "import type { EventSpy } from '../page/event-spy';\n\nexport function toHaveReceivedEventTimes(eventSpy: EventSpy, count: number) {\n if (!eventSpy) {\n return {\n message: () => `toHaveReceivedEventTimes event spy is null`,\n pass: false,\n };\n }\n\n if (typeof (eventSpy as any).then === 'function') {\n return {\n message: () =>\n `expected spy to have received event, but it was not resolved (did you forget an await operator?).`,\n pass: false,\n };\n }\n\n if (!eventSpy.eventName) {\n return {\n message: () => `toHaveReceivedEventTimes did not receive an event spy`,\n pass: false,\n };\n }\n\n const pass = eventSpy.length === count;\n\n return {\n message: () =>\n `expected event \"${eventSpy.eventName}\" to have been called ${count} times, but it was called ${eventSpy.events.length} times`,\n pass: pass,\n };\n}\n", "import { toHaveFirstReceivedEventDetail } from './to-have-first-received-event-detail';\nimport { toHaveNthReceivedEventDetail } from './to-have-nth-received-event-detail';\nimport { toHaveReceivedEvent } from './to-have-received-event';\nimport { toHaveReceivedEventDetail } from './to-have-received-event-detail';\nimport { toHaveReceivedEventTimes } from './to-have-received-event-times';\n\nexport const matchers = {\n toHaveReceivedEvent,\n toHaveReceivedEventDetail,\n toHaveReceivedEventTimes,\n toHaveFirstReceivedEventDetail,\n toHaveNthReceivedEventDetail,\n};\n", "/* eslint-disable jsdoc/require-param */\n/* eslint-disable jsdoc/require-returns */\nimport type { Page } from '@playwright/test';\n\nimport type { E2EPageOptions } from '../../playwright-declarations';\n\n/**\n * This is an extended version of Playwright's `page.goto` method. In addition to performing\n * the normal `page.goto` work, this code also automatically waits for the Stencil components\n * to be hydrated before proceeding with the test.\n */\nexport const goto = async (page: Page, url: string, originalFn: typeof page.goto, options?: E2EPageOptions) => {\n const result = await Promise.all([\n page.waitForFunction(() => (window as any).testAppLoaded === true, {\n // This timeout was taken from the existing Playwright adapter in the Ionic Framework repository.\n // They tested this number and found it to be a reliable timeout for the Stencil components to be hydrated.\n timeout: 4750,\n }),\n originalFn(url, options),\n ]);\n\n return result[1];\n};\n", "import type { JSHandle } from '@playwright/test';\n\nimport type { E2EPage } from '../playwright-declarations';\n\n/**\n * The EventSpy class allows developers to listen for a particular event emission and\n * pass/fail the test based on whether or not the event was emitted.\n * Based off https://github.com/ionic-team/stencil/blob/16b8ea4dabb22024872a38bc58ba1dcf1c7cc25b/src/testing/puppeteer/puppeteer-events.ts#L64\n */\nexport class EventSpy {\n /**\n * Keeping track of a cursor ensures that no two spy.next() calls point to the same event.\n */\n private cursor = 0;\n private queuedHandler: (() => void)[] = [];\n public events: CustomEvent[] = [];\n\n constructor(public eventName: string) {}\n\n get length() {\n return this.events.length;\n }\n\n get firstEvent() {\n return this.events[0] ?? null;\n }\n\n get lastEvent() {\n return this.events[this.events.length - 1] ?? null;\n }\n\n public next() {\n const { cursor } = this;\n this.cursor++;\n\n const next = this.events[cursor];\n if (next !== undefined) {\n return Promise.resolve(next);\n } else {\n /**\n * If the event has not already been emitted, then add it to the queuedHandler.\n * When the event is emitted, the push method is called which results in the Promise below being resolved.\n */\n let resolve: () => void;\n const promise = new Promise<void>((r) => (resolve = r));\n // @ts-ignore\n this.queuedHandler.push(resolve);\n\n return promise.then(() => this.events[cursor]);\n }\n }\n\n public push(ev: CustomEvent) {\n this.events.push(ev);\n const next = this.queuedHandler.shift();\n if (next) {\n next();\n }\n }\n}\n\n/**\n * For internal use only.\n *\n * Initializes information required to spy on events.\n * The stencilOnEvent function is called in the context of the current page.\n * This lets us respond to an event listener created within the page itself.\n *\n * @param page The Playwright test page object.\n */\nexport const initPageEvents = async (page: E2EPage) => {\n page._e2eEventsIds = 0;\n page._e2eEvents = new Map();\n\n await page.exposeFunction('stencilOnEvent', (id: number, ev: any) => {\n const context = page._e2eEvents.get(id);\n if (context) {\n context.callback(ev);\n }\n });\n};\n\n/**\n * For internal use only.\n *\n * Adds a new event listener in the current page context to updates\n * the _e2eEvents map when an event is fired.\n *\n * @param page The Playwright test page object.\n * @param elmHandle A {@link JSHandle} representing the element to listen for events on.\n * @param eventName The event name to listen for.\n * @param callback The callback to execute when the event is fired.\n */\nexport const addE2EListener = async (\n page: E2EPage,\n elmHandle: JSHandle,\n eventName: string,\n callback: (ev: any) => void,\n) => {\n const id = page._e2eEventsIds++;\n page._e2eEvents.set(id, {\n eventName,\n callback,\n });\n\n await elmHandle.evaluate(\n (elm, [eventName, id]) => {\n (window as any).stencilSerializeEventTarget = (target: any) => {\n // BROWSER CONTEXT\n if (!target) {\n return null;\n }\n if (target === window) {\n return { serializedWindow: true };\n }\n if (target === document) {\n return { serializedDocument: true };\n }\n if (target.nodeType != null) {\n const serializedElement: any = {\n serializedElement: true,\n nodeName: target.nodeName,\n nodeValue: target.nodeValue,\n nodeType: target.nodeType,\n tagName: target.tagName,\n className: target.className,\n id: target.id,\n };\n return serializedElement;\n }\n return null;\n };\n\n (window as any).serializeStencilEvent = (orgEv: CustomEvent) => {\n const serializedEvent = {\n bubbles: orgEv.bubbles,\n cancelBubble: orgEv.cancelBubble,\n cancelable: orgEv.cancelable,\n composed: orgEv.composed,\n currentTarget: (window as any).stencilSerializeEventTarget(orgEv.currentTarget),\n defaultPrevented: orgEv.defaultPrevented,\n detail: orgEv.detail,\n eventPhase: orgEv.eventPhase,\n isTrusted: orgEv.isTrusted,\n returnValue: orgEv.returnValue,\n srcElement: (window as any).stencilSerializeEventTarget(orgEv.srcElement),\n target: (window as any).stencilSerializeEventTarget(orgEv.target),\n timeStamp: orgEv.timeStamp,\n type: orgEv.type,\n isSerializedEvent: true,\n };\n return serializedEvent;\n };\n\n elm.addEventListener(eventName as string, (ev: Event) => {\n (window as any).stencilOnEvent(id, (window as any).serializeStencilEvent(ev));\n });\n },\n [eventName, id],\n );\n};\n", "import type { Locator } from '@playwright/test';\n\nimport type { E2EPage } from '../../playwright-declarations';\nimport { addE2EListener, EventSpy } from '../event-spy';\n\nexport type LocatorOptions = {\n hasText?: string | RegExp;\n has?: Locator;\n};\n\nexport interface E2ELocator extends Locator {\n /**\n * Creates a new EventSpy and listens on the element for an event.\n * The test will timeout if the event never fires.\n *\n * Usage:\n * const input = page.locator('ion-input');\n * const ionChange = await locator.spyOnEvent('ionChange');\n * ...\n * await ionChange.next();\n */\n spyOnEvent: (eventName: string) => Promise<EventSpy>;\n}\n\nexport const locator = (\n page: E2EPage,\n originalFn: typeof page.locator,\n selector: string,\n options?: LocatorOptions,\n): E2ELocator => {\n const locator = originalFn(selector, options) as E2ELocator;\n locator.spyOnEvent = async (eventName: string) => {\n const spy = new EventSpy(eventName);\n const handle = await locator.evaluateHandle((node: HTMLElement) => node);\n await addE2EListener(page, handle, eventName, (ev: CustomEvent) => spy.push(ev));\n return spy;\n };\n return locator;\n};\n", "import type { Page, TestInfo } from '@playwright/test';\n\nimport type { E2EPageOptions } from '../../playwright-declarations';\n\n/**\n * Overwrites the default Playwright page.setContent method.\n *\n * Navigates to a blank page, sets the content, and waits for the\n * Stencil components to be hydrated before proceeding with the test.\n *\n * @param page The Playwright page object.\n * @param html The HTML content to set on the page.\n * @param testInfo Test information from the test bed. Used to access base URL.\n * @param options The test config associated with the current test run.\n */\nexport const setContent = async (page: Page, html: string, testInfo: TestInfo, options?: E2EPageOptions) => {\n if (page.isClosed()) {\n throw new Error('setContent unavailable: page is already closed');\n }\n\n const baseUrl = testInfo.project.use.baseURL;\n const baseEntryPath = process.env.STENCIL_ENTRY_PATH;\n\n const output = `\n <!DOCTYPE html>\n <html lang=\"en\">\n <head>\n <title>Stencil Playwright Test</title>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0\" />\n <script src=\"${baseEntryPath}.js\" nomodule></script>\n <script type=\"module\" src=\"${baseEntryPath}.esm.js\"></script>\n </head>\n <body>\n ${html}\n </body>\n </html>\n `;\n\n if (baseUrl) {\n await page.route(baseUrl, (route) => {\n if (route.request().url() === `${baseUrl}/`) {\n /**\n * Intercepts the empty page request and returns the\n * HTML content that was passed in.\n */\n route.fulfill({\n status: 200,\n contentType: 'text/html',\n body: output,\n });\n } else {\n // Allow all other requests to pass through\n route.continue();\n }\n });\n\n await page.goto(`${baseUrl}#`, options);\n } else {\n throw new Error('setContent unavailable: no dev server base URL provided');\n }\n};\n", "import type { E2EPage } from '../../playwright-declarations';\nimport { addE2EListener, EventSpy } from '../event-spy';\n\nexport const spyOnEvent = async (page: E2EPage, eventName: string): Promise<EventSpy> => {\n const spy = new EventSpy(eventName);\n\n const handle = await page.evaluateHandle(() => window);\n\n await addE2EListener(page, handle, eventName, (ev: CustomEvent) => spy.push(ev));\n\n return spy;\n};\n", "import type { Page } from '@playwright/test';\nimport type { HostElement } from '@stencil/core/compiler';\n\n/**\n * Waits for a combined threshold of a Stencil web component to be re-hydrated in the next repaint + 100ms.\n * Used for testing changes to a web component that does not modify CSS classes or introduce new DOM nodes.\n *\n * Original source: https://github.com/ionic-team/stencil/blob/main/src/testing/puppeteer/puppeteer-page.ts#L298-L363\n *\n * @param page The Playwright page object.\n * @param timeoutMs The time to wait for the changes to occur.\n */\nexport const waitForChanges = async (page: Page, timeoutMs = 100) => {\n try {\n if (page.isClosed()) {\n /**\n * If the page is already closed, we can skip the long execution of this method\n * and return early.\n */\n return;\n }\n await page.evaluate(() => {\n // BROWSER CONTEXT\n return new Promise<void>((resolve) => {\n // Wait for the next repaint to happen\n requestAnimationFrame(() => {\n const promiseChain: Promise<any>[] = [];\n\n const waitComponentOnReady = (elm: Element | ShadowRoot, promises: Promise<any>[]) => {\n if ('shadowRoot' in elm && elm.shadowRoot instanceof ShadowRoot) {\n waitComponentOnReady(elm.shadowRoot, promises);\n }\n const children = elm.children;\n const len = children.length;\n for (let i = 0; i < len; i++) {\n const childElm = children[i];\n const childStencilElm = childElm as HostElement;\n if (childElm.tagName.includes('-') && typeof childStencilElm.componentOnReady === 'function') {\n /**\n * We are only using the lazy loaded bundle\n * here so we can safely use the\n * componentOnReady method.\n */\n promises.push(childStencilElm.componentOnReady());\n }\n waitComponentOnReady(childElm, promises);\n }\n };\n\n waitComponentOnReady(document.documentElement, promiseChain);\n\n Promise.all(promiseChain)\n .then(() => resolve())\n .catch(() => resolve());\n });\n });\n });\n if (page.isClosed()) {\n return;\n }\n await page.waitForTimeout(timeoutMs);\n } catch (e) {\n console.error(e);\n }\n};\n", "import type {\n PlaywrightTestArgs,\n PlaywrightTestOptions,\n PlaywrightWorkerArgs,\n PlaywrightWorkerOptions,\n} from '@playwright/test';\nimport { test as base } from '@playwright/test';\n\nimport { loadConfigMeta } from './load-config-meta.js';\nimport { initPageEvents } from './page/event-spy';\nimport type { LocatorOptions } from './page/utils';\nimport { goto as goToPage, locator, setContent, spyOnEvent, waitForChanges } from './page/utils';\nimport type { BrowserNameOrCallback, E2EPage, E2EPageOptions, E2ESkip } from './playwright-declarations';\nimport { ProcessConstants } from './process-constants.js';\n\ntype CustomTestArgs = PlaywrightTestArgs &\n PlaywrightTestOptions &\n PlaywrightWorkerArgs &\n PlaywrightWorkerOptions & {\n page: E2EPage;\n };\n\ntype CustomFixtures = {\n page: E2EPage;\n skip: E2ESkip;\n};\n\n/**\n * Extends the base `page` test figure within Playwright.\n * @param page The page to extend.\n * @returns The modified playwright page with extended functionality.\n */\nasync function extendPageFixture(page: E2EPage) {\n // Make sure the Stencil namespace and entry path are set on the process so we can use them in the `setContent` tests.\n // These wouldn't be set if the user didn't setup the Playwright config with the `createConfig()` helper.\n if (!process.env[ProcessConstants.STENCIL_NAMESPACE] || !process.env[ProcessConstants.STENCIL_ENTRY_PATH]) {\n const { stencilNamespace, stencilEntryPath } = await loadConfigMeta();\n\n if (!process.env[ProcessConstants.STENCIL_NAMESPACE]) {\n process.env[ProcessConstants.STENCIL_NAMESPACE] = stencilNamespace;\n }\n if (!process.env[ProcessConstants.STENCIL_ENTRY_PATH]) {\n process.env[ProcessConstants.STENCIL_ENTRY_PATH] = stencilEntryPath;\n }\n }\n\n const originalGoto = page.goto.bind(page);\n const originalLocator = page.locator.bind(page);\n\n await page.addInitScript(() => {\n window.addEventListener('appload', () => {\n (window as any).testAppLoaded = true;\n });\n });\n\n // Overridden Playwright methods\n page.goto = (url: string, options?: E2EPageOptions) => goToPage(page, url, originalGoto, options);\n page.setContent = (html: string, options?: E2EPageOptions) => setContent(page, html, test.info(), options);\n page.locator = (selector: string, options?: LocatorOptions) => locator(page, originalLocator, selector, options);\n\n // Custom adapter methods\n page.waitForChanges = (timeoutMs?: number) => waitForChanges(page, timeoutMs);\n page.spyOnEvent = (eventName: string) => spyOnEvent(page, eventName);\n\n // Custom event behavior\n await initPageEvents(page);\n\n return page;\n}\n\nexport const test = base.extend<CustomFixtures>({\n page: async ({ page }: CustomTestArgs, use: (r: E2EPage) => Promise<void>) => {\n page = await extendPageFixture(page);\n await use(page);\n },\n skip: {\n browser: (\n browserNameOrFunction: BrowserNameOrCallback,\n reason = `The functionality that is being tested is not applicable to this browser.`,\n ) => {\n const browserName = base.info().project.use.browserName!;\n\n if (typeof browserNameOrFunction === 'function') {\n base.skip(browserNameOrFunction(browserName), reason);\n } else {\n base.skip(browserName === browserNameOrFunction, reason);\n }\n },\n mode: (mode: string, reason = `The functionality that is being tested is not applicable to ${mode} mode`) => {\n base.skip(base.info().project.metadata.mode === mode, reason);\n },\n },\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["isMergeableObject", "path", "process", "process", "fileURLToPath", "toPath", "path", "toPath", "merge", "deepEqual", "import_fast_deep_equal", "expect", "deepEqual", "import_fast_deep_equal", "expect", "deepEqual", "eventName", "id", "locator"]
|
|
7
7
|
}
|
|
@@ -4,5 +4,5 @@ type CustomFixtures = {
|
|
|
4
4
|
page: E2EPage;
|
|
5
5
|
skip: E2ESkip;
|
|
6
6
|
};
|
|
7
|
-
export declare const test: import("
|
|
7
|
+
export declare const test: import("playwright/test").TestType<PlaywrightTestArgs & PlaywrightTestOptions & CustomFixtures, PlaywrightWorkerArgs & PlaywrightWorkerOptions>;
|
|
8
8
|
export {};
|
package/package.json
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stencil/playwright",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.2.3-next.0",
|
|
4
4
|
"description": "Testing adapter to use Playwright with Stencil",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
8
14
|
"files": [
|
|
9
15
|
"dist"
|
|
10
16
|
],
|
|
@@ -12,7 +18,7 @@
|
|
|
12
18
|
"build": "npm run build.empty && npm run build.types && npm run build.bundle",
|
|
13
19
|
"build.empty": "rimraf ./dist ./build/build.js",
|
|
14
20
|
"build.types": "tsc --emitDeclarationOnly --outDir ./dist",
|
|
15
|
-
"build.bundle": "
|
|
21
|
+
"build.bundle": "tsx ./build/build.ts",
|
|
16
22
|
"format": "npm run format.base -- --write",
|
|
17
23
|
"format.base": "prettier --cache \"src/**/*.ts\"",
|
|
18
24
|
"format.dry-run": "npm run format.base -- --list-different",
|
|
@@ -44,14 +50,14 @@
|
|
|
44
50
|
"npm": "10.4.0"
|
|
45
51
|
},
|
|
46
52
|
"peerDependencies": {
|
|
47
|
-
"@playwright/test": ">=1.
|
|
48
|
-
"@stencil/core": ">=
|
|
53
|
+
"@playwright/test": ">=1.50.0",
|
|
54
|
+
"@stencil/core": ">=5.0.0-next.0"
|
|
49
55
|
},
|
|
50
56
|
"devDependencies": {
|
|
51
57
|
"@eslint/js": "^9.38.0",
|
|
52
58
|
"@ionic/prettier-config": "^4.0.0",
|
|
53
|
-
"@playwright/test": "^1.
|
|
54
|
-
"@stencil/core": "
|
|
59
|
+
"@playwright/test": "^1.50.0",
|
|
60
|
+
"@stencil/core": "5.0.0-next.0",
|
|
55
61
|
"@types/eslint": "^9.6.1",
|
|
56
62
|
"@types/jest": "^30.0.0",
|
|
57
63
|
"@types/node": "^24.9.2",
|
|
@@ -64,18 +70,24 @@
|
|
|
64
70
|
"eslint-plugin-jsdoc": "^61.1.11",
|
|
65
71
|
"eslint-plugin-simple-import-sort": "^12.1.1",
|
|
66
72
|
"eslint-plugin-unused-imports": "^4.3.0",
|
|
73
|
+
"globals": "^14.0.0",
|
|
67
74
|
"jest": "^30.2.0",
|
|
68
75
|
"prettier": "^3.6.2",
|
|
69
76
|
"rimraf": "^6.0.1",
|
|
70
77
|
"ts-jest": "^29.4.5",
|
|
71
78
|
"ts-node": "^10.9.2",
|
|
79
|
+
"tsx": "^4.21.0",
|
|
72
80
|
"typescript": "^5.9.3",
|
|
73
|
-
"typescript-eslint": "^8.46.2"
|
|
74
|
-
"globals": "^14.0.0"
|
|
81
|
+
"typescript-eslint": "^8.46.2"
|
|
75
82
|
},
|
|
76
83
|
"prettier": "@ionic/prettier-config",
|
|
77
84
|
"dependencies": {
|
|
78
85
|
"deepmerge": "^4.3.1",
|
|
79
86
|
"find-up": "^8.0.0"
|
|
87
|
+
},
|
|
88
|
+
"overrides": {
|
|
89
|
+
"@stencil/cli": {
|
|
90
|
+
"@stencil/core": "5.0.0-next.0"
|
|
91
|
+
}
|
|
80
92
|
}
|
|
81
93
|
}
|