diff --git a/apps/web/project.json b/apps/web/project.json index b99cbff71..65e7ed4ee 100644 --- a/apps/web/project.json +++ b/apps/web/project.json @@ -26,6 +26,24 @@ "apps/web/src/styles.scss", "apps/web/src/m3-theme.scss", "./node_modules/video.js/dist/video-js.css" + ], + "allowedCommonJsDependencies": [ + "qrcode", + "iptv-playlist-parser", + "moment", + "mpegts.js", + "videojs-contrib-quality-levels", + "videojs-quality-selector-hls", + "global/window", + "global/document", + "@videojs/xhr", + "videojs-vtt.js", + "mux.js/lib/tools/parse-sidx", + "mux.js/lib/utils/clock", + "keycode", + "safe-json-parse/tuple", + "@xmldom/xmldom", + "url-toolkit" ] }, "configurations": { @@ -34,12 +52,12 @@ "budgets": [ { "type": "initial", - "maximumWarning": "500kb", + "maximumWarning": "4.5mb", "maximumError": "5mb" }, { "type": "anyComponentStyle", - "maximumWarning": "10kb", + "maximumWarning": "12.5kb", "maximumError": "15kb" } ], @@ -56,12 +74,12 @@ "budgets": [ { "type": "initial", - "maximumWarning": "500kb", + "maximumWarning": "4.5mb", "maximumError": "5mb" }, { "type": "anyComponentStyle", - "maximumWarning": "10kb", + "maximumWarning": "12.5kb", "maximumError": "15kb" } ], diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index 36b85ae1d..dfc2a5cf9 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -5,14 +5,11 @@ import { Router, RouterOutlet } from '@angular/router'; import { Actions, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; -import { - GlobalRecentlyViewedComponent, - GlobalSearchResultsComponent, -} from '@iptvnator/portal/xtream/feature'; -import { EpgProgressPanelComponent } from 'components'; +import { EpgService } from '@iptvnator/epg/data-access'; +import { EpgProgressPanelComponent } from '@iptvnator/ui/epg'; import { PlaylistActions, selectAllPlaylistsMeta } from 'm3u-state'; import { filter, take } from 'rxjs'; -import { DataService, EpgService } from 'services'; +import { DataService } from 'services'; import { AUTO_UPDATE_PLAYLISTS, Language, @@ -149,25 +146,33 @@ export class AppComponent implements OnInit { } openGlobalSearch(initialQuery = ''): void { - this.dialog.open(GlobalSearchResultsComponent, { - width: '100%', - height: '100%', - maxWidth: '100%', - panelClass: 'global-search-overlay', - data: { isGlobalSearch: true, initialQuery }, - }); + void import('@iptvnator/portal/xtream/feature').then( + ({ GlobalSearchResultsComponent }) => { + this.dialog.open(GlobalSearchResultsComponent, { + width: '100%', + height: '100%', + maxWidth: '100%', + panelClass: 'global-search-overlay', + data: { isGlobalSearch: true, initialQuery }, + }); + } + ); } openGlobalRecent(): void { - this.dialog.open(GlobalRecentlyViewedComponent, { - width: '100%', - height: '100%', - maxWidth: '100%', - panelClass: 'global-search-overlay', - data: { isGlobal: true }, - hasBackdrop: true, - disableClose: false, - }); + void import('@iptvnator/portal/xtream/feature').then( + ({ GlobalRecentlyViewedComponent }) => { + this.dialog.open(GlobalRecentlyViewedComponent, { + width: '100%', + height: '100%', + maxWidth: '100%', + panelClass: 'global-search-overlay', + data: { isGlobal: true }, + hasBackdrop: true, + disableClose: false, + }); + } + ); } /** diff --git a/apps/web/src/app/app.config.ts b/apps/web/src/app/app.config.ts index 55db30335..543d42b0e 100644 --- a/apps/web/src/app/app.config.ts +++ b/apps/web/src/app/app.config.ts @@ -24,7 +24,7 @@ import { PORTAL_EXTERNAL_PLAYBACK, PORTAL_PLAYER, } from '@iptvnator/portal/shared/util'; -import { PLAYLIST_PLAYER_ACTIONS } from '@iptvnator/playlist/m3u/feature-player'; +import { PLAYLIST_PLAYER_ACTIONS } from '@iptvnator/playlist/shared/util'; import { provideXtreamDataSource } from '@iptvnator/portal/xtream/data-access'; import { DataService } from 'services'; import { dbConfig } from 'shared-interfaces'; diff --git a/apps/web/src/app/app.routes.ts b/apps/web/src/app/app.routes.ts index cf8ace6bb..8ec57b176 100644 --- a/apps/web/src/app/app.routes.ts +++ b/apps/web/src/app/app.routes.ts @@ -1,6 +1,4 @@ import { Route, Routes } from '@angular/router'; -import { createStalkerRoutes } from '@iptvnator/portal/stalker/feature'; -import { createXtreamRoutes } from '@iptvnator/portal/xtream/feature'; function withWorkspaceLayout(routes: Route[]): Route[] { return routes.map((route) => ({ @@ -80,8 +78,20 @@ export const routes: Routes = [ (c) => c.DownloadsComponent ), }, - ...withWorkspaceLayout(createXtreamRoutes()), - ...withWorkspaceLayout(createStalkerRoutes()), + { + path: '', + loadChildren: () => + import('@iptvnator/portal/xtream/feature').then((m) => + withWorkspaceLayout(m.createXtreamRoutes()) + ), + }, + { + path: '', + loadChildren: () => + import('@iptvnator/portal/stalker/feature').then((m) => + withWorkspaceLayout(m.createStalkerRoutes()) + ), + }, { path: 'settings', data: { layout: 'workspace' }, diff --git a/apps/web/src/app/services/electron.service.stub.ts b/apps/web/src/app/services/electron.service.stub.ts index f6bbffa7f..6dd1f9ed2 100644 --- a/apps/web/src/app/services/electron.service.stub.ts +++ b/apps/web/src/app/services/electron.service.stub.ts @@ -25,10 +25,10 @@ export class ElectronServiceStub { return this.remote.app.getVersion(); } - sendIpcEvent(_type: string, _payload?: unknown): void { + sendIpcEvent(_type: string, _payload?: unknown): T { void _type; void _payload; - return undefined; + return undefined as T; } listenOn( diff --git a/apps/web/src/app/services/electron.service.ts b/apps/web/src/app/services/electron.service.ts index e7c5edcfd..4b63961ea 100644 --- a/apps/web/src/app/services/electron.service.ts +++ b/apps/web/src/app/services/electron.service.ts @@ -108,10 +108,16 @@ export class ElectronService extends DataService { return AppConfig.version; } - async sendIpcEvent(type: string, payload?: unknown) { + async sendIpcEvent( + type: string, + payload?: unknown + ): Promise { if (type === PLAYLIST_PARSE_BY_URL) { this.fetchM3uPlaylistFromUrl(payload); - } else if (type === PLAYLIST_UPDATE) { + return undefined as T; + } + + if (type === PLAYLIST_UPDATE) { this.updateM3uPlaylistFromFile( payload as { id: string; @@ -120,22 +126,29 @@ export class ElectronService extends DataService { title: string; } ); - } else if (type === XTREAM_REQUEST) { - return await this.forwardXtreamRequest( + return undefined as T; + } + + if (type === XTREAM_REQUEST) { + return (await this.forwardXtreamRequest( payload as { url: string; params: Record } - ); - } else if (type === 'STALKER_REQUEST') { - return this.fetchStalkerData( + )) as T; + } + + if (type === 'STALKER_REQUEST') { + return (await this.fetchStalkerData( payload as { url: string; macAddress: string; params: Record; } - ); - } else if (type === 'OPEN_MPV_PLAYER') { + )) as T; + } + + if (type === 'OPEN_MPV_PLAYER') { const data = payload as PlayerLaunchPayload; try { - return await window.electron.openInMpv( + return (await window.electron.openInMpv( data.url, data.title ?? '', data.thumbnail ?? '', @@ -145,8 +158,7 @@ export class ElectronService extends DataService { data.contentInfo, data.startTime, data.headers ?? undefined - ); - /* thumbnail: data.thumbnail ?? '', */ + )) as T; } catch (error: unknown) { const errorMessage = this.getErrorDetails(error)?.message ?? String(error); @@ -160,10 +172,12 @@ export class ElectronService extends DataService { console.error('MPV launch error:', error); throw error; } - } else if (type === 'OPEN_VLC_PLAYER') { + } + + if (type === 'OPEN_VLC_PLAYER') { const data = payload as PlayerLaunchPayload; try { - return await window.electron.openInVlc( + return (await window.electron.openInVlc( data.url, data.title ?? '', data.thumbnail ?? '', @@ -173,7 +187,7 @@ export class ElectronService extends DataService { data.contentInfo, data.startTime, data.headers ?? undefined - ); + )) as T; } catch (error: unknown) { const errorMessage = this.getErrorDetails(error)?.message ?? String(error); @@ -187,7 +201,9 @@ export class ElectronService extends DataService { console.error('VLC launch error:', error); throw error; } - } else if (type === AUTO_UPDATE_PLAYLISTS) { + } + + if (type === AUTO_UPDATE_PLAYLISTS) { const data = payload as Playlist[]; const playlists = await window.electron.autoUpdatePlaylists(data); this.store.dispatch( @@ -202,9 +218,11 @@ export class ElectronService extends DataService { null, { duration: 2000 } ); - } else { - console.log('Unknown type', type); + return playlists as T; } + + console.log('Unknown type', type); + return undefined as T; } private async fetchStalkerData(payload: { diff --git a/apps/web/src/app/services/player.service.ts b/apps/web/src/app/services/player.service.ts index 9a82fbea6..11d7f6151 100644 --- a/apps/web/src/app/services/player.service.ts +++ b/apps/web/src/app/services/player.service.ts @@ -1,10 +1,6 @@ import { Injectable, inject } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { ExternalPlayerInfoDialogComponent } from 'components'; -import { - PlayerDialogComponent, - PlayerDialogData, -} from '@iptvnator/portal/xtream/feature'; +import { ExternalPlayerInfoDialogComponent } from '@iptvnator/ui/playback'; import { DataService } from 'services'; import { ExternalPlayerSession, @@ -85,7 +81,9 @@ export class PlayerService { if (!hideExternalInfoDialog) { this.dialog.open(ExternalPlayerInfoDialogComponent); } - return await this.dataService.sendIpcEvent(OPEN_MPV_PLAYER, { + return await this.dataService.sendIpcEvent( + OPEN_MPV_PLAYER, + { url: streamUrl, title, thumbnail, @@ -95,12 +93,15 @@ export class PlayerService { headers, contentInfo, startTime, - }); + } + ); } else if (player === VideoPlayer.VLC) { if (!hideExternalInfoDialog) { this.dialog.open(ExternalPlayerInfoDialogComponent); } - return await this.dataService.sendIpcEvent(OPEN_VLC_PLAYER, { + return await this.dataService.sendIpcEvent( + OPEN_VLC_PLAYER, + { url: streamUrl, title, thumbnail, @@ -110,16 +111,18 @@ export class PlayerService { headers, contentInfo, startTime, - }); + } + ); } - this.dialog.open( - PlayerDialogComponent, - { - data: { streamUrl, title, contentInfo, startTime }, - width: '80%', - maxWidth: '1200px', - maxHeight: '90vh', + void import('@iptvnator/portal/xtream/feature').then( + ({ PlayerDialogComponent }) => { + this.dialog.open(PlayerDialogComponent, { + data: { streamUrl, title, contentInfo, startTime }, + width: '80%', + maxWidth: '1200px', + maxHeight: '90vh', + }); } ); } diff --git a/apps/web/src/app/services/portal-navigation-actions.service.ts b/apps/web/src/app/services/portal-navigation-actions.service.ts index 7ee39127a..f573b6f68 100644 --- a/apps/web/src/app/services/portal-navigation-actions.service.ts +++ b/apps/web/src/app/services/portal-navigation-actions.service.ts @@ -1,11 +1,10 @@ import { inject, Injectable, Provider } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { PlaylistInfoComponent } from 'components'; +import { PlaylistInfoComponent } from '@iptvnator/playlist/shared/ui'; import { PORTAL_NAVIGATION_ACTIONS, PortalNavigationActions, } from '@iptvnator/portal/shared/util'; -import { AccountInfoComponent } from '@iptvnator/portal/xtream/feature'; import { XtreamStore } from '@iptvnator/portal/xtream/data-access'; import { Playlist } from 'shared-interfaces'; import { SettingsComponent } from '../settings/settings.component'; @@ -18,16 +17,22 @@ export class AppPortalNavigationActionsService private readonly xtreamStore = inject(XtreamStore); openAccountInfo(): void { - this.dialog.open(AccountInfoComponent, { - width: '80%', - maxWidth: '1200px', - maxHeight: '90vh', - data: { - vodStreamsCount: this.xtreamStore.vodStreams().length, - liveStreamsCount: this.xtreamStore.liveStreams().length, - seriesCount: this.xtreamStore.serialStreams().length, - }, - }); + const data = { + vodStreamsCount: this.xtreamStore.vodStreams().length, + liveStreamsCount: this.xtreamStore.liveStreams().length, + seriesCount: this.xtreamStore.serialStreams().length, + }; + + void import('@iptvnator/portal/xtream/feature').then( + ({ AccountInfoComponent }) => { + this.dialog.open(AccountInfoComponent, { + width: '80%', + maxWidth: '1200px', + maxHeight: '90vh', + data, + }); + } + ); } openPlaylistInfo(playlist: Playlist | null | undefined): void { diff --git a/apps/web/src/app/services/pwa.service.ts b/apps/web/src/app/services/pwa.service.ts index e90d446d9..a7cc74ceb 100644 --- a/apps/web/src/app/services/pwa.service.ts +++ b/apps/web/src/app/services/pwa.service.ts @@ -96,26 +96,34 @@ export class PwaService extends DataService { * @param type ipc command type * @param payload payload */ - sendIpcEvent(type: string, payload?: unknown) { + sendIpcEvent(type: string, payload?: unknown): T { if (type === PLAYLIST_PARSE_BY_URL) { this.fetchFromUrl(payload); - } else if (type === PLAYLIST_UPDATE) { + return undefined as T; + } + + if (type === PLAYLIST_UPDATE) { this.refreshPlaylist(payload); - } else if (type === XTREAM_REQUEST) { + return undefined as T; + } + + if (type === XTREAM_REQUEST) { return this.forwardXtreamRequest( payload as { url: string; params: Record } - ); - } else if (type === STALKER_REQUEST) { + ) as T; + } + + if (type === STALKER_REQUEST) { return this.forwardStalkerRequest( payload as { url: string; macAddress: string; params: Record; } - ); - } else { - return Promise.resolve(); + ) as T; } + + return undefined as T; } refreshPlaylist(payload: Partial) { diff --git a/apps/web/src/app/services/settings.service.ts b/apps/web/src/app/services/settings.service.ts index f8008be1f..2152fde50 100644 --- a/apps/web/src/app/services/settings.service.ts +++ b/apps/web/src/app/services/settings.service.ts @@ -2,9 +2,58 @@ import { HttpClient } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; import { StorageMap } from '@ngx-pwa/local-storage'; import { catchError, map, Observable } from 'rxjs'; -import * as semver from 'semver'; import { STORE_KEY, Theme } from 'shared-interfaces'; +const PRERELEASE_KEYWORDS = [ + 'beta', + 'alpha', + 'rc', + 'preview', + 'dev', + 'canary', + 'nightly', +] as const; + +interface ParsedVersion { + major: number; + minor: number; + patch: number; + prerelease: boolean; +} + +function parseVersion(input: string): ParsedVersion | null { + const normalized = input.trim().replace(/^v/i, ''); + const match = normalized.match( + /(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:[-+]?([0-9A-Za-z.-]+))?/ + ); + + if (!match) { + return null; + } + + return { + major: Number(match[1] ?? 0), + minor: Number(match[2] ?? 0), + patch: Number(match[3] ?? 0), + prerelease: Boolean(match[4]), + }; +} + +function hasPrereleaseKeyword(value: string): boolean { + const normalized = value.toLowerCase(); + return PRERELEASE_KEYWORDS.some((keyword) => normalized.includes(keyword)); +} + +function compareVersions(a: ParsedVersion, b: ParsedVersion): number { + if (a.major !== b.major) { + return a.major - b.major; + } + if (a.minor !== b.minor) { + return a.minor - b.minor; + } + return a.patch - b.patch; +} + @Injectable({ providedIn: 'root', }) @@ -64,34 +113,14 @@ export class SettingsService { map((response) => { // Filter out pre-release versions (beta, alpha, rc, etc.) const stableReleases = response.filter((release) => { - const releaseName = release.name.toLowerCase(); - - // Check for beta/alpha/rc keywords in the release name - const prereleaseKeywords = [ - 'beta', - 'alpha', - 'rc', - 'preview', - 'dev', - 'canary', - 'nightly', - ]; - const hasPrereleaseKeyword = prereleaseKeywords.some( - (keyword) => releaseName.includes(keyword) - ); - - if (hasPrereleaseKeyword) { + if (hasPrereleaseKeyword(release.name)) { return false; } - // Validate version format - const version = semver.valid( - semver.coerce(release.name) - ); + const version = parseVersion(release.name); if (!version) return false; - // Check if version has prerelease tags in semver format - return !semver.prerelease(release.name); + return !version.prerelease; }); // Sort stable releases by creation date @@ -121,9 +150,8 @@ export class SettingsService { currentVersion: string, latestVersion: string ): boolean { - // Clean and coerce versions to handle invalid formats - const cleanCurrent = semver.coerce(currentVersion); - const cleanLatest = semver.coerce(latestVersion); + const cleanCurrent = parseVersion(currentVersion); + const cleanLatest = parseVersion(latestVersion); if (!cleanCurrent || !cleanLatest) { console.warn('Invalid version format:', { @@ -133,6 +161,6 @@ export class SettingsService { return false; } - return semver.lt(cleanCurrent, cleanLatest); + return compareVersions(cleanCurrent, cleanLatest) < 0; } } diff --git a/apps/web/src/app/services/workspace-shell-actions.service.ts b/apps/web/src/app/services/workspace-shell-actions.service.ts index a7b40032a..b800bcdbd 100644 --- a/apps/web/src/app/services/workspace-shell-actions.service.ts +++ b/apps/web/src/app/services/workspace-shell-actions.service.ts @@ -1,12 +1,6 @@ import { inject, Injectable, Provider } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { AddPlaylistDialogComponent } from '@iptvnator/playlist/import/feature'; -import { - AccountInfoComponent, - GlobalRecentlyViewedComponent, - GlobalSearchResultsComponent, -} from '@iptvnator/portal/xtream/feature'; -import { PlaylistType } from 'components'; +import { PlaylistType } from '@iptvnator/playlist/shared/ui'; import { WORKSPACE_SHELL_ACTIONS, WorkspaceAccountInfoData, @@ -18,44 +12,60 @@ export class AppWorkspaceShellActionsService implements WorkspaceShellActions { private readonly dialog = inject(MatDialog); openAddPlaylistDialog(type: PlaylistType): void { - this.dialog.open(AddPlaylistDialogComponent, { - width: '600px', - data: { type }, - }); + void import('@iptvnator/playlist/import/feature').then( + ({ AddPlaylistDialogComponent }) => { + this.dialog.open(AddPlaylistDialogComponent, { + width: '600px', + data: { type }, + }); + } + ); } openGlobalSearch(initialQuery = ''): void { - this.dialog.open(GlobalSearchResultsComponent, { - width: '100%', - height: '100%', - maxWidth: '100%', - panelClass: 'global-search-overlay', - data: { - isGlobalSearch: true, - initialQuery, - }, - }); + void import('@iptvnator/portal/xtream/feature').then( + ({ GlobalSearchResultsComponent }) => { + this.dialog.open(GlobalSearchResultsComponent, { + width: '100%', + height: '100%', + maxWidth: '100%', + panelClass: 'global-search-overlay', + data: { + isGlobalSearch: true, + initialQuery, + }, + }); + } + ); } openGlobalRecent(): void { - this.dialog.open(GlobalRecentlyViewedComponent, { - width: '100%', - height: '100%', - maxWidth: '100%', - panelClass: 'global-search-overlay', - data: { isGlobal: true }, - hasBackdrop: true, - disableClose: false, - }); + void import('@iptvnator/portal/xtream/feature').then( + ({ GlobalRecentlyViewedComponent }) => { + this.dialog.open(GlobalRecentlyViewedComponent, { + width: '100%', + height: '100%', + maxWidth: '100%', + panelClass: 'global-search-overlay', + data: { isGlobal: true }, + hasBackdrop: true, + disableClose: false, + }); + } + ); } openAccountInfo(data: WorkspaceAccountInfoData): void { - this.dialog.open(AccountInfoComponent, { - width: '80%', - maxWidth: '1200px', - maxHeight: '90vh', - data, - }); + void import('@iptvnator/portal/xtream/feature').then( + ({ AccountInfoComponent }) => { + this.dialog.open(AccountInfoComponent, { + width: '80%', + maxWidth: '1200px', + maxHeight: '90vh', + data, + }); + } + ); } } diff --git a/apps/web/src/app/settings/settings.component.spec.ts b/apps/web/src/app/settings/settings.component.spec.ts index f2d51787b..e26082ceb 100644 --- a/apps/web/src/app/settings/settings.component.spec.ts +++ b/apps/web/src/app/settings/settings.component.spec.ts @@ -18,13 +18,14 @@ import { Router } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { provideMockStore } from '@ngrx/store/testing'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { EpgService } from '@iptvnator/epg/data-access'; import { MockModule, MockProvider, MockProviders, } from 'ng-mocks'; import { DialogService } from 'components'; -import { DataService, EpgService, PlaylistsService } from 'services'; +import { DataService, PlaylistsService } from 'services'; import { Language, StreamFormat, Theme, VideoPlayer } from 'shared-interfaces'; import { SettingsComponent } from './settings.component'; diff --git a/apps/web/src/app/settings/settings.component.ts b/apps/web/src/app/settings/settings.component.ts index 872e033b8..dd607567e 100644 --- a/apps/web/src/app/settings/settings.component.ts +++ b/apps/web/src/app/settings/settings.component.ts @@ -34,11 +34,12 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { EpgService } from '@iptvnator/epg/data-access'; import { QRCodeComponent } from 'angularx-qrcode'; import { DialogService } from 'components'; import { PlaylistActions, selectIsEpgAvailable } from 'm3u-state'; import { take } from 'rxjs'; -import { DataService, EpgService, PlaylistsService } from 'services'; +import { DataService, PlaylistsService } from 'services'; import { Language, Playlist, diff --git a/eslint.config.mjs b/eslint.config.mjs index a3d6364b2..217e5c3f5 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -59,16 +59,88 @@ export default [ 'domain:portal-shared', 'domain:m3u', 'domain:playback', + 'domain:shared-contracts', + 'domain:shared-runtime', + 'domain:shared-ui', 'scope:shared', 'scope:portal', ], }, + { + sourceTag: 'domain:m3u', + onlyDependOnLibsWithTags: [ + 'domain:m3u', + 'domain:playback', + 'domain:portal-shared', + 'domain:shared-contracts', + 'domain:shared-runtime', + 'domain:shared-ui', + 'scope:shared', + ], + }, + { + sourceTag: 'domain:playlist-import', + onlyDependOnLibsWithTags: [ + 'domain:m3u', + 'domain:playlist-import', + 'domain:playback', + 'domain:shared-contracts', + 'domain:shared-runtime', + 'domain:shared-ui', + 'domain:stalker', + 'scope:shared', + ], + }, + { + sourceTag: 'domain:playback', + onlyDependOnLibsWithTags: [ + 'domain:m3u', + 'domain:playback', + 'domain:portal-shared', + 'domain:shared-contracts', + 'domain:shared-runtime', + 'domain:shared-ui', + 'scope:shared', + ], + }, + { + sourceTag: 'domain:shared-contracts', + onlyDependOnLibsWithTags: [ + 'domain:shared-contracts', + 'scope:shared', + ], + }, + { + sourceTag: 'domain:shared-runtime', + onlyDependOnLibsWithTags: [ + 'domain:m3u', + 'domain:shared-contracts', + 'domain:shared-runtime', + 'scope:shared', + ], + }, + { + sourceTag: 'domain:shared-ui', + onlyDependOnLibsWithTags: [ + 'domain:m3u', + 'domain:playback', + 'domain:portal-shared', + 'domain:shared-contracts', + 'domain:shared-runtime', + 'domain:shared-ui', + 'scope:shared', + ], + }, { sourceTag: 'domain:xtream', onlyDependOnLibsWithTags: [ 'domain:xtream', 'domain:portal-shared', 'domain:m3u', + 'domain:playback', + 'domain:shared-contracts', + 'domain:shared-runtime', + 'domain:shared-ui', 'scope:shared', ], }, @@ -78,6 +150,10 @@ export default [ 'domain:stalker', 'domain:portal-shared', 'domain:m3u', + 'domain:playback', + 'domain:shared-contracts', + 'domain:shared-runtime', + 'domain:shared-ui', 'scope:shared', ], }, @@ -89,6 +165,10 @@ export default [ 'domain:xtream', 'domain:stalker', 'domain:m3u', + 'domain:playback', + 'domain:shared-contracts', + 'domain:shared-runtime', + 'domain:shared-ui', 'scope:shared', ], }, diff --git a/libs/epg/data-access/project.json b/libs/epg/data-access/project.json new file mode 100644 index 000000000..39322175f --- /dev/null +++ b/libs/epg/data-access/project.json @@ -0,0 +1,13 @@ +{ + "name": "epg-data-access", + "$schema": "../../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/epg/data-access/src", + "prefix": "lib", + "projectType": "library", + "tags": ["scope:shared", "domain:playback", "type:data-access"], + "targets": { + "lint": { + "executor": "@nx/eslint:lint" + } + } +} diff --git a/libs/epg/data-access/src/index.ts b/libs/epg/data-access/src/index.ts new file mode 100644 index 000000000..9100678a5 --- /dev/null +++ b/libs/epg/data-access/src/index.ts @@ -0,0 +1,2 @@ +export * from './lib/epg-progress.service'; +export * from './lib/epg.service'; diff --git a/libs/services/src/lib/epg-progress.service.ts b/libs/epg/data-access/src/lib/epg-progress.service.ts similarity index 100% rename from libs/services/src/lib/epg-progress.service.ts rename to libs/epg/data-access/src/lib/epg-progress.service.ts diff --git a/libs/services/src/lib/epg.service.spec.ts b/libs/epg/data-access/src/lib/epg.service.spec.ts similarity index 100% rename from libs/services/src/lib/epg.service.spec.ts rename to libs/epg/data-access/src/lib/epg.service.spec.ts diff --git a/libs/services/src/lib/epg.service.ts b/libs/epg/data-access/src/lib/epg.service.ts similarity index 100% rename from libs/services/src/lib/epg.service.ts rename to libs/epg/data-access/src/lib/epg.service.ts diff --git a/libs/epg/data-access/tsconfig.json b/libs/epg/data-access/tsconfig.json new file mode 100644 index 000000000..7d33479d8 --- /dev/null +++ b/libs/epg/data-access/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "isolatedModules": true, + "target": "es2022", + "moduleResolution": "bundler", + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "emitDecoratorMetadata": false, + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/libs/epg/data-access/tsconfig.lib.json b/libs/epg/data-access/tsconfig.lib.json new file mode 100644 index 000000000..7fba372dc --- /dev/null +++ b/libs/epg/data-access/tsconfig.lib.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/libs/m3u-state/src/lib/effects.ts b/libs/m3u-state/src/lib/effects.ts index 53af20f3e..67412d3db 100644 --- a/libs/m3u-state/src/lib/effects.ts +++ b/libs/m3u-state/src/lib/effects.ts @@ -5,6 +5,7 @@ import { Actions, createEffect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { StorageMap } from '@ngx-pwa/local-storage'; import { TranslateService } from '@ngx-translate/core'; +import { EpgService } from '@iptvnator/epg/data-access'; import { combineLatestWith, EMPTY, @@ -15,7 +16,7 @@ import { tap, withLatestFrom, } from 'rxjs'; -import { DataService, EpgService, PlaylistsService } from 'services'; +import { DataService, PlaylistsService } from 'services'; import { OPEN_MPV_PLAYER, OPEN_VLC_PLAYER, diff --git a/libs/playlist/import/feature/project.json b/libs/playlist/import/feature/project.json index d6b3a0d50..f2b6b48ed 100644 --- a/libs/playlist/import/feature/project.json +++ b/libs/playlist/import/feature/project.json @@ -4,7 +4,7 @@ "sourceRoot": "libs/playlist/import/feature/src", "prefix": "lib", "projectType": "library", - "tags": ["scope:playlist", "domain:m3u", "type:feature"], + "tags": ["scope:playlist", "domain:playlist-import", "type:feature"], "targets": { "lint": { "executor": "@nx/eslint:lint" diff --git a/libs/playlist/import/feature/src/lib/add-playlist-dialog/add-playlist-dialog.component.ts b/libs/playlist/import/feature/src/lib/add-playlist-dialog/add-playlist-dialog.component.ts index 965bc7f4d..0fcda8555 100644 --- a/libs/playlist/import/feature/src/lib/add-playlist-dialog/add-playlist-dialog.component.ts +++ b/libs/playlist/import/feature/src/lib/add-playlist-dialog/add-playlist-dialog.component.ts @@ -8,7 +8,7 @@ import { import { MatSnackBar } from '@angular/material/snack-bar'; import { Store } from '@ngrx/store'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { PlaylistType } from 'components'; +import { PlaylistType } from '@iptvnator/playlist/shared/ui'; import { PlaylistActions } from 'm3u-state'; import { getFilenameFromUrl } from 'm3u-utils'; import { DataService } from 'services'; diff --git a/libs/playlist/import/feature/src/lib/stalker-portal-import/stalker-portal-import.component.ts b/libs/playlist/import/feature/src/lib/stalker-portal-import/stalker-portal-import.component.ts index 4b622d7f4..198f31ec2 100644 --- a/libs/playlist/import/feature/src/lib/stalker-portal-import/stalker-portal-import.component.ts +++ b/libs/playlist/import/feature/src/lib/stalker-portal-import/stalker-portal-import.component.ts @@ -14,7 +14,10 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { Store } from '@ngrx/store'; import { TranslatePipe, TranslateService } from '@ngx-translate/core'; import { PlaylistActions } from 'm3u-state'; -import { STALKER_SERIAL_NUMBER, StalkerSessionService } from 'services'; +import { + STALKER_SERIAL_NUMBER, + StalkerSessionService, +} from '@iptvnator/portal/stalker/data-access'; import { Playlist } from 'shared-interfaces'; import { v4 as uuid } from 'uuid'; diff --git a/libs/playlist/m3u/feature-player/src/index.ts b/libs/playlist/m3u/feature-player/src/index.ts index 2251b23a5..c91ca799d 100644 --- a/libs/playlist/m3u/feature-player/src/index.ts +++ b/libs/playlist/m3u/feature-player/src/index.ts @@ -1,2 +1 @@ -export * from './lib/playlist-player-actions'; export * from './lib/video-player/video-player.component'; diff --git a/libs/playlist/m3u/feature-player/src/lib/video-player/video-player.component.ts b/libs/playlist/m3u/feature-player/src/lib/video-player/video-player.component.ts index 956c1bda8..5e6a09508 100644 --- a/libs/playlist/m3u/feature-player/src/lib/video-player/video-player.component.ts +++ b/libs/playlist/m3u/feature-player/src/lib/video-player/video-player.component.ts @@ -19,18 +19,14 @@ import { Store } from '@ngrx/store'; import { StorageMap } from '@ngx-pwa/local-storage'; import { TranslatePipe } from '@ngx-translate/core'; import { - ArtPlayerComponent, - AudioPlayerComponent, + InfoOverlayComponent, + ResizableDirective, +} from 'components'; +import { COMPONENT_OVERLAY_REF, EpgListComponent, - HtmlVideoPlayerComponent, - InfoOverlayComponent, MultiEpgContainerComponent, - ResizableDirective, - SidebarComponent, - ToolbarComponent, - VjsPlayerComponent, -} from 'components'; +} from '@iptvnator/ui/epg'; import { ChannelActions, FavoritesActions, @@ -55,6 +51,15 @@ import { getAdjacentChannelItem, getChannelItemByNumber, } from '@iptvnator/portal/shared/util'; +import { + ArtPlayerComponent, + AudioPlayerComponent, + HtmlVideoPlayerComponent, + SidebarComponent, + ToolbarComponent, + VjsPlayerComponent, +} from '@iptvnator/ui/playback'; +import { PLAYLIST_PLAYER_ACTIONS } from '@iptvnator/playlist/shared/util'; import { DataService, PlaylistsService, SettingsStore } from 'services'; import { Channel, @@ -65,7 +70,6 @@ import { SidebarView, VideoPlayer, } from 'shared-interfaces'; -import { PLAYLIST_PLAYER_ACTIONS } from '../playlist-player-actions'; @Component({ selector: 'app-video-player', diff --git a/libs/playlist/shared/ui/project.json b/libs/playlist/shared/ui/project.json new file mode 100644 index 000000000..112df7353 --- /dev/null +++ b/libs/playlist/shared/ui/project.json @@ -0,0 +1,13 @@ +{ + "name": "playlist-shared-ui", + "$schema": "../../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/playlist/shared/ui/src", + "prefix": "lib", + "projectType": "library", + "tags": ["scope:playlist", "domain:m3u", "type:ui"], + "targets": { + "lint": { + "executor": "@nx/eslint:lint" + } + } +} diff --git a/libs/playlist/shared/ui/src/index.ts b/libs/playlist/shared/ui/src/index.ts new file mode 100644 index 000000000..b72dffa28 --- /dev/null +++ b/libs/playlist/shared/ui/src/index.ts @@ -0,0 +1,5 @@ +export * from './lib/add-playlist-menu/add-playlist-menu.component'; +export * from './lib/filter-sort-menu/filter-sort-menu.component'; +export * from './lib/playlist-switcher/playlist-switcher.component'; +export * from './lib/recent-playlists/playlist-info/playlist-info.component'; +export * from './lib/recent-playlists/recent-playlists.component'; diff --git a/libs/ui/components/src/lib/add-playlist-menu/add-playlist-menu.component.html b/libs/playlist/shared/ui/src/lib/add-playlist-menu/add-playlist-menu.component.html similarity index 100% rename from libs/ui/components/src/lib/add-playlist-menu/add-playlist-menu.component.html rename to libs/playlist/shared/ui/src/lib/add-playlist-menu/add-playlist-menu.component.html diff --git a/libs/ui/components/src/lib/add-playlist-menu/add-playlist-menu.component.ts b/libs/playlist/shared/ui/src/lib/add-playlist-menu/add-playlist-menu.component.ts similarity index 100% rename from libs/ui/components/src/lib/add-playlist-menu/add-playlist-menu.component.ts rename to libs/playlist/shared/ui/src/lib/add-playlist-menu/add-playlist-menu.component.ts diff --git a/libs/ui/components/src/lib/filter-sort-menu/filter-sort-menu.component.html b/libs/playlist/shared/ui/src/lib/filter-sort-menu/filter-sort-menu.component.html similarity index 100% rename from libs/ui/components/src/lib/filter-sort-menu/filter-sort-menu.component.html rename to libs/playlist/shared/ui/src/lib/filter-sort-menu/filter-sort-menu.component.html diff --git a/libs/ui/components/src/lib/filter-sort-menu/filter-sort-menu.component.scss b/libs/playlist/shared/ui/src/lib/filter-sort-menu/filter-sort-menu.component.scss similarity index 100% rename from libs/ui/components/src/lib/filter-sort-menu/filter-sort-menu.component.scss rename to libs/playlist/shared/ui/src/lib/filter-sort-menu/filter-sort-menu.component.scss diff --git a/libs/ui/components/src/lib/filter-sort-menu/filter-sort-menu.component.ts b/libs/playlist/shared/ui/src/lib/filter-sort-menu/filter-sort-menu.component.ts similarity index 100% rename from libs/ui/components/src/lib/filter-sort-menu/filter-sort-menu.component.ts rename to libs/playlist/shared/ui/src/lib/filter-sort-menu/filter-sort-menu.component.ts diff --git a/libs/ui/components/src/lib/playlist-switcher/playlist-switcher.component.html b/libs/playlist/shared/ui/src/lib/playlist-switcher/playlist-switcher.component.html similarity index 100% rename from libs/ui/components/src/lib/playlist-switcher/playlist-switcher.component.html rename to libs/playlist/shared/ui/src/lib/playlist-switcher/playlist-switcher.component.html diff --git a/libs/ui/components/src/lib/playlist-switcher/playlist-switcher.component.scss b/libs/playlist/shared/ui/src/lib/playlist-switcher/playlist-switcher.component.scss similarity index 100% rename from libs/ui/components/src/lib/playlist-switcher/playlist-switcher.component.scss rename to libs/playlist/shared/ui/src/lib/playlist-switcher/playlist-switcher.component.scss diff --git a/libs/ui/components/src/lib/playlist-switcher/playlist-switcher.component.ts b/libs/playlist/shared/ui/src/lib/playlist-switcher/playlist-switcher.component.ts similarity index 100% rename from libs/ui/components/src/lib/playlist-switcher/playlist-switcher.component.ts rename to libs/playlist/shared/ui/src/lib/playlist-switcher/playlist-switcher.component.ts diff --git a/libs/ui/components/src/lib/recent-playlists/empty-state/empty-state.component.html b/libs/playlist/shared/ui/src/lib/recent-playlists/empty-state/empty-state.component.html similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/empty-state/empty-state.component.html rename to libs/playlist/shared/ui/src/lib/recent-playlists/empty-state/empty-state.component.html diff --git a/libs/ui/components/src/lib/recent-playlists/empty-state/empty-state.component.scss b/libs/playlist/shared/ui/src/lib/recent-playlists/empty-state/empty-state.component.scss similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/empty-state/empty-state.component.scss rename to libs/playlist/shared/ui/src/lib/recent-playlists/empty-state/empty-state.component.scss diff --git a/libs/ui/components/src/lib/recent-playlists/empty-state/empty-state.component.ts b/libs/playlist/shared/ui/src/lib/recent-playlists/empty-state/empty-state.component.ts similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/empty-state/empty-state.component.ts rename to libs/playlist/shared/ui/src/lib/recent-playlists/empty-state/empty-state.component.ts diff --git a/libs/ui/components/src/lib/recent-playlists/playlist-info/playlist-info.component.html b/libs/playlist/shared/ui/src/lib/recent-playlists/playlist-info/playlist-info.component.html similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/playlist-info/playlist-info.component.html rename to libs/playlist/shared/ui/src/lib/recent-playlists/playlist-info/playlist-info.component.html diff --git a/libs/ui/components/src/lib/recent-playlists/playlist-info/playlist-info.component.ts b/libs/playlist/shared/ui/src/lib/recent-playlists/playlist-info/playlist-info.component.ts similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/playlist-info/playlist-info.component.ts rename to libs/playlist/shared/ui/src/lib/recent-playlists/playlist-info/playlist-info.component.ts diff --git a/libs/ui/components/src/lib/recent-playlists/playlist-item/playlist-item.component.html b/libs/playlist/shared/ui/src/lib/recent-playlists/playlist-item/playlist-item.component.html similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/playlist-item/playlist-item.component.html rename to libs/playlist/shared/ui/src/lib/recent-playlists/playlist-item/playlist-item.component.html diff --git a/libs/ui/components/src/lib/recent-playlists/playlist-item/playlist-item.component.scss b/libs/playlist/shared/ui/src/lib/recent-playlists/playlist-item/playlist-item.component.scss similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/playlist-item/playlist-item.component.scss rename to libs/playlist/shared/ui/src/lib/recent-playlists/playlist-item/playlist-item.component.scss diff --git a/libs/ui/components/src/lib/recent-playlists/playlist-item/playlist-item.component.spec.ts b/libs/playlist/shared/ui/src/lib/recent-playlists/playlist-item/playlist-item.component.spec.ts similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/playlist-item/playlist-item.component.spec.ts rename to libs/playlist/shared/ui/src/lib/recent-playlists/playlist-item/playlist-item.component.spec.ts diff --git a/libs/ui/components/src/lib/recent-playlists/playlist-item/playlist-item.component.ts b/libs/playlist/shared/ui/src/lib/recent-playlists/playlist-item/playlist-item.component.ts similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/playlist-item/playlist-item.component.ts rename to libs/playlist/shared/ui/src/lib/recent-playlists/playlist-item/playlist-item.component.ts diff --git a/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.html b/libs/playlist/shared/ui/src/lib/recent-playlists/recent-playlists.component.html similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/recent-playlists.component.html rename to libs/playlist/shared/ui/src/lib/recent-playlists/recent-playlists.component.html diff --git a/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.scss b/libs/playlist/shared/ui/src/lib/recent-playlists/recent-playlists.component.scss similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/recent-playlists.component.scss rename to libs/playlist/shared/ui/src/lib/recent-playlists/recent-playlists.component.scss diff --git a/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.spec.ts b/libs/playlist/shared/ui/src/lib/recent-playlists/recent-playlists.component.spec.ts similarity index 100% rename from libs/ui/components/src/lib/recent-playlists/recent-playlists.component.spec.ts rename to libs/playlist/shared/ui/src/lib/recent-playlists/recent-playlists.component.spec.ts diff --git a/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.ts b/libs/playlist/shared/ui/src/lib/recent-playlists/recent-playlists.component.ts similarity index 99% rename from libs/ui/components/src/lib/recent-playlists/recent-playlists.component.ts rename to libs/playlist/shared/ui/src/lib/recent-playlists/recent-playlists.component.ts index 91bb06415..6b93357db 100644 --- a/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.ts +++ b/libs/playlist/shared/ui/src/lib/recent-playlists/recent-playlists.component.ts @@ -22,10 +22,10 @@ import { } from 'm3u-state'; import { NgxSkeletonLoaderComponent } from 'ngx-skeleton-loader'; import { BehaviorSubject, combineLatest, map } from 'rxjs'; +import { DialogService } from 'components'; import { DatabaseService, DataService, SortBy, SortService } from 'services'; import { PLAYLIST_UPDATE, PlaylistMeta } from 'shared-interfaces'; import { PlaylistType } from '../add-playlist-menu/add-playlist-menu.component'; -import { DialogService } from '../confirm-dialog/dialog.service'; import { EmptyStateComponent } from './empty-state/empty-state.component'; import { PlaylistInfoComponent } from './playlist-info/playlist-info.component'; import { PlaylistItemComponent } from './playlist-item/playlist-item.component'; diff --git a/libs/playlist/shared/ui/tsconfig.json b/libs/playlist/shared/ui/tsconfig.json new file mode 100644 index 000000000..7d33479d8 --- /dev/null +++ b/libs/playlist/shared/ui/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "isolatedModules": true, + "target": "es2022", + "moduleResolution": "bundler", + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "emitDecoratorMetadata": false, + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/libs/playlist/shared/ui/tsconfig.lib.json b/libs/playlist/shared/ui/tsconfig.lib.json new file mode 100644 index 000000000..7fba372dc --- /dev/null +++ b/libs/playlist/shared/ui/tsconfig.lib.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/libs/playlist/shared/util/project.json b/libs/playlist/shared/util/project.json new file mode 100644 index 000000000..9b55122b0 --- /dev/null +++ b/libs/playlist/shared/util/project.json @@ -0,0 +1,13 @@ +{ + "name": "playlist-shared-util", + "$schema": "../../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/playlist/shared/util/src", + "prefix": "lib", + "projectType": "library", + "tags": ["scope:playlist", "domain:m3u", "type:util"], + "targets": { + "lint": { + "executor": "@nx/eslint:lint" + } + } +} diff --git a/libs/playlist/shared/util/src/index.ts b/libs/playlist/shared/util/src/index.ts new file mode 100644 index 000000000..453ebcf86 --- /dev/null +++ b/libs/playlist/shared/util/src/index.ts @@ -0,0 +1 @@ +export * from './lib/playlist-player-actions'; diff --git a/libs/playlist/m3u/feature-player/src/lib/playlist-player-actions.ts b/libs/playlist/shared/util/src/lib/playlist-player-actions.ts similarity index 100% rename from libs/playlist/m3u/feature-player/src/lib/playlist-player-actions.ts rename to libs/playlist/shared/util/src/lib/playlist-player-actions.ts diff --git a/libs/playlist/shared/util/tsconfig.json b/libs/playlist/shared/util/tsconfig.json new file mode 100644 index 000000000..7d33479d8 --- /dev/null +++ b/libs/playlist/shared/util/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "isolatedModules": true, + "target": "es2022", + "moduleResolution": "bundler", + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "emitDecoratorMetadata": false, + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/libs/playlist/shared/util/tsconfig.lib.json b/libs/playlist/shared/util/tsconfig.lib.json new file mode 100644 index 000000000..7fba372dc --- /dev/null +++ b/libs/playlist/shared/util/tsconfig.lib.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/libs/portal/catalog/feature/project.json b/libs/portal/catalog/feature/project.json index c57de76ad..b5eec6cb8 100644 --- a/libs/portal/catalog/feature/project.json +++ b/libs/portal/catalog/feature/project.json @@ -4,7 +4,7 @@ "sourceRoot": "libs/portal/catalog/feature/src", "prefix": "lib", "projectType": "library", - "tags": ["scope:shared", "type:feature"], + "tags": ["scope:portal", "domain:portal-shared", "type:feature"], "targets": { "lint": { "executor": "@nx/eslint:lint" diff --git a/libs/portal/catalog/feature/src/lib/category-content-view/category-content-view.component.html b/libs/portal/catalog/feature/src/lib/category-content-view/category-content-view.component.html index 5568fafca..bc50ea75a 100644 --- a/libs/portal/catalog/feature/src/lib/category-content-view/category-content-view.component.html +++ b/libs/portal/catalog/feature/src/lib/category-content-view/category-content-view.component.html @@ -1,34 +1,6 @@ @if (selectedCategory()) { - @if (isStalker && selectedStalkerItem()) { - @if (contentType() === 'vod') { - @if (selectedStalkerItem().series?.length > 0) { - - - } @else if (selectedStalkerItem().is_series) { - - - } @else { - @if (vodDetailsItem()) { - - } - } - } @else if (contentType() === 'series') { - - } + @if (selectedDetailComponent(); as detailComponentRef) { + } @else {
@@ -40,7 +12,7 @@ {{ categoryItemSubtitle() }}
- @if (!isStalker) { + @if (canSortContent()) {