diff --git a/context-protocol.ts b/context-protocol.ts index d201008..6b8873e 100644 --- a/context-protocol.ts +++ b/context-protocol.ts @@ -16,16 +16,15 @@ export type UnknownContext = Context; /** * A helper type which can extract a Context value type from a Context type */ -export type ContextType = T extends Context - ? Y - : never; +export type ContextType = + T extends Context ? Y : never; /** * A function which creates a Context value object */ export function createContext( name: string, - initialValue?: T + initialValue?: T, ): Readonly> { return { name, @@ -39,7 +38,7 @@ export function createContext( */ export type ContextCallback = ( value: ValueType, - unsubscribe?: () => void + unsubscribe?: () => void, ) => void; /** @@ -56,18 +55,24 @@ export class ContextEvent extends Event { public constructor( public readonly context: T, public readonly callback: ContextCallback>, - public readonly subscribe?: boolean + public readonly subscribe?: boolean, ) { super("context-request", { bubbles: true, composed: true }); } } +/** + * A 'context-request' event can be emitted by any element which desires + * a context value to be injected by an external provider. + */ declare global { + interface WindowEventMap { + "context-request": ContextEvent; + } + interface ElementEventMap { + "context-request": ContextEvent; + } interface HTMLElementEventMap { - /** - * A 'context-request' event can be emitted by any element which desires - * a context value to be injected by an external provider. - */ "context-request": ContextEvent; } } diff --git a/index.ts b/index.ts index b4b7a0d..84ae654 100644 --- a/index.ts +++ b/index.ts @@ -49,18 +49,12 @@ export function ProviderMixin>( this.#dataStore.set(key, value()); } - this.addEventListener("context-request", this); + this.addEventListener("context-request", this.#handleContextRequest); } disconnectedCallback(): void { this.#dataStore = new ObservableMap(); - this.removeEventListener("context-request", this); - } - - handleEvent(event: Event) { - if (event.type === "context-request") { - this.#handleContextRequest(event as ContextEvent); - } + this.removeEventListener("context-request", this.#handleContextRequest); } updateContext(name: string, value: unknown) { @@ -68,9 +62,7 @@ export function ProviderMixin>( } // We listen for a bubbled context request event and provide the event with the context requested. - #handleContextRequest( - event: ContextEvent<{ name: string; initialValue?: unknown }>, - ) { + #handleContextRequest(event: ContextEvent) { const { name, initialValue } = event.context; const subscribe = event.subscribe; if (initialValue) { diff --git a/package-lock.json b/package-lock.json index 7bfb7f1..ec8d5d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,12 @@ "version": "0.0.2", "license": "ISC", "devDependencies": { + "@open-wc/dedupe-mixin": "^1.4.0", + "@open-wc/scoped-elements": "^3.0.5", "@open-wc/testing": "^4.0.0", "@types/mocha": "^10.0.6", "@web/dev-server-esbuild": "^1.0.2", + "@web/dev-server-polyfill": "^1.0.4", "@web/test-runner": "^0.18.0", "@web/test-runner-playwright": "^0.11.0", "chai": "^5.1.0", @@ -42,19 +45,233 @@ "node": ">=12.17" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", @@ -64,15 +281,100 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" @@ -455,6 +757,20 @@ "@types/chai": "^4.2.12" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -464,6 +780,25 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -471,9 +806,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", - "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1242,6 +1577,19 @@ "node": ">=18.0.0" } }, + "node_modules/@web/dev-server-polyfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@web/dev-server-polyfill/-/dev-server-polyfill-1.0.4.tgz", + "integrity": "sha512-WV6QoRDNldtEQCV8MeaExY+XR10aobWf2E6xBq1tzpABcnoTlL49q1ywzMzpDw726C7qFPacakv4Bvmizr3R5w==", + "dev": true, + "dependencies": { + "@web/dev-server": "^0.4.0", + "@web/polyfills-loader": "^2.2.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@web/dev-server-rollup": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.6.1.tgz", @@ -1272,6 +1620,36 @@ "node": ">=18.0.0" } }, + "node_modules/@web/polyfills-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@web/polyfills-loader/-/polyfills-loader-2.3.0.tgz", + "integrity": "sha512-71XV+CiS7jtRERM906Ia5p6Y2+B3sZp/oXN+mt3EoB7hNoIk61m5xSuz4uIsYiHwxfLBvpZK38NOb65fSmrLrw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.10", + "@web/parse5-utils": "^2.1.0", + "@webcomponents/scoped-custom-element-registry": "^0.0.9", + "@webcomponents/shadycss": "^1.11.0", + "@webcomponents/webcomponentsjs": "^2.5.0", + "abortcontroller-polyfill": "^1.5.0", + "construct-style-sheets-polyfill": "^3.0.5", + "core-js-bundle": "^3.8.1", + "dynamic-import-polyfill": "^0.1.1", + "es-module-shims": "^1.4.1", + "intersection-observer": "^0.12.0", + "parse5": "^6.0.1", + "regenerator-runtime": "^0.14.0", + "resize-observer-polyfill": "^1.5.1", + "shady-css-scoped-element": "^0.0.2", + "systemjs": "^6.8.1", + "terser": "^5.14.2", + "urlpattern-polyfill": "^6.0.2", + "whatwg-fetch": "^3.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@web/test-runner": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.18.0.tgz", @@ -1411,6 +1789,30 @@ "node": ">=18.0.0" } }, + "node_modules/@webcomponents/scoped-custom-element-registry": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@webcomponents/scoped-custom-element-registry/-/scoped-custom-element-registry-0.0.9.tgz", + "integrity": "sha512-4RVHwN9oIp23mhrxeDbP9/0wvdcrB0d/MFMqIStShIgfzsqXZXf1OdU5kvqjgdMYavQ5Zm8C6BuBcAjzNwAetQ==", + "dev": true + }, + "node_modules/@webcomponents/shadycss": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.11.2.tgz", + "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==", + "dev": true + }, + "node_modules/@webcomponents/webcomponentsjs": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.8.0.tgz", + "integrity": "sha512-loGD63sacRzOzSJgQnB9ZAhaQGkN7wl2Zuw7tsphI5Isa0irijrRo6EnJii/GgjGefIFO8AIO7UivzRhFaEk9w==", + "dev": true + }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", + "dev": true + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -1424,6 +1826,18 @@ "node": ">= 0.6" } }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", @@ -1659,6 +2073,38 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -1692,6 +2138,12 @@ "node": "*" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, "node_modules/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -1757,6 +2209,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001607", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001607.tgz", + "integrity": "sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, "node_modules/chai": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.0.tgz", @@ -2126,6 +2598,18 @@ "node": ">=12.17" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/construct-style-sheets-polyfill": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/construct-style-sheets-polyfill/-/construct-style-sheets-polyfill-3.1.0.tgz", + "integrity": "sha512-HBLKP0chz8BAY6rBdzda11c3wAZeCZ+kIG4weVC2NM3AXzxx09nhe8t0SQNdloAvg5GLuHwq/0SPOOSPvtCcKw==", + "dev": true + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -2166,6 +2650,17 @@ "node": ">= 0.8" } }, + "node_modules/core-js-bundle": { + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.36.1.tgz", + "integrity": "sha512-K2RZDsLbrKk4b4OdTLd8+M/+9FQ84OtMy9yYqSPM8nai8T/RqkOgaR5fiXPPNew3skeJIggwy1G/ySOg912Nig==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", @@ -2344,12 +2839,24 @@ "node": ">=8" } }, + "node_modules/dynamic-import-polyfill": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dynamic-import-polyfill/-/dynamic-import-polyfill-0.1.1.tgz", + "integrity": "sha512-m953zv0w5oDagTItWm6Auhmk/pY7EiejaqiVbnzSS3HIjh1FCUeK7WzuaVtWPNs58A+/xpIE+/dVk6pKsrua8g==", + "dev": true + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, + "node_modules/electron-to-chromium": { + "version": "1.4.729", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz", + "integrity": "sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA==", + "dev": true + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2407,6 +2914,12 @@ "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, + "node_modules/es-module-shims": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.9.0.tgz", + "integrity": "sha512-R4lwSjeELpw1Bzu2a7k3nqpxyPMfiXRq7ewqFhydV/zcYgt4b4VZzNonZu/SotJyb4ibEjuqN/OIM4wQCAGmwA==", + "dev": true + }, "node_modules/esbuild": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", @@ -2722,6 +3235,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2829,6 +3351,15 @@ "node": ">= 6" } }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -3084,6 +3615,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/intersection-observer": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.12.2.tgz", + "integrity": "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==", + "dev": true + }, "node_modules/ip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", @@ -3355,6 +3892,30 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -4106,6 +4667,12 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4308,6 +4875,12 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4609,6 +5182,12 @@ "node": ">=8.10.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4618,6 +5197,12 @@ "node": ">=0.10.0" } }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -4856,6 +5441,12 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "node_modules/shady-css-scoped-element": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/shady-css-scoped-element/-/shady-css-scoped-element-0.0.2.tgz", + "integrity": "sha512-Dqfl70x6JiwYDujd33ZTbtCK0t52E7+H2swdWQNSTzfsolSa6LJHnTpN4T9OpJJEq4bxuzHRLFO9RBcy/UfrMQ==", + "dev": true + }, "node_modules/side-channel": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", @@ -4986,6 +5577,25 @@ "node": ">= 8" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -5085,6 +5695,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/systemjs": { + "version": "6.14.3", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.14.3.tgz", + "integrity": "sha512-hQv45irdhXudAOr8r6SVSpJSGtogdGZUbJBRKCE5nsIS7tsxxvnIHqT4IOPWj+P+HcSzeWzHlGCGpmhPDIKe+w==", + "dev": true + }, "node_modules/table-layout": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", @@ -5146,12 +5762,39 @@ "streamx": "^2.15.0" } }, + "node_modules/terser": { + "version": "5.30.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", + "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5304,6 +5947,45 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-6.0.2.tgz", + "integrity": "sha512-5vZjFlH9ofROmuWmXM9yj2wljYKgWstGwe8YTyiqM7hVum/g9LyCizPZtb3UqsuppVwety9QJmfc42VggLpTgg==", + "dev": true, + "dependencies": { + "braces": "^3.0.2" + } + }, "node_modules/v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -5336,6 +6018,12 @@ "node": ">=12" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "dev": true + }, "node_modules/whatwg-url": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", diff --git a/package.json b/package.json index 2cff33b..609b2f4 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,12 @@ "author": "", "license": "ISC", "devDependencies": { + "@open-wc/dedupe-mixin": "^1.4.0", + "@open-wc/scoped-elements": "^3.0.5", "@open-wc/testing": "^4.0.0", "@types/mocha": "^10.0.6", "@web/dev-server-esbuild": "^1.0.2", + "@web/dev-server-polyfill": "^1.0.4", "@web/test-runner": "^0.18.0", "@web/test-runner-playwright": "^0.11.0", "chai": "^5.1.0", diff --git a/test/mixins/parent-html-child-html/dedupe-mixin.test.ts b/test/mixins/parent-html-child-html/dedupe-mixin.test.ts new file mode 100644 index 0000000..a13b3e5 --- /dev/null +++ b/test/mixins/parent-html-child-html/dedupe-mixin.test.ts @@ -0,0 +1,32 @@ +import { expect } from "chai"; +import { fixture, waitUntil } from "@open-wc/testing"; +import { ScopedElementsMixin } from "@open-wc/scoped-elements/html-element.js"; +import { dedupeMixin } from "@open-wc/dedupe-mixin"; + +import { ProviderElement } from "../../fixture/html/provider-element.js"; +import { ConsumerElement } from "../../fixture/html/consumer-element.js"; + +const ScopedElementsMixinDeduped = dedupeMixin(ScopedElementsMixin); + +it("DedupeMixin", async () => { + window.customElements.define( + "server-state", + class extends ScopedElementsMixinDeduped(ProviderElement) {}, + ); + window.customElements.define( + "hit-count", + class extends ScopedElementsMixinDeduped(ConsumerElement) {}, + ); + + const provider = await fixture( + `Loading...`, + ); + const el = provider?.querySelector("hit-count"); + + await waitUntil(() => el?.textContent?.trim() !== "Loading..."); + expect(el?.textContent).to.equal("9001 hits!"); + + provider?.updateContext?.("hit-count", 9002); + await waitUntil(() => el?.textContent?.trim() !== "9001 hits!"); + expect(el?.textContent).to.equal("9002 hits!"); +}); diff --git a/test/mixins/parent-html-child-html/scoped-elements-mixin.test.ts b/test/mixins/parent-html-child-html/scoped-elements-mixin.test.ts new file mode 100644 index 0000000..856bf8e --- /dev/null +++ b/test/mixins/parent-html-child-html/scoped-elements-mixin.test.ts @@ -0,0 +1,27 @@ +import { expect } from "chai"; +import { fixture, waitUntil } from "@open-wc/testing"; +import { ScopedElementsMixin } from "@open-wc/scoped-elements/html-element.js"; +import { ProviderElement } from "../../fixture/html/provider-element.js"; +import { ConsumerElement } from "../../fixture/html/consumer-element.js"; + +it("ScopedElementsMixin", async () => { + window.customElements.define( + "server-state", + class extends ScopedElementsMixin(ProviderElement) {}, + ); + window.customElements.define( + "hit-count", + class extends ScopedElementsMixin(ConsumerElement) {}, + ); + const provider = await fixture( + `Loading...`, + ); + const el = provider?.querySelector("hit-count"); + + await waitUntil(() => el?.textContent?.trim() !== "Loading..."); + expect(el?.textContent).to.equal("9001 hits!"); + + provider?.updateContext?.("hit-count", 9002); + await waitUntil(() => el?.textContent?.trim() !== "9001 hits!"); + expect(el?.textContent).to.equal("9002 hits!"); +}); diff --git a/test/mixins/parent-html-child-lit/dedupe-mixin.test.ts b/test/mixins/parent-html-child-lit/dedupe-mixin.test.ts new file mode 100644 index 0000000..e736593 --- /dev/null +++ b/test/mixins/parent-html-child-lit/dedupe-mixin.test.ts @@ -0,0 +1,33 @@ +import { expect } from "chai"; +import { fixture, waitUntil } from "@open-wc/testing"; +import { ScopedElementsMixin as HTMLScopedElementsMixin } from "@open-wc/scoped-elements/html-element.js"; +import { ScopedElementsMixin as LitScopedElementsMixin } from "@open-wc/scoped-elements/lit-element.js"; +import { dedupeMixin } from "@open-wc/dedupe-mixin"; + +import { ProviderElement } from "../../fixture/html/provider-element.js"; +import { ConsumerElement } from "../../fixture/lit/consumer-element.js"; + +const HTMLScopedElementsMixinDeduped = dedupeMixin(HTMLScopedElementsMixin); +const LitScopedElementsMixinDeduped = dedupeMixin(LitScopedElementsMixin); + +it("DedupeMixin", async () => { + window.customElements.define( + "server-state", + class extends HTMLScopedElementsMixinDeduped(ProviderElement) {}, + ); + window.customElements.define( + "hit-count", + class extends LitScopedElementsMixinDeduped(ConsumerElement) {}, + ); + const provider = await fixture( + `Loading...`, + ); + const el = provider?.querySelector("hit-count"); + + await waitUntil(() => el?.shadowRoot?.textContent?.trim() !== "Loading..."); + expect(el?.shadowRoot?.textContent).to.equal("9001 hits!"); + + provider?.updateContext?.("hit-count", 9002); + await waitUntil(() => el?.shadowRoot?.textContent?.trim() !== "9001 hits!"); + expect(el?.shadowRoot?.textContent).to.equal("9002 hits!"); +}); diff --git a/test/mixins/parent-html-child-lit/scoped-elements-mixin.test.ts b/test/mixins/parent-html-child-lit/scoped-elements-mixin.test.ts new file mode 100644 index 0000000..8e3633e --- /dev/null +++ b/test/mixins/parent-html-child-lit/scoped-elements-mixin.test.ts @@ -0,0 +1,66 @@ +import { LitElement, html } from "lit"; +import { expect } from "chai"; +import { fixture, waitUntil } from "@open-wc/testing"; +import { ScopedElementsMixin as HTMLScopedElementsMixin } from "@open-wc/scoped-elements/html-element.js"; +import { ScopedElementsMixin as LitScopedElementsMixin } from "@open-wc/scoped-elements/lit-element.js"; +import { ProviderMixin, ConsumerMixin } from "../../../index.js"; + +class ProviderElement extends HTMLScopedElementsMixin( + ProviderMixin(HTMLElement), +) { + contexts = { + "hit-count": () => { + return 9001; + }, + }; +} + +class ConsumerElement extends LitScopedElementsMixin( + ConsumerMixin(LitElement), +) { + static get properties() { + return { + hitCount: { type: String }, + }; + } + + contexts = { + "hit-count": (count: number) => { + // @ts-expect-error + this.hitCount = `${count} hits!`; + }, + }; + + constructor() { + super(); + // @ts-expect-error + this.hitCount = "Loading..."; + } + + render() { + // @ts-expect-error + return html`${this.hitCount}`; + } +} + +it("ScopedElementsMixin", async () => { + window.customElements.define( + "server-state", + HTMLScopedElementsMixin(ProviderElement), + ); + window.customElements.define( + "hit-count", + LitScopedElementsMixin(ConsumerElement), + ); + const provider = await fixture( + `Loading...`, + ); + const el = provider?.querySelector("hit-count"); + + await waitUntil(() => el?.shadowRoot?.textContent?.trim() !== "Loading..."); + expect(el?.shadowRoot?.textContent).to.equal("9001 hits!"); + + provider?.updateContext?.("hit-count", 9002); + await waitUntil(() => el?.shadowRoot?.textContent?.trim() !== "9001 hits!"); + expect(el?.shadowRoot?.textContent).to.equal("9002 hits!"); +}); diff --git a/test/mixins/parent-lit-child-html/dedupe-mixin.test.ts b/test/mixins/parent-lit-child-html/dedupe-mixin.test.ts new file mode 100644 index 0000000..a13b3e5 --- /dev/null +++ b/test/mixins/parent-lit-child-html/dedupe-mixin.test.ts @@ -0,0 +1,32 @@ +import { expect } from "chai"; +import { fixture, waitUntil } from "@open-wc/testing"; +import { ScopedElementsMixin } from "@open-wc/scoped-elements/html-element.js"; +import { dedupeMixin } from "@open-wc/dedupe-mixin"; + +import { ProviderElement } from "../../fixture/html/provider-element.js"; +import { ConsumerElement } from "../../fixture/html/consumer-element.js"; + +const ScopedElementsMixinDeduped = dedupeMixin(ScopedElementsMixin); + +it("DedupeMixin", async () => { + window.customElements.define( + "server-state", + class extends ScopedElementsMixinDeduped(ProviderElement) {}, + ); + window.customElements.define( + "hit-count", + class extends ScopedElementsMixinDeduped(ConsumerElement) {}, + ); + + const provider = await fixture( + `Loading...`, + ); + const el = provider?.querySelector("hit-count"); + + await waitUntil(() => el?.textContent?.trim() !== "Loading..."); + expect(el?.textContent).to.equal("9001 hits!"); + + provider?.updateContext?.("hit-count", 9002); + await waitUntil(() => el?.textContent?.trim() !== "9001 hits!"); + expect(el?.textContent).to.equal("9002 hits!"); +}); diff --git a/test/mixins/parent-lit-child-html/scoped-elements-mixin.test.ts b/test/mixins/parent-lit-child-html/scoped-elements-mixin.test.ts new file mode 100644 index 0000000..c4cacf7 --- /dev/null +++ b/test/mixins/parent-lit-child-html/scoped-elements-mixin.test.ts @@ -0,0 +1,28 @@ +import { expect } from "chai"; +import { fixture, waitUntil } from "@open-wc/testing"; +import { ScopedElementsMixin as LitScopedElementsMixin } from "@open-wc/scoped-elements/lit-element.js"; +import { ScopedElementsMixin as HTMLScopedElementsMixin } from "@open-wc/scoped-elements/html-element.js"; +import { ProviderElement } from "../../fixture/lit/provider-element.js"; +import { ConsumerElement } from "../../fixture/html/consumer-element.js"; + +it("ScopedElementsMixin", async () => { + window.customElements.define( + "server-state", + class extends LitScopedElementsMixin(ProviderElement) {}, + ); + window.customElements.define( + "hit-count", + class extends HTMLScopedElementsMixin(ConsumerElement) {}, + ); + const provider = await fixture( + `Loading...`, + ); + const el = provider?.querySelector("hit-count"); + + await waitUntil(() => el?.textContent?.trim() !== "Loading..."); + expect(el?.textContent).to.equal("9001 hits!"); + + provider?.updateContext?.("hit-count", 9002); + await waitUntil(() => el?.textContent?.trim() !== "9001 hits!"); + expect(el?.textContent).to.equal("9002 hits!"); +}); diff --git a/test/mixins/parent-lit-child-lit/dedupe-mixin.test.ts b/test/mixins/parent-lit-child-lit/dedupe-mixin.test.ts new file mode 100644 index 0000000..e9b7346 --- /dev/null +++ b/test/mixins/parent-lit-child-lit/dedupe-mixin.test.ts @@ -0,0 +1,32 @@ +import { expect } from "chai"; +import { fixture, waitUntil } from "@open-wc/testing"; +import { ScopedElementsMixin } from "@open-wc/scoped-elements/lit-element.js"; +import { dedupeMixin } from "@open-wc/dedupe-mixin"; + +import { ProviderElement } from "../../fixture/lit/provider-element.js"; +import { ConsumerElement } from "../../fixture/lit/consumer-element.js"; + +const ScopedElementsMixinDeduped = dedupeMixin(ScopedElementsMixin); + +it("DedupeMixin", async () => { + window.customElements.define( + "server-state", + class extends ScopedElementsMixinDeduped(ProviderElement) {}, + ); + window.customElements.define( + "hit-count", + class extends ScopedElementsMixinDeduped(ConsumerElement) {}, + ); + + const provider = await fixture( + `Loading...`, + ); + const el = provider?.querySelector("hit-count"); + + await waitUntil(() => el?.shadowRoot?.textContent?.trim() !== "Loading..."); + expect(el?.shadowRoot?.textContent).to.equal("9001 hits!"); + + provider?.updateContext?.("hit-count", 9002); + await waitUntil(() => el?.shadowRoot?.textContent?.trim() !== "9001 hits!"); + expect(el?.shadowRoot?.textContent).to.equal("9002 hits!"); +}); diff --git a/test/mixins/parent-lit-child-lit/scoped-elements-mixin.test.ts b/test/mixins/parent-lit-child-lit/scoped-elements-mixin.test.ts new file mode 100644 index 0000000..ec76f5a --- /dev/null +++ b/test/mixins/parent-lit-child-lit/scoped-elements-mixin.test.ts @@ -0,0 +1,27 @@ +import { expect } from "chai"; +import { fixture, waitUntil } from "@open-wc/testing"; +import { ScopedElementsMixin } from "@open-wc/scoped-elements/lit-element.js"; +import { ProviderElement } from "../../fixture/lit/provider-element.js"; +import { ConsumerElement } from "../../fixture/lit/consumer-element.js"; + +it("ScopedElementsMixin", async () => { + window.customElements.define( + "server-state", + class extends ScopedElementsMixin(ProviderElement) {}, + ); + window.customElements.define( + "hit-count", + class extends ScopedElementsMixin(ConsumerElement) {}, + ); + const provider = await fixture( + `Loading...`, + ); + const el = provider?.querySelector("hit-count"); + + await waitUntil(() => el?.shadowRoot?.textContent?.trim() !== "Loading..."); + expect(el?.shadowRoot?.textContent).to.equal("9001 hits!"); + + provider?.updateContext?.("hit-count", 9002); + await waitUntil(() => el?.shadowRoot?.textContent?.trim() !== "9001 hits!"); + expect(el?.shadowRoot?.textContent).to.equal("9002 hits!"); +}); diff --git a/web-test-runner.config.js b/web-test-runner.config.js index 2e821d3..1cfe888 100644 --- a/web-test-runner.config.js +++ b/web-test-runner.config.js @@ -1,10 +1,16 @@ +import { polyfill } from "@web/dev-server-polyfill"; import { playwrightLauncher } from "@web/test-runner-playwright"; import { esbuildPlugin } from "@web/dev-server-esbuild"; export default { files: ["test/**/*.test.{js,ts}"], nodeResolve: true, - plugins: [esbuildPlugin({ ts: true })], + plugins: [ + esbuildPlugin({ ts: true }), + polyfill({ + scopedCustomElementRegistry: true, + }), + ], filterBrowserLogs(log) { return ( log.args[0] !==