diff --git a/packages/player/package.json b/packages/player/package.json index 4b906597..882117e8 100644 --- a/packages/player/package.json +++ b/packages/player/package.json @@ -68,7 +68,6 @@ "bowser": "^2.11.0", "cypress": "^13.6.3", "esbuild": "^0.19.0", - "gh-pages": "^5.0.0", "idb-keyval": "^6.2.1", "js-levenshtein": "^1.1.6", "mux.js": "^6.2.0", diff --git a/packages/player/src/api/event/device-change.test.ts b/packages/player/src/api/event/device-change.test.ts index 531a859f..59ac6a9b 100644 --- a/packages/player/src/api/event/device-change.test.ts +++ b/packages/player/src/api/event/device-change.test.ts @@ -2,16 +2,13 @@ import { expect } from '@esm-bundle/chai'; import * as Player from '../../index'; import { OutputDevice } from '../../internal/output-devices'; -import { trueTime } from '../../internal/true-time'; import { credentialsProvider } from '../../test-helpers'; import { deviceChange } from './device-change'; -await trueTime.synchronize(); +Player.setCredentialsProvider(credentialsProvider); beforeEach(async () => { - Player.setCredentialsProvider(credentialsProvider); - await Player.load( { productId: '141120674', diff --git a/packages/player/src/event-bus.test.ts b/packages/player/src/event-bus.test.ts index 36ef12ff..fcf18dd8 100644 --- a/packages/player/src/event-bus.test.ts +++ b/packages/player/src/event-bus.test.ts @@ -2,16 +2,13 @@ import { expect } from '@esm-bundle/chai'; import { events } from './event-bus'; import { PlayerError } from './internal/index'; -import { trueTime } from './internal/true-time'; import { credentialsProvider, waitForEvent } from './test-helpers'; import * as Player from './index'; -describe('eventBus', () => { - beforeEach(async () => { - await trueTime.synchronize(); - }); +Player.setCredentialsProvider(credentialsProvider); +describe('eventBus', () => { it('playback engine sends events through the bus', async () => { const mediaProductTransitionEvents = []; @@ -19,8 +16,6 @@ describe('eventBus', () => { mediaProductTransitionEvents.push(e), ); - Player.setCredentialsProvider(credentialsProvider); - await Player.load( { productId: '141120674', diff --git a/packages/player/src/index.test.ts b/packages/player/src/index.test.ts index a0eb6945..6f12faf5 100644 --- a/packages/player/src/index.test.ts +++ b/packages/player/src/index.test.ts @@ -1,12 +1,11 @@ import { expect } from '@esm-bundle/chai'; import * as Config from './config'; -import { trueTime } from './internal/true-time'; import { credentialsProvider, mockNativePlayer } from './test-helpers'; import * as Player from './index'; -await trueTime.synchronize(); +Player.setCredentialsProvider(credentialsProvider); describe('bootstrap', () => { it('enables output devices if options.outputDevices is true', () => { @@ -35,7 +34,7 @@ describe('getMediaElement', () => { ], }); - Player.setCredentialsProvider(credentialsProvider); + Player.setStreamingWifiAudioQuality('LOW'); await Player.load( { @@ -46,12 +45,14 @@ describe('getMediaElement', () => { }, 0, ); + const mediaElement = Player.getMediaElement(); expect(mediaElement).to.be.instanceOf(HTMLMediaElement); }); - it('returns the mediaElement value on browser player', async () => { + /* To enalbe this test we need another test user with HTMLMediaElement compatible streaming configuration (MP3 Preview?). */ + it.skip('returns the mediaElement value on browser player', async () => { Player.bootstrap({ outputDevices: false, players: [ @@ -63,6 +64,8 @@ describe('getMediaElement', () => { ], }); + Player.setStreamingWifiAudioQuality('LOW'); + await Player.load( { productId: '141120674', @@ -92,16 +95,6 @@ describe('getMediaElement', () => { ], }); - await Player.load( - { - productId: '141120674', - productType: 'track', - sourceId: 'tidal-player-tests', - sourceType: 'tidal-player-tests', - }, - 0, - ); - const mediaElement = Player.getMediaElement(); expect(mediaElement).to.equal(null); diff --git a/packages/player/src/index.ts b/packages/player/src/index.ts index 1073b3d8..01e5127d 100644 --- a/packages/player/src/index.ts +++ b/packages/player/src/index.ts @@ -45,6 +45,8 @@ export function getMediaElement(): HTMLMediaElement | null { * @param {Options} options */ export function bootstrap(options: Options) { + playerState.activePlayer = undefined; + if (options.outputDevices === true) { Config.update({ outputDevicesEnabled: true }); } diff --git a/packages/player/src/internal/beacon/index.test.ts b/packages/player/src/internal/beacon/index.test.ts index aeeb6e59..ba0d0232 100644 --- a/packages/player/src/internal/beacon/index.test.ts +++ b/packages/player/src/internal/beacon/index.test.ts @@ -1,19 +1,15 @@ import { expect } from '@esm-bundle/chai'; import * as sinon from 'sinon'; -import { setCredentialsProvider } from '../../api/index'; +import * as Player from '../../index'; import { credentialsProvider } from '../../test-helpers'; import type { StreamingSessionStart } from '../event-tracking/streaming-metrics/streaming-session-start'; -import { trueTime } from '../true-time'; import { commit } from './index'; -describe('commit', () => { - beforeEach(async () => { - await trueTime.synchronize(); - setCredentialsProvider(credentialsProvider); - }); +Player.setCredentialsProvider(credentialsProvider); +describe('commit', () => { const worker = sinon.createStubInstance(Worker); const mockedPromisedEvent = Promise.resolve({ diff --git a/packages/player/src/internal/handlers/get-asset-position.test.ts b/packages/player/src/internal/handlers/get-asset-position.test.ts index 87f646b6..acb4474b 100644 --- a/packages/player/src/internal/handlers/get-asset-position.test.ts +++ b/packages/player/src/internal/handlers/get-asset-position.test.ts @@ -1,16 +1,11 @@ import { expect } from '@esm-bundle/chai'; import * as Player from '../../index'; -import { credentialsProvider, waitFor } from '../../test-helpers'; -import { trueTime } from '../true-time'; +import { waitFor } from '../../test-helpers'; import { getAssetPosition } from './get-asset-position'; describe('getAssetPosition', () => { - beforeEach(async () => { - await trueTime.synchronize(); - }); - it('returns 0 if there is no active player', () => { const playerPosition = getAssetPosition(); @@ -18,8 +13,6 @@ describe('getAssetPosition', () => { }); it('return currentTime if there is a player', async () => { - Player.setCredentialsProvider(credentialsProvider); - await Player.load( { productId: '141120674', diff --git a/packages/player/src/internal/handlers/get-media-product.test.ts b/packages/player/src/internal/handlers/get-media-product.test.ts index 55d8fb2a..afed6289 100644 --- a/packages/player/src/internal/handlers/get-media-product.test.ts +++ b/packages/player/src/internal/handlers/get-media-product.test.ts @@ -1,14 +1,12 @@ import { expect } from '@esm-bundle/chai'; import * as Player from '../../index'; -import { trueTime } from '../../internal/true-time'; -import { credentialsProvider, waitFor } from '../../test-helpers'; +import { waitFor } from '../../test-helpers'; import { getMediaProduct } from './get-media-product'; describe('getMediaProduct', () => { beforeEach(async () => { - await trueTime.synchronize(); await Player.reset(); }); @@ -22,8 +20,6 @@ describe('getMediaProduct', () => { this.timeout(10000); const test = async () => { - Player.setCredentialsProvider(credentialsProvider); - console.debug('loading'); await Player.load( { diff --git a/packages/player/src/internal/handlers/get-output-devices.test.ts b/packages/player/src/internal/handlers/get-output-devices.test.ts index c4c44f4b..578b05d6 100644 --- a/packages/player/src/internal/handlers/get-output-devices.test.ts +++ b/packages/player/src/internal/handlers/get-output-devices.test.ts @@ -3,16 +3,13 @@ import { expect } from '@esm-bundle/chai'; import * as Player from '../../index'; import { outputDevices } from '../../internal/output-devices'; import { credentialsProvider } from '../../test-helpers'; -import { trueTime } from '../true-time'; import { getOutputDevices } from './get-output-devices'; +Player.setCredentialsProvider(credentialsProvider); + describe('getOutputDevices', () => { beforeEach(async () => { - await trueTime.synchronize(); - - Player.setCredentialsProvider(credentialsProvider); - // Output devices is reported by the player, thus need one to await Player.load( { diff --git a/packages/player/src/internal/handlers/get-playback-context.test.ts b/packages/player/src/internal/handlers/get-playback-context.test.ts index 2788391b..bccb7ece 100644 --- a/packages/player/src/internal/handlers/get-playback-context.test.ts +++ b/packages/player/src/internal/handlers/get-playback-context.test.ts @@ -1,16 +1,11 @@ import { expect } from '@esm-bundle/chai'; import * as Player from '../../index'; -import { credentialsProvider, waitFor } from '../../test-helpers'; -import { trueTime } from '../true-time'; +import { waitFor } from '../../test-helpers'; import { getPlaybackContext } from './get-playback-context'; describe('getPlaybackContext', () => { - beforeEach(async () => { - await trueTime.synchronize(); - }); - it('returns undefined if there is no active player', () => { const activePlaybackContext = getPlaybackContext(); @@ -18,10 +13,8 @@ describe('getPlaybackContext', () => { }); it('returns the playback context', async () => { - Player.setCredentialsProvider(credentialsProvider); Player.setStreamingWifiAudioQuality('LOW'); - console.debug('load'); await Player.load( { productId: '141120674', @@ -32,10 +25,8 @@ describe('getPlaybackContext', () => { 0, ); - console.debug('play'); await Player.play(); - console.debug('waitFor 2s'); await waitFor(2000); const activePlaybackContext = getPlaybackContext(); diff --git a/packages/player/src/internal/handlers/get-playback-state.test.ts b/packages/player/src/internal/handlers/get-playback-state.test.ts index a757569e..40a62ce5 100644 --- a/packages/player/src/internal/handlers/get-playback-state.test.ts +++ b/packages/player/src/internal/handlers/get-playback-state.test.ts @@ -1,16 +1,11 @@ import { expect } from '@esm-bundle/chai'; import * as Player from '../../index'; -import { credentialsProvider, waitFor } from '../../test-helpers'; -import { trueTime } from '../true-time'; +import { waitFor } from '../../test-helpers'; import { getPlaybackState } from './get-playback-state'; describe('getPlaybackState', () => { - beforeEach(async () => { - await trueTime.synchronize(); - }); - it('returns IDLE if there is no active player', () => { const activeState = getPlaybackState(); @@ -18,7 +13,6 @@ describe('getPlaybackState', () => { }); it('return NOT_PLAYING when a media product is loaded', async () => { - Player.setCredentialsProvider(credentialsProvider); Player.setStreamingWifiAudioQuality('LOW'); await Player.load( @@ -35,7 +29,6 @@ describe('getPlaybackState', () => { }); it('return PLAYING when a media product is playing', async () => { - Player.setCredentialsProvider(credentialsProvider); Player.setStreamingWifiAudioQuality('LOW'); await Player.load( diff --git a/packages/player/src/internal/handlers/load.test.ts b/packages/player/src/internal/handlers/load.test.ts index 781120c9..2f57c19d 100644 --- a/packages/player/src/internal/handlers/load.test.ts +++ b/packages/player/src/internal/handlers/load.test.ts @@ -1,21 +1,16 @@ import { expect } from '@esm-bundle/chai'; import * as Player from '../../index'; -import { trueTime } from '../../internal/true-time'; import { credentialsProvider, getPreloadedStreamingSessionId, waitFor, } from '../../test-helpers'; -describe('load', () => { - beforeEach(async () => { - await trueTime.synchronize(); - }); +Player.setCredentialsProvider(credentialsProvider); +describe('load', () => { it('re-uses a next for loading if it is the same media product', async () => { - Player.setCredentialsProvider(credentialsProvider); - await Player.load( { productId: '1766030', diff --git a/packages/player/src/internal/handlers/set-next.test.ts b/packages/player/src/internal/handlers/set-next.test.ts index 244b92a8..9662024c 100644 --- a/packages/player/src/internal/handlers/set-next.test.ts +++ b/packages/player/src/internal/handlers/set-next.test.ts @@ -3,16 +3,11 @@ import { expect } from '@esm-bundle/chai'; import * as Player from '../../index'; import type { MediaProduct } from '../../index'; import { waitFor } from '../../internal/helpers/wait-for'; -import { trueTime } from '../../internal/true-time'; import { credentialsProvider, waitForEvent } from '../../test-helpers'; -describe('nextHandler', () => { - beforeEach(async () => { - await trueTime.synchronize(); - - Player.setCredentialsProvider(credentialsProvider); - }); +Player.setCredentialsProvider(credentialsProvider); +describe('nextHandler', () => { it('doesnt preload if no mediaProduct', async () => { await Player.load( { diff --git a/packages/player/src/internal/helpers/playback-info-resolver.test.ts b/packages/player/src/internal/helpers/playback-info-resolver.test.ts index 6b9b61b1..c6a8b8e4 100644 --- a/packages/player/src/internal/helpers/playback-info-resolver.test.ts +++ b/packages/player/src/internal/helpers/playback-info-resolver.test.ts @@ -1,12 +1,9 @@ import { expect } from '@esm-bundle/chai'; import { credentialsProvider } from '../../test-helpers'; -import { trueTime } from '../true-time'; import { fetchPlaybackInfo } from './playback-info-resolver'; -await trueTime.synchronize(); - describe('playbackInfoResolver', () => { it('fetches playback info if there is only clientId defined, gets preview', async () => { const { clientId } = await credentialsProvider.getCredentials(); diff --git a/packages/player/src/internal/output-devices.test.ts b/packages/player/src/internal/output-devices.test.ts index 96d1198b..83ad7889 100644 --- a/packages/player/src/internal/output-devices.test.ts +++ b/packages/player/src/internal/output-devices.test.ts @@ -11,13 +11,10 @@ import { findOutputType, getOutputDeviceByName, } from './output-devices'; -import { trueTime } from './true-time'; -await trueTime.synchronize(); +Player.setCredentialsProvider(credentialsProvider); beforeEach(async () => { - Player.setCredentialsProvider(credentialsProvider); - await Player.load( { productId: '141120674', diff --git a/packages/player/src/internal/services/connection-handler.test.ts b/packages/player/src/internal/services/connection-handler.test.ts index b96808dd..8fd13f16 100644 --- a/packages/player/src/internal/services/connection-handler.test.ts +++ b/packages/player/src/internal/services/connection-handler.test.ts @@ -4,17 +4,10 @@ import type { MediaProductTransition } from '../../api/event/media-product-trans import { events } from '../../event-bus'; import * as Player from '../../index'; import { playerState } from '../../player/state'; -import { credentialsProvider, waitForEvent } from '../../test-helpers'; +import { waitForEvent } from '../../test-helpers'; import { waitFor } from '../helpers/wait-for'; -import { trueTime } from '../true-time'; describe('ConnectionHandler', () => { - beforeEach(async () => { - await trueTime.synchronize(); - - Player.setCredentialsProvider(credentialsProvider); - }); - it('reloads the mediaProduct when connection was lost and player stopped playing', async () => { await Player.load( { diff --git a/packages/player/src/internal/services/pushkin.test.ts b/packages/player/src/internal/services/pushkin.test.ts index 04adb8ae..c41ae84a 100644 --- a/packages/player/src/internal/services/pushkin.test.ts +++ b/packages/player/src/internal/services/pushkin.test.ts @@ -1,4 +1,3 @@ -// import { assert } from '@esm-bundle/chai'; import { credentialsProvider } from '../../test-helpers'; import { fetchWebSocketURL, socketOpen } from './pushkin'; diff --git a/packages/player/src/test-helpers.ts b/packages/player/src/test-helpers.ts index 3abda673..02e55b9f 100644 --- a/packages/player/src/test-helpers.ts +++ b/packages/player/src/test-helpers.ts @@ -1,10 +1,16 @@ /* eslint-disable no-console */ -import type { Credentials, CredentialsProvider } from '@tidal-music/common'; +import * as Auth from '@tidal-music/auth'; import { playerState } from './player/state'; export { waitFor } from './internal/helpers/wait-for'; +import * as Player from './index'; + +export function getPreloadedStreamingSessionId() { + return playerState.preloadedStreamingSessionId; +} + type User = { clientId: string; oAuthAccessToken: string; @@ -12,58 +18,33 @@ type User = { oAuthRefreshToken: string; userId: number; }; -type UserStore = Record; -export function getPreloadedStreamingSessionId() { - return playerState.preloadedStreamingSessionId; -} - -export const users: UserStore = { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - autohino: JSON.parse(atob(process.env.TEST_USER)), -}; +// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment +// @ts-expect-error Environment variable +const user = JSON.parse(atob(process.env.TEST_USER)) as User; +const scopes = ['r_usr', 'w_usr']; -/** - * Get test user - */ -export async function getTestUser( - user: User = users.autohino, -): Promise { - if (user.oAuthAccessToken) { - return { - clientId: user.clientId, - requestedScopes: ['READ', 'WRITE'], - token: user.oAuthAccessToken, - }; - } +await Auth.init({ + clientId: user.clientId, + clientUniqueKey: 'FALLBACK', + credentialsStorageKey: 'FALLBACK', + scopes, +}); - const body = new URLSearchParams({ - client_id: user.clientId, - client_unique_key: '', - grant_type: 'refresh_token', - refresh_token: user.oAuthRefreshToken, - scope: 'r_usr w_usr', - }); - - const response = await fetch('https://login.tidal.com/oauth2/token', { - body: body.toString(), - headers: new Headers({ - 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', - }), - method: 'POST', - }); - const json = (await response.json()) as { access_token: string }; - - user.oAuthAccessToken = json.access_token; - - return { +await Auth.setCredentials({ + accessToken: { clientId: user.clientId, - requestedScopes: ['READ', 'WRITE'], - token: json.access_token, - }; -} + clientUniqueKey: 'FALLBACK', + expires: user.oAuthExpirationDate, + grantedScopes: scopes, + requestedScopes: scopes, + token: user.oAuthAccessToken ?? '', + }, + refreshToken: user.oAuthRefreshToken, +}); + +Player.setCredentialsProvider(Auth.credentialsProvider); +export const credentialsProvider = Auth.credentialsProvider; export function waitForEvent(target: EventTarget, eventName: string) { return new Promise(resolve => { @@ -71,17 +52,6 @@ export function waitForEvent(target: EventTarget, eventName: string) { }); } -class TestCredentialsProvider implements CredentialsProvider { - bus() {} - - // eslint-disable-next-line @typescript-eslint/require-await - async getCredentials() { - return getTestUser(); - } -} - -export const credentialsProvider = new TestCredentialsProvider(); - class NativePlayerMock extends EventTarget { listDevices() { console.log('Native Player Mock: listDevices'); diff --git a/packages/player/web-test-runner.config.js b/packages/player/web-test-runner.config.js index 4ab06b66..6c924329 100644 --- a/packages/player/web-test-runner.config.js +++ b/packages/player/web-test-runner.config.js @@ -22,6 +22,7 @@ export default { // playwrightLauncher({ product: 'firefox' }), // playwrightLauncher({ product: 'webkit' }) ], + concurrency: 1, coverage: true, files: ['src/**/*.test.ts'], nodeResolve: true, @@ -42,4 +43,11 @@ export default { ui: 'bdd', }, }, + testRunnerHtml: testFramework => + ` + + + + + `, }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c4f7e30..e036084e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -199,9 +199,6 @@ importers: esbuild: specifier: ^0.19.0 version: 0.19.5 - gh-pages: - specifier: ^5.0.0 - version: 5.0.0 idb-keyval: specifier: ^6.2.1 version: 6.2.1 @@ -3459,23 +3456,11 @@ packages: is-string: 1.0.7 dev: true - /array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - dependencies: - array-uniq: 1.0.3 - dev: true - /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - dev: true - /array.prototype.findlastindex@1.2.3: resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} @@ -4411,10 +4396,6 @@ packages: resolution: {integrity: sha512-k1wGC7UXDTyCWcONkEMRG/w6Jvrxi+SVEU+IeqUKUKjv2lGJ1b+jf1mqrloyxVTG5WYYjNQ+F6+Cb1fGrLvNcA==} dev: true - /email-addresses@5.0.0: - resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} - dev: true - /eme-encryption-scheme-polyfill@2.1.1: resolution: {integrity: sha512-njD17wcUrbqCj0ArpLu5zWXtaiupHb/2fIUQGdInf83GlI+Q6mmqaPGLdrke4savKAu15J/z1Tg/ivDgl14g0g==} dev: true @@ -5280,20 +5261,6 @@ packages: flat-cache: 3.1.1 dev: true - /filename-reserved-regex@2.0.0: - resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} - engines: {node: '>=4'} - dev: true - - /filenamify@4.3.0: - resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} - engines: {node: '>=8'} - dependencies: - filename-reserved-regex: 2.0.0 - strip-outer: 1.0.1 - trim-repeated: 1.0.0 - dev: true - /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -5301,15 +5268,6 @@ packages: to-regex-range: 5.0.1 dev: true - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - dev: true - /find-replace@3.0.0: resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} @@ -5317,14 +5275,6 @@ packages: array-back: 3.1.0 dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -5506,20 +5456,6 @@ packages: assert-plus: 1.0.0 dev: true - /gh-pages@5.0.0: - resolution: {integrity: sha512-Nqp1SjkPIB94Xw/3yYNTUL+G2dxlhjvv1zeN/4kMC1jfViTEqhtVz/Ba1zSXHuvXCN9ADNS1dN4r5/J/nZWEQQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - async: 3.2.4 - commander: 2.20.3 - email-addresses: 5.0.0 - filenamify: 4.3.0 - find-cache-dir: 3.3.2 - fs-extra: 8.1.0 - globby: 6.1.0 - dev: true - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -5608,17 +5544,6 @@ packages: slash: 3.0.0 dev: true - /globby@6.1.0: - resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} - engines: {node: '>=0.10.0'} - dependencies: - array-union: 1.0.2 - glob: 7.2.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - dev: true - /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -6491,13 +6416,6 @@ packages: lie: 3.1.1 dev: false - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -6609,13 +6527,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - dev: true - /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -6979,13 +6890,6 @@ packages: resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: true - /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -7007,13 +6911,6 @@ packages: yocto-queue: 1.0.0 dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -7028,11 +6925,6 @@ packages: aggregate-error: 3.1.0 dev: true - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - /pac-proxy-agent@7.0.1: resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} engines: {node: '>= 14'} @@ -7155,25 +7047,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - dependencies: - pinkie: 2.0.4 - dev: true - - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: true - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - dev: true - /pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: @@ -7946,13 +7819,6 @@ packages: acorn: 8.10.0 dev: true - /strip-outer@1.0.1: - resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} - engines: {node: '>=0.10.0'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -8130,13 +7996,6 @@ packages: punycode: 2.3.0 dev: true - /trim-repeated@1.0.0: - resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} - engines: {node: '>=0.10.0'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - /ts-api-utils@1.0.3(typescript@5.2.2): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'}