From 21efb82055bca6a11674ec93cce4e56966d7a113 Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Fri, 22 Sep 2023 06:22:47 +0300 Subject: [PATCH] Fix errors found by linter --- scripts/core/htmlTable.ts | 10 +- scripts/core/issueLoader.ts | 2 +- scripts/core/issueParser.ts | 3 +- scripts/core/logParser.ts | 2 +- scripts/core/playlistParser.ts | 2 +- scripts/generators/categoriesGenerator.ts | 108 +++++----- scripts/generators/countriesGenerator.ts | 170 +++++++-------- scripts/generators/index.ts | 20 +- scripts/generators/indexCategoryGenerator.ts | 106 +++++----- scripts/generators/indexCountryGenerator.ts | 208 +++++++++---------- scripts/generators/indexGenerator.ts | 64 +++--- scripts/generators/indexLanguageGenerator.ts | 104 +++++----- scripts/generators/indexNsfwGenerator.ts | 60 +++--- scripts/generators/indexRegionGenerator.ts | 166 +++++++-------- scripts/generators/languagesGenerator.ts | 102 ++++----- scripts/generators/regionsGenerator.ts | 104 +++++----- scripts/models/playlist.ts | 4 +- scripts/tables/countryTable.ts | 2 +- tests/commands/api/generate.test.ts | 4 +- tests/commands/playlist/format.test.ts | 2 +- tests/commands/playlist/generate.test.ts | 6 +- tests/commands/playlist/update.test.ts | 2 +- tests/commands/playlist/validate.test.ts | 8 +- tests/commands/readme/update.test.ts | 2 +- 24 files changed, 632 insertions(+), 629 deletions(-) diff --git a/scripts/core/htmlTable.ts b/scripts/core/htmlTable.ts index 12c39bbea..1caa85fa0 100644 --- a/scripts/core/htmlTable.ts +++ b/scripts/core/htmlTable.ts @@ -19,19 +19,19 @@ export class HTMLTable { let output = '\n' output += ' \n ' - for (let column of this.columns) { + for (const column of this.columns) { output += `` } output += '\n \n' output += ' \n' - for (let item of this.data) { + for (const item of this.data) { output += ' ' let i = 0 - for (let prop in item) { + for (const prop in item) { const column = this.columns[i] - let nowrap = column.nowrap ? ` nowrap` : '' - let align = column.align ? ` align="${column.align}"` : '' + const nowrap = column.nowrap ? ' nowrap' : '' + const align = column.align ? ` align="${column.align}"` : '' output += `${item[prop]}` i++ } diff --git a/scripts/core/issueLoader.ts b/scripts/core/issueLoader.ts index 84f1177a2..34c7cb2b0 100644 --- a/scripts/core/issueLoader.ts +++ b/scripts/core/issueLoader.ts @@ -11,7 +11,7 @@ const octokit = new CustomOctokit() export class IssueLoader { async load({ labels }: { labels: string[] | string }) { labels = Array.isArray(labels) ? labels.join(',') : labels - let issues: any[] = [] + let issues: object[] = [] if (TESTING) { switch (labels) { case 'streams:add': diff --git a/scripts/core/issueParser.ts b/scripts/core/issueParser.ts index fc545ad6c..196e03920 100644 --- a/scripts/core/issueParser.ts +++ b/scripts/core/issueParser.ts @@ -1,6 +1,5 @@ import { Dictionary } from '@freearhey/core' import { Issue } from '../models' -import _ from 'lodash' const FIELDS = new Dictionary({ 'Channel ID': 'channel_id', @@ -21,7 +20,7 @@ const FIELDS = new Dictionary({ }) export class IssueParser { - parse(issue: any): Issue { + parse(issue: { number: number; body: string; labels: { name: string }[] }): Issue { const fields = issue.body.split('###') const data = new Dictionary() diff --git a/scripts/core/logParser.ts b/scripts/core/logParser.ts index 51b739fc9..322858e0c 100644 --- a/scripts/core/logParser.ts +++ b/scripts/core/logParser.ts @@ -4,7 +4,7 @@ export type LogItem = { } export class LogParser { - parse(content: string): any[] { + parse(content: string): LogItem[] { if (!content) return [] const lines = content.split('\n') diff --git a/scripts/core/playlistParser.ts b/scripts/core/playlistParser.ts index 776eb0cfd..296288e13 100644 --- a/scripts/core/playlistParser.ts +++ b/scripts/core/playlistParser.ts @@ -14,7 +14,7 @@ export class PlaylistParser { async parse(files: string[]): Promise { let streams = new Collection() - for (let filepath of files) { + for (const filepath of files) { const relativeFilepath = filepath.replace(path.normalize(STREAMS_DIR), '') const _streams: Collection = await this.parseFile(relativeFilepath) streams = streams.concat(_streams) diff --git a/scripts/generators/categoriesGenerator.ts b/scripts/generators/categoriesGenerator.ts index cf768b982..672af3d90 100644 --- a/scripts/generators/categoriesGenerator.ts +++ b/scripts/generators/categoriesGenerator.ts @@ -1,55 +1,53 @@ -import { Generator } from './generator' -import { Collection, Storage, Logger } from '@freearhey/core' -import { Stream, Category, Playlist } from '../models' -import { PUBLIC_DIR } from '../constants' - -type CategoriesGeneratorProps = { - streams: Collection - categories: Collection - logger: Logger -} - -export class CategoriesGenerator implements Generator { - streams: Collection - categories: Collection - storage: Storage - logger: Logger - - constructor({ streams, categories, logger }: CategoriesGeneratorProps) { - this.streams = streams - this.categories = categories - this.storage = new Storage(PUBLIC_DIR) - this.logger = logger - } - - async generate() { - const streams = this.streams.orderBy([(stream: Stream) => stream.getTitle()]) - - this.categories.forEach(async (category: Category) => { - let categoryStreams = streams - .filter((stream: Stream) => stream.hasCategory(category)) - .map((stream: Stream) => { - const groupTitle = stream.categories - ? stream.categories - .map((category: Category) => category.name) - .sort() - .join(';') - : '' - stream.groupTitle = groupTitle - - return stream - }) - - const playlist = new Playlist(categoryStreams, { public: true }) - const filepath = `categories/${category.id}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - }) - - const undefinedStreams = streams.filter((stream: Stream) => stream.noCategories()) - const playlist = new Playlist(undefinedStreams, { public: true }) - const filepath = `categories/undefined.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - } -} +import { Generator } from './generator' +import { Collection, Storage, Logger } from '@freearhey/core' +import { Stream, Category, Playlist } from '../models' +import { PUBLIC_DIR } from '../constants' + +type CategoriesGeneratorProps = { + streams: Collection + categories: Collection + logger: Logger +} + +export class CategoriesGenerator implements Generator { + streams: Collection + categories: Collection + storage: Storage + logger: Logger + + constructor({ streams, categories, logger }: CategoriesGeneratorProps) { + this.streams = streams + this.categories = categories + this.storage = new Storage(PUBLIC_DIR) + this.logger = logger + } + + async generate() { + const streams = this.streams.orderBy([(stream: Stream) => stream.getTitle()]) + + this.categories.forEach(async (category: Category) => { + const categoryStreams = streams + .filter((stream: Stream) => stream.hasCategory(category)) + .map((stream: Stream) => { + const streamCategories = stream.categories + .map((category: Category) => category.name) + .sort() + const groupTitle = stream.categories ? streamCategories.join(';') : '' + stream.groupTitle = groupTitle + + return stream + }) + + const playlist = new Playlist(categoryStreams, { public: true }) + const filepath = `categories/${category.id}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + }) + + const undefinedStreams = streams.filter((stream: Stream) => stream.noCategories()) + const playlist = new Playlist(undefinedStreams, { public: true }) + const filepath = 'categories/undefined.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + } +} diff --git a/scripts/generators/countriesGenerator.ts b/scripts/generators/countriesGenerator.ts index 158bf031c..0b5bc8c11 100644 --- a/scripts/generators/countriesGenerator.ts +++ b/scripts/generators/countriesGenerator.ts @@ -1,85 +1,85 @@ -import { Generator } from './generator' -import { Collection, Storage, Logger } from '@freearhey/core' -import { Country, Region, Subdivision, Stream, Playlist } from '../models' -import { PUBLIC_DIR } from '../constants' - -type CountriesGeneratorProps = { - streams: Collection - regions: Collection - subdivisions: Collection - countries: Collection - logger: Logger -} - -export class CountriesGenerator implements Generator { - streams: Collection - countries: Collection - regions: Collection - subdivisions: Collection - storage: Storage - logger: Logger - - constructor({ streams, countries, regions, subdivisions, logger }: CountriesGeneratorProps) { - this.streams = streams - this.countries = countries - this.regions = regions - this.subdivisions = subdivisions - this.storage = new Storage(PUBLIC_DIR) - this.logger = logger - } - - async generate(): Promise { - let streams = this.streams - .orderBy([stream => stream.getTitle()]) - .filter((stream: Stream) => stream.isSFW()) - let regions = this.regions.filter((region: Region) => region.code !== 'INT') - - this.countries.forEach(async (country: Country) => { - const countrySubdivisions = this.subdivisions.filter( - (subdivision: Subdivision) => subdivision.country === country.code - ) - - const countrySubdivisionsCodes = countrySubdivisions.map( - (subdivision: Subdivision) => `s/${subdivision.code}` - ) - - const countryAreaCodes = regions - .filter((region: Region) => region.countries.includes(country.code)) - .map((region: Region) => `r/${region.code}`) - .concat(countrySubdivisionsCodes) - .add(`c/${country.code}`) - - const countryStreams = streams.filter(stream => - stream.broadcastArea.intersects(countryAreaCodes) - ) - - if (countryStreams.isEmpty()) return - - const playlist = new Playlist(countryStreams, { public: true }) - const filepath = `countries/${country.code.toLowerCase()}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - - countrySubdivisions.forEach(async (subdivision: Subdivision) => { - const subdivisionStreams = streams.filter(stream => - stream.broadcastArea.includes(`s/${subdivision.code}`) - ) - - if (subdivisionStreams.isEmpty()) return - - const playlist = new Playlist(subdivisionStreams, { public: true }) - const filepath = `subdivisions/${subdivision.code.toLowerCase()}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - }) - }) - - const internationalStreams = streams.filter(stream => stream.isInternational()) - if (internationalStreams.notEmpty()) { - const playlist = new Playlist(internationalStreams, { public: true }) - const filepath = `countries/int.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - } - } -} +import { Generator } from './generator' +import { Collection, Storage, Logger } from '@freearhey/core' +import { Country, Region, Subdivision, Stream, Playlist } from '../models' +import { PUBLIC_DIR } from '../constants' + +type CountriesGeneratorProps = { + streams: Collection + regions: Collection + subdivisions: Collection + countries: Collection + logger: Logger +} + +export class CountriesGenerator implements Generator { + streams: Collection + countries: Collection + regions: Collection + subdivisions: Collection + storage: Storage + logger: Logger + + constructor({ streams, countries, regions, subdivisions, logger }: CountriesGeneratorProps) { + this.streams = streams + this.countries = countries + this.regions = regions + this.subdivisions = subdivisions + this.storage = new Storage(PUBLIC_DIR) + this.logger = logger + } + + async generate(): Promise { + const streams = this.streams + .orderBy([stream => stream.getTitle()]) + .filter((stream: Stream) => stream.isSFW()) + const regions = this.regions.filter((region: Region) => region.code !== 'INT') + + this.countries.forEach(async (country: Country) => { + const countrySubdivisions = this.subdivisions.filter( + (subdivision: Subdivision) => subdivision.country === country.code + ) + + const countrySubdivisionsCodes = countrySubdivisions.map( + (subdivision: Subdivision) => `s/${subdivision.code}` + ) + + const countryAreaCodes = regions + .filter((region: Region) => region.countries.includes(country.code)) + .map((region: Region) => `r/${region.code}`) + .concat(countrySubdivisionsCodes) + .add(`c/${country.code}`) + + const countryStreams = streams.filter(stream => + stream.broadcastArea.intersects(countryAreaCodes) + ) + + if (countryStreams.isEmpty()) return + + const playlist = new Playlist(countryStreams, { public: true }) + const filepath = `countries/${country.code.toLowerCase()}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + + countrySubdivisions.forEach(async (subdivision: Subdivision) => { + const subdivisionStreams = streams.filter(stream => + stream.broadcastArea.includes(`s/${subdivision.code}`) + ) + + if (subdivisionStreams.isEmpty()) return + + const playlist = new Playlist(subdivisionStreams, { public: true }) + const filepath = `subdivisions/${subdivision.code.toLowerCase()}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + }) + }) + + const internationalStreams = streams.filter(stream => stream.isInternational()) + if (internationalStreams.notEmpty()) { + const playlist = new Playlist(internationalStreams, { public: true }) + const filepath = 'countries/int.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + } + } +} diff --git a/scripts/generators/index.ts b/scripts/generators/index.ts index f2825f0c4..18b6c8e62 100644 --- a/scripts/generators/index.ts +++ b/scripts/generators/index.ts @@ -1,10 +1,10 @@ -export * from './categoriesGenerator' -export * from './countriesGenerator' -export * from './languagesGenerator' -export * from './regionsGenerator' -export * from './indexGenerator' -export * from './indexNsfwGenerator' -export * from './indexCategoryGenerator' -export * from './indexCountryGenerator' -export * from './indexLanguageGenerator' -export * from './indexRegionGenerator' +export * from './categoriesGenerator' +export * from './countriesGenerator' +export * from './languagesGenerator' +export * from './regionsGenerator' +export * from './indexGenerator' +export * from './indexNsfwGenerator' +export * from './indexCategoryGenerator' +export * from './indexCountryGenerator' +export * from './indexLanguageGenerator' +export * from './indexRegionGenerator' diff --git a/scripts/generators/indexCategoryGenerator.ts b/scripts/generators/indexCategoryGenerator.ts index fb4647e3a..8fd5f2cbf 100644 --- a/scripts/generators/indexCategoryGenerator.ts +++ b/scripts/generators/indexCategoryGenerator.ts @@ -1,53 +1,53 @@ -import { Generator } from './generator' -import { Collection, Storage, Logger } from '@freearhey/core' -import { Stream, Playlist, Category } from '../models' -import { PUBLIC_DIR } from '../constants' - -type IndexCategoryGeneratorProps = { - streams: Collection - logger: Logger -} - -export class IndexCategoryGenerator implements Generator { - streams: Collection - storage: Storage - logger: Logger - - constructor({ streams, logger }: IndexCategoryGeneratorProps) { - this.streams = streams - this.storage = new Storage(PUBLIC_DIR) - this.logger = logger - } - - async generate(): Promise { - const streams = this.streams - .orderBy(stream => stream.getTitle()) - .filter(stream => stream.isSFW()) - - let groupedStreams = new Collection() - streams.forEach((stream: Stream) => { - if (stream.noCategories()) { - const streamClone = stream.clone() - streamClone.groupTitle = 'Undefined' - groupedStreams.add(streamClone) - return - } - - stream.categories.forEach((category: Category) => { - const streamClone = stream.clone() - streamClone.groupTitle = category.name - groupedStreams.push(streamClone) - }) - }) - - groupedStreams = groupedStreams.orderBy(stream => { - if (stream.groupTitle === 'Undefined') return 'ZZ' - return stream.groupTitle - }) - - const playlist = new Playlist(groupedStreams, { public: true }) - const filepath = 'index.category.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - } -} +import { Generator } from './generator' +import { Collection, Storage, Logger } from '@freearhey/core' +import { Stream, Playlist, Category } from '../models' +import { PUBLIC_DIR } from '../constants' + +type IndexCategoryGeneratorProps = { + streams: Collection + logger: Logger +} + +export class IndexCategoryGenerator implements Generator { + streams: Collection + storage: Storage + logger: Logger + + constructor({ streams, logger }: IndexCategoryGeneratorProps) { + this.streams = streams + this.storage = new Storage(PUBLIC_DIR) + this.logger = logger + } + + async generate(): Promise { + const streams = this.streams + .orderBy(stream => stream.getTitle()) + .filter(stream => stream.isSFW()) + + let groupedStreams = new Collection() + streams.forEach((stream: Stream) => { + if (stream.noCategories()) { + const streamClone = stream.clone() + streamClone.groupTitle = 'Undefined' + groupedStreams.add(streamClone) + return + } + + stream.categories.forEach((category: Category) => { + const streamClone = stream.clone() + streamClone.groupTitle = category.name + groupedStreams.push(streamClone) + }) + }) + + groupedStreams = groupedStreams.orderBy(stream => { + if (stream.groupTitle === 'Undefined') return 'ZZ' + return stream.groupTitle + }) + + const playlist = new Playlist(groupedStreams, { public: true }) + const filepath = 'index.category.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + } +} diff --git a/scripts/generators/indexCountryGenerator.ts b/scripts/generators/indexCountryGenerator.ts index 72974e6d8..dcdb214f8 100644 --- a/scripts/generators/indexCountryGenerator.ts +++ b/scripts/generators/indexCountryGenerator.ts @@ -1,104 +1,104 @@ -import { Generator } from './generator' -import { Collection, Storage, Logger } from '@freearhey/core' -import { Stream, Playlist, Country, Subdivision, Region } from '../models' -import { PUBLIC_DIR } from '../constants' - -type IndexCountryGeneratorProps = { - streams: Collection - regions: Collection - countries: Collection - subdivisions: Collection - logger: Logger -} - -export class IndexCountryGenerator implements Generator { - streams: Collection - countries: Collection - regions: Collection - subdivisions: Collection - storage: Storage - logger: Logger - - constructor({ streams, regions, countries, subdivisions, logger }: IndexCountryGeneratorProps) { - this.streams = streams - this.countries = countries - this.regions = regions - this.subdivisions = subdivisions - this.storage = new Storage(PUBLIC_DIR) - this.logger = logger - } - - async generate(): Promise { - let groupedStreams = new Collection() - - this.streams - .orderBy(stream => stream.getTitle()) - .filter(stream => stream.isSFW()) - .forEach(stream => { - if (stream.noBroadcastArea()) { - const streamClone = stream.clone() - streamClone.groupTitle = 'Undefined' - groupedStreams.add(streamClone) - return - } - - if (stream.isInternational()) { - const streamClone = stream.clone() - streamClone.groupTitle = 'International' - groupedStreams.add(streamClone) - } - - this.getStreamBroadcastCountries(stream).forEach((country: Country) => { - const streamClone = stream.clone() - streamClone.groupTitle = country.name - groupedStreams.add(streamClone) - }) - }) - - groupedStreams = groupedStreams.orderBy((stream: Stream) => { - if (stream.groupTitle === 'International') return 'ZZ' - if (stream.groupTitle === 'Undefined') return 'ZZZ' - - return stream.groupTitle - }) - - const playlist = new Playlist(groupedStreams, { public: true }) - const filepath = 'index.country.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - } - - getStreamBroadcastCountries(stream: Stream) { - const groupedRegions = this.regions.keyBy((region: Region) => region.code) - const groupedCountries = this.countries.keyBy((country: Country) => country.code) - const groupedSubdivisions = this.subdivisions.keyBy( - (subdivision: Subdivision) => subdivision.code - ) - - let broadcastCountries = new Collection() - - stream.broadcastArea.forEach(broadcastAreaCode => { - const [type, code] = broadcastAreaCode.split('/') - switch (type) { - case 'c': - broadcastCountries.add(code) - break - case 'r': - if (code !== 'INT' && groupedRegions.has(code)) { - broadcastCountries = broadcastCountries.concat(groupedRegions.get(code).countries) - } - break - case 's': - if (groupedSubdivisions.has(code)) { - broadcastCountries.add(groupedSubdivisions.get(code).country) - } - break - } - }) - - return broadcastCountries - .uniq() - .map(code => groupedCountries.get(code)) - .filter(Boolean) - } -} +import { Generator } from './generator' +import { Collection, Storage, Logger } from '@freearhey/core' +import { Stream, Playlist, Country, Subdivision, Region } from '../models' +import { PUBLIC_DIR } from '../constants' + +type IndexCountryGeneratorProps = { + streams: Collection + regions: Collection + countries: Collection + subdivisions: Collection + logger: Logger +} + +export class IndexCountryGenerator implements Generator { + streams: Collection + countries: Collection + regions: Collection + subdivisions: Collection + storage: Storage + logger: Logger + + constructor({ streams, regions, countries, subdivisions, logger }: IndexCountryGeneratorProps) { + this.streams = streams + this.countries = countries + this.regions = regions + this.subdivisions = subdivisions + this.storage = new Storage(PUBLIC_DIR) + this.logger = logger + } + + async generate(): Promise { + let groupedStreams = new Collection() + + this.streams + .orderBy(stream => stream.getTitle()) + .filter(stream => stream.isSFW()) + .forEach(stream => { + if (stream.noBroadcastArea()) { + const streamClone = stream.clone() + streamClone.groupTitle = 'Undefined' + groupedStreams.add(streamClone) + return + } + + if (stream.isInternational()) { + const streamClone = stream.clone() + streamClone.groupTitle = 'International' + groupedStreams.add(streamClone) + } + + this.getStreamBroadcastCountries(stream).forEach((country: Country) => { + const streamClone = stream.clone() + streamClone.groupTitle = country.name + groupedStreams.add(streamClone) + }) + }) + + groupedStreams = groupedStreams.orderBy((stream: Stream) => { + if (stream.groupTitle === 'International') return 'ZZ' + if (stream.groupTitle === 'Undefined') return 'ZZZ' + + return stream.groupTitle + }) + + const playlist = new Playlist(groupedStreams, { public: true }) + const filepath = 'index.country.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + } + + getStreamBroadcastCountries(stream: Stream) { + const groupedRegions = this.regions.keyBy((region: Region) => region.code) + const groupedCountries = this.countries.keyBy((country: Country) => country.code) + const groupedSubdivisions = this.subdivisions.keyBy( + (subdivision: Subdivision) => subdivision.code + ) + + let broadcastCountries = new Collection() + + stream.broadcastArea.forEach(broadcastAreaCode => { + const [type, code] = broadcastAreaCode.split('/') + switch (type) { + case 'c': + broadcastCountries.add(code) + break + case 'r': + if (code !== 'INT' && groupedRegions.has(code)) { + broadcastCountries = broadcastCountries.concat(groupedRegions.get(code).countries) + } + break + case 's': + if (groupedSubdivisions.has(code)) { + broadcastCountries.add(groupedSubdivisions.get(code).country) + } + break + } + }) + + return broadcastCountries + .uniq() + .map(code => groupedCountries.get(code)) + .filter(Boolean) + } +} diff --git a/scripts/generators/indexGenerator.ts b/scripts/generators/indexGenerator.ts index 96784cc6e..b4389ff5f 100644 --- a/scripts/generators/indexGenerator.ts +++ b/scripts/generators/indexGenerator.ts @@ -1,32 +1,32 @@ -import { Collection, Logger, Storage } from '@freearhey/core' -import { Stream, Playlist } from '../models' -import { Generator } from './generator' -import { PUBLIC_DIR } from '../constants' - -type IndexGeneratorProps = { - streams: Collection - logger: Logger -} - -export class IndexGenerator implements Generator { - streams: Collection - storage: Storage - logger: Logger - - constructor({ streams, logger }: IndexGeneratorProps) { - this.streams = streams - this.storage = new Storage(PUBLIC_DIR) - this.logger = logger - } - - async generate(): Promise { - const sfwStreams = this.streams - .orderBy(stream => stream.getTitle()) - .filter((stream: Stream) => stream.isSFW()) - - const playlist = new Playlist(sfwStreams, { public: true }) - const filepath = 'index.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - } -} +import { Collection, Logger, Storage } from '@freearhey/core' +import { Stream, Playlist } from '../models' +import { Generator } from './generator' +import { PUBLIC_DIR } from '../constants' + +type IndexGeneratorProps = { + streams: Collection + logger: Logger +} + +export class IndexGenerator implements Generator { + streams: Collection + storage: Storage + logger: Logger + + constructor({ streams, logger }: IndexGeneratorProps) { + this.streams = streams + this.storage = new Storage(PUBLIC_DIR) + this.logger = logger + } + + async generate(): Promise { + const sfwStreams = this.streams + .orderBy(stream => stream.getTitle()) + .filter((stream: Stream) => stream.isSFW()) + + const playlist = new Playlist(sfwStreams, { public: true }) + const filepath = 'index.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + } +} diff --git a/scripts/generators/indexLanguageGenerator.ts b/scripts/generators/indexLanguageGenerator.ts index 07f3d74aa..a64ffaada 100644 --- a/scripts/generators/indexLanguageGenerator.ts +++ b/scripts/generators/indexLanguageGenerator.ts @@ -1,52 +1,52 @@ -import { Generator } from './generator' -import { Collection, Storage, Logger } from '@freearhey/core' -import { Stream, Playlist, Language } from '../models' -import { PUBLIC_DIR } from '../constants' - -type IndexLanguageGeneratorProps = { - streams: Collection - logger: Logger -} - -export class IndexLanguageGenerator implements Generator { - streams: Collection - storage: Storage - logger: Logger - - constructor({ streams, logger }: IndexLanguageGeneratorProps) { - this.streams = streams - this.storage = new Storage(PUBLIC_DIR) - this.logger = logger - } - - async generate(): Promise { - let groupedStreams = new Collection() - this.streams - .orderBy(stream => stream.getTitle()) - .filter(stream => stream.isSFW()) - .forEach(stream => { - if (stream.noLanguages()) { - const streamClone = stream.clone() - streamClone.groupTitle = 'Undefined' - groupedStreams.add(streamClone) - return - } - - stream.languages.forEach((language: Language) => { - const streamClone = stream.clone() - streamClone.groupTitle = language.name - groupedStreams.add(streamClone) - }) - }) - - groupedStreams = groupedStreams.orderBy((stream: Stream) => { - if (stream.groupTitle === 'Undefined') return 'ZZ' - return stream.groupTitle - }) - - const playlist = new Playlist(groupedStreams, { public: true }) - const filepath = 'index.language.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - } -} +import { Generator } from './generator' +import { Collection, Storage, Logger } from '@freearhey/core' +import { Stream, Playlist, Language } from '../models' +import { PUBLIC_DIR } from '../constants' + +type IndexLanguageGeneratorProps = { + streams: Collection + logger: Logger +} + +export class IndexLanguageGenerator implements Generator { + streams: Collection + storage: Storage + logger: Logger + + constructor({ streams, logger }: IndexLanguageGeneratorProps) { + this.streams = streams + this.storage = new Storage(PUBLIC_DIR) + this.logger = logger + } + + async generate(): Promise { + let groupedStreams = new Collection() + this.streams + .orderBy(stream => stream.getTitle()) + .filter(stream => stream.isSFW()) + .forEach(stream => { + if (stream.noLanguages()) { + const streamClone = stream.clone() + streamClone.groupTitle = 'Undefined' + groupedStreams.add(streamClone) + return + } + + stream.languages.forEach((language: Language) => { + const streamClone = stream.clone() + streamClone.groupTitle = language.name + groupedStreams.add(streamClone) + }) + }) + + groupedStreams = groupedStreams.orderBy((stream: Stream) => { + if (stream.groupTitle === 'Undefined') return 'ZZ' + return stream.groupTitle + }) + + const playlist = new Playlist(groupedStreams, { public: true }) + const filepath = 'index.language.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + } +} diff --git a/scripts/generators/indexNsfwGenerator.ts b/scripts/generators/indexNsfwGenerator.ts index c0b80b9a0..a1f0a8062 100644 --- a/scripts/generators/indexNsfwGenerator.ts +++ b/scripts/generators/indexNsfwGenerator.ts @@ -1,30 +1,30 @@ -import { Collection, Logger, Storage } from '@freearhey/core' -import { Stream, Playlist } from '../models' -import { Generator } from './generator' -import { PUBLIC_DIR } from '../constants' - -type IndexNsfwGeneratorProps = { - streams: Collection - logger: Logger -} - -export class IndexNsfwGenerator implements Generator { - streams: Collection - storage: Storage - logger: Logger - - constructor({ streams, logger }: IndexNsfwGeneratorProps) { - this.streams = streams - this.storage = new Storage(PUBLIC_DIR) - this.logger = logger - } - - async generate(): Promise { - const allStreams = this.streams.orderBy((stream: Stream) => stream.getTitle()) - - const playlist = new Playlist(allStreams, { public: true }) - const filepath = 'index.nsfw.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - } -} +import { Collection, Logger, Storage } from '@freearhey/core' +import { Stream, Playlist } from '../models' +import { Generator } from './generator' +import { PUBLIC_DIR } from '../constants' + +type IndexNsfwGeneratorProps = { + streams: Collection + logger: Logger +} + +export class IndexNsfwGenerator implements Generator { + streams: Collection + storage: Storage + logger: Logger + + constructor({ streams, logger }: IndexNsfwGeneratorProps) { + this.streams = streams + this.storage = new Storage(PUBLIC_DIR) + this.logger = logger + } + + async generate(): Promise { + const allStreams = this.streams.orderBy((stream: Stream) => stream.getTitle()) + + const playlist = new Playlist(allStreams, { public: true }) + const filepath = 'index.nsfw.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + } +} diff --git a/scripts/generators/indexRegionGenerator.ts b/scripts/generators/indexRegionGenerator.ts index 9f2096866..55affcaa3 100644 --- a/scripts/generators/indexRegionGenerator.ts +++ b/scripts/generators/indexRegionGenerator.ts @@ -1,83 +1,83 @@ -import { Generator } from './generator' -import { Collection, Storage, Logger } from '@freearhey/core' -import { Stream, Playlist, Region } from '../models' -import { PUBLIC_DIR } from '../constants' - -type IndexRegionGeneratorProps = { - streams: Collection - regions: Collection - logger: Logger -} - -export class IndexRegionGenerator implements Generator { - streams: Collection - regions: Collection - storage: Storage - logger: Logger - - constructor({ streams, regions, logger }: IndexRegionGeneratorProps) { - this.streams = streams - this.regions = regions - this.storage = new Storage(PUBLIC_DIR) - this.logger = logger - } - - async generate(): Promise { - let groupedStreams = new Collection() - this.streams - .orderBy((stream: Stream) => stream.getTitle()) - .filter((stream: Stream) => stream.isSFW()) - .forEach((stream: Stream) => { - if (stream.noBroadcastArea()) { - const streamClone = stream.clone() - streamClone.groupTitle = 'Undefined' - groupedStreams.push(streamClone) - return - } - - this.getStreamRegions(stream).forEach((region: Region) => { - const streamClone = stream.clone() - streamClone.groupTitle = region.name - groupedStreams.push(streamClone) - }) - }) - - groupedStreams = groupedStreams.orderBy((stream: Stream) => { - if (stream.groupTitle === 'Undefined') return 'ZZ' - return stream.groupTitle - }) - - const playlist = new Playlist(groupedStreams, { public: true }) - const filepath = 'index.region.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - } - - getStreamRegions(stream: Stream) { - let streamRegions = new Collection() - stream.broadcastArea.forEach(broadcastAreaCode => { - const [type, code] = broadcastAreaCode.split('/') - switch (type) { - case 'r': - const groupedRegions = this.regions.keyBy((region: Region) => region.code) - streamRegions.add(groupedRegions.get(code)) - break - case 's': - const [countryCode] = code.split('-') - const subdivisionRegions = this.regions.filter((region: Region) => - region.countries.includes(countryCode) - ) - streamRegions = streamRegions.concat(subdivisionRegions) - break - case 'c': - const countryRegions = this.regions.filter((region: Region) => - region.countries.includes(code) - ) - streamRegions = streamRegions.concat(countryRegions) - break - } - }) - - return streamRegions - } -} +import { Generator } from './generator' +import { Collection, Storage, Logger } from '@freearhey/core' +import { Stream, Playlist, Region } from '../models' +import { PUBLIC_DIR } from '../constants' + +type IndexRegionGeneratorProps = { + streams: Collection + regions: Collection + logger: Logger +} + +export class IndexRegionGenerator implements Generator { + streams: Collection + regions: Collection + storage: Storage + logger: Logger + + constructor({ streams, regions, logger }: IndexRegionGeneratorProps) { + this.streams = streams + this.regions = regions + this.storage = new Storage(PUBLIC_DIR) + this.logger = logger + } + + async generate(): Promise { + let groupedStreams = new Collection() + this.streams + .orderBy((stream: Stream) => stream.getTitle()) + .filter((stream: Stream) => stream.isSFW()) + .forEach((stream: Stream) => { + if (stream.noBroadcastArea()) { + const streamClone = stream.clone() + streamClone.groupTitle = 'Undefined' + groupedStreams.push(streamClone) + return + } + + this.getStreamRegions(stream).forEach((region: Region) => { + const streamClone = stream.clone() + streamClone.groupTitle = region.name + groupedStreams.push(streamClone) + }) + }) + + groupedStreams = groupedStreams.orderBy((stream: Stream) => { + if (stream.groupTitle === 'Undefined') return 'ZZ' + return stream.groupTitle + }) + + const playlist = new Playlist(groupedStreams, { public: true }) + const filepath = 'index.region.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + } + + getStreamRegions(stream: Stream) { + let streamRegions = new Collection() + stream.broadcastArea.forEach(broadcastAreaCode => { + const [type, code] = broadcastAreaCode.split('/') + switch (type) { + case 'r': + const groupedRegions = this.regions.keyBy((region: Region) => region.code) + streamRegions.add(groupedRegions.get(code)) + break + case 's': + const [countryCode] = code.split('-') + const subdivisionRegions = this.regions.filter((region: Region) => + region.countries.includes(countryCode) + ) + streamRegions = streamRegions.concat(subdivisionRegions) + break + case 'c': + const countryRegions = this.regions.filter((region: Region) => + region.countries.includes(code) + ) + streamRegions = streamRegions.concat(countryRegions) + break + } + }) + + return streamRegions + } +} diff --git a/scripts/generators/languagesGenerator.ts b/scripts/generators/languagesGenerator.ts index 5a158a761..d40d53d9b 100644 --- a/scripts/generators/languagesGenerator.ts +++ b/scripts/generators/languagesGenerator.ts @@ -1,50 +1,52 @@ -import { Generator } from './generator' -import { Collection, Storage, Logger } from '@freearhey/core' -import { Playlist, Language, Stream } from '../models' -import { PUBLIC_DIR } from '../constants' - -type LanguagesGeneratorProps = { streams: Collection; logger: Logger } - -export class LanguagesGenerator implements Generator { - streams: Collection - storage: Storage - logger: Logger - - constructor({ streams, logger }: LanguagesGeneratorProps) { - this.streams = streams - this.storage = new Storage(PUBLIC_DIR) - this.logger = logger - } - - async generate(): Promise { - let streams = this.streams.orderBy(stream => stream.getTitle()).filter(stream => stream.isSFW()) - - let languages = new Collection() - streams.forEach((stream: Stream) => { - languages = languages.concat(stream.languages) - }) - - languages - .uniqBy((language: Language) => language.code) - .orderBy((language: Language) => language.name) - .forEach(async (language: Language) => { - const languageStreams = streams.filter(stream => stream.hasLanguage(language)) - - if (languageStreams.isEmpty()) return - - const playlist = new Playlist(languageStreams, { public: true }) - const filepath = `languages/${language.code}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - }) - - const undefinedStreams = streams.filter(stream => stream.noLanguages()) - - if (undefinedStreams.isEmpty()) return - - const playlist = new Playlist(undefinedStreams, { public: true }) - const filepath = 'languages/undefined.m3u' - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - } -} +import { Generator } from './generator' +import { Collection, Storage, Logger } from '@freearhey/core' +import { Playlist, Language, Stream } from '../models' +import { PUBLIC_DIR } from '../constants' + +type LanguagesGeneratorProps = { streams: Collection; logger: Logger } + +export class LanguagesGenerator implements Generator { + streams: Collection + storage: Storage + logger: Logger + + constructor({ streams, logger }: LanguagesGeneratorProps) { + this.streams = streams + this.storage = new Storage(PUBLIC_DIR) + this.logger = logger + } + + async generate(): Promise { + const streams = this.streams + .orderBy(stream => stream.getTitle()) + .filter(stream => stream.isSFW()) + + let languages = new Collection() + streams.forEach((stream: Stream) => { + languages = languages.concat(stream.languages) + }) + + languages + .uniqBy((language: Language) => language.code) + .orderBy((language: Language) => language.name) + .forEach(async (language: Language) => { + const languageStreams = streams.filter(stream => stream.hasLanguage(language)) + + if (languageStreams.isEmpty()) return + + const playlist = new Playlist(languageStreams, { public: true }) + const filepath = `languages/${language.code}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + }) + + const undefinedStreams = streams.filter(stream => stream.noLanguages()) + + if (undefinedStreams.isEmpty()) return + + const playlist = new Playlist(undefinedStreams, { public: true }) + const filepath = 'languages/undefined.m3u' + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + } +} diff --git a/scripts/generators/regionsGenerator.ts b/scripts/generators/regionsGenerator.ts index f6918951c..9c29ee3a2 100644 --- a/scripts/generators/regionsGenerator.ts +++ b/scripts/generators/regionsGenerator.ts @@ -1,51 +1,53 @@ -import { Generator } from './generator' -import { Collection, Storage, Logger } from '@freearhey/core' -import { Playlist, Subdivision, Region } from '../models' -import { PUBLIC_DIR } from '../constants' - -type RegionsGeneratorProps = { - streams: Collection - regions: Collection - subdivisions: Collection - logger: Logger -} - -export class RegionsGenerator implements Generator { - streams: Collection - regions: Collection - subdivisions: Collection - storage: Storage - logger: Logger - - constructor({ streams, regions, subdivisions, logger }: RegionsGeneratorProps) { - this.streams = streams - this.regions = regions - this.subdivisions = subdivisions - this.storage = new Storage(PUBLIC_DIR) - this.logger = logger - } - - async generate(): Promise { - let streams = this.streams.orderBy(stream => stream.getTitle()).filter(stream => stream.isSFW()) - - this.regions.forEach(async (region: Region) => { - if (region.code === 'INT') return - - const regionSubdivisionsCodes = this.subdivisions - .filter((subdivision: Subdivision) => region.countries.indexOf(subdivision.country) > -1) - .map((subdivision: Subdivision) => `s/${subdivision.code}`) - - const regionCodes = region.countries - .map((code: string) => `c/${code}`) - .concat(regionSubdivisionsCodes) - .add(`r/${region.code}`) - - const regionStreams = streams.filter(stream => stream.broadcastArea.intersects(regionCodes)) - - const playlist = new Playlist(regionStreams, { public: true }) - const filepath = `regions/${region.code.toLowerCase()}.m3u` - await this.storage.save(filepath, playlist.toString()) - this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) - }) - } -} +import { Generator } from './generator' +import { Collection, Storage, Logger } from '@freearhey/core' +import { Playlist, Subdivision, Region } from '../models' +import { PUBLIC_DIR } from '../constants' + +type RegionsGeneratorProps = { + streams: Collection + regions: Collection + subdivisions: Collection + logger: Logger +} + +export class RegionsGenerator implements Generator { + streams: Collection + regions: Collection + subdivisions: Collection + storage: Storage + logger: Logger + + constructor({ streams, regions, subdivisions, logger }: RegionsGeneratorProps) { + this.streams = streams + this.regions = regions + this.subdivisions = subdivisions + this.storage = new Storage(PUBLIC_DIR) + this.logger = logger + } + + async generate(): Promise { + const streams = this.streams + .orderBy(stream => stream.getTitle()) + .filter(stream => stream.isSFW()) + + this.regions.forEach(async (region: Region) => { + if (region.code === 'INT') return + + const regionSubdivisionsCodes = this.subdivisions + .filter((subdivision: Subdivision) => region.countries.indexOf(subdivision.country) > -1) + .map((subdivision: Subdivision) => `s/${subdivision.code}`) + + const regionCodes = region.countries + .map((code: string) => `c/${code}`) + .concat(regionSubdivisionsCodes) + .add(`r/${region.code}`) + + const regionStreams = streams.filter(stream => stream.broadcastArea.intersects(regionCodes)) + + const playlist = new Playlist(regionStreams, { public: true }) + const filepath = `regions/${region.code.toLowerCase()}.m3u` + await this.storage.save(filepath, playlist.toString()) + this.logger.info(JSON.stringify({ filepath, count: playlist.streams.count() })) + }) + } +} diff --git a/scripts/models/playlist.ts b/scripts/models/playlist.ts index 6266282cc..ba0a25c5c 100644 --- a/scripts/models/playlist.ts +++ b/scripts/models/playlist.ts @@ -17,10 +17,10 @@ export class Playlist { } toString() { - let output = `#EXTM3U\n` + let output = '#EXTM3U\n' this.streams.forEach((stream: Stream) => { - output += stream.toString(this.options) + `\n` + output += stream.toString(this.options) + '\n' }) return output diff --git a/scripts/tables/countryTable.ts b/scripts/tables/countryTable.ts index c85a59a37..5e167b7fd 100644 --- a/scripts/tables/countryTable.ts +++ b/scripts/tables/countryTable.ts @@ -48,7 +48,7 @@ export class CountryTable implements Table { } else if (countryCode === 'INT') { data.add([ 'ZZ', - `🌍 International`, + '🌍 International', logItem.count, `https://iptv-org.github.io/iptv/${logItem.filepath}` ]) diff --git a/tests/commands/api/generate.test.ts b/tests/commands/api/generate.test.ts index fe3c1215d..86e34ce08 100644 --- a/tests/commands/api/generate.test.ts +++ b/tests/commands/api/generate.test.ts @@ -4,14 +4,14 @@ import fs from 'fs-extra' beforeEach(() => { fs.emptyDirSync('tests/__data__/output') - const stdout = execSync( + execSync( 'STREAMS_DIR=tests/__data__/input/streams_generate API_DIR=tests/__data__/output/.api npm run api:generate', { encoding: 'utf8' } ) }) it('can create streams.json', () => { - expect(content(`output/.api/streams.json`)).toMatchObject(content(`expected/.api/streams.json`)) + expect(content('output/.api/streams.json')).toMatchObject(content('expected/.api/streams.json')) }) function content(filepath: string) { diff --git a/tests/commands/playlist/format.test.ts b/tests/commands/playlist/format.test.ts index 0c867dd36..6a9fbafc5 100644 --- a/tests/commands/playlist/format.test.ts +++ b/tests/commands/playlist/format.test.ts @@ -8,7 +8,7 @@ beforeEach(() => { }) it('can format playlists', () => { - const stdout = execSync('STREAMS_DIR=tests/__data__/output/streams npm run playlist:format', { + execSync('STREAMS_DIR=tests/__data__/output/streams npm run playlist:format', { encoding: 'utf8' }) diff --git a/tests/commands/playlist/generate.test.ts b/tests/commands/playlist/generate.test.ts index 8c6d80d6a..8cdbfeee8 100644 --- a/tests/commands/playlist/generate.test.ts +++ b/tests/commands/playlist/generate.test.ts @@ -5,7 +5,7 @@ import * as glob from 'glob' beforeEach(() => { fs.emptyDirSync('tests/__data__/output') - const stdout = execSync( + execSync( 'STREAMS_DIR=tests/__data__/input/streams_generate DATA_DIR=tests/__data__/input/data PUBLIC_DIR=tests/__data__/output/.gh-pages LOGS_DIR=tests/__data__/output/logs npm run playlist:generate', { encoding: 'utf8' } ) @@ -20,8 +20,8 @@ it('can generate playlists and logs', () => { expect(content(`output/${filepath}`), filepath).toBe(content(`expected/${filepath}`)) }) - expect(content(`output/logs/generators.log`).split('\n').sort()).toStrictEqual( - content(`expected/logs/generators.log`).split('\n').sort() + expect(content('output/logs/generators.log').split('\n').sort()).toStrictEqual( + content('expected/logs/generators.log').split('\n').sort() ) }) diff --git a/tests/commands/playlist/update.test.ts b/tests/commands/playlist/update.test.ts index 3b438ac79..d9c637db0 100644 --- a/tests/commands/playlist/update.test.ts +++ b/tests/commands/playlist/update.test.ts @@ -26,7 +26,7 @@ it('can format playlists', () => { }) expect(stdout).toBe( - `OUTPUT=closes #14151, closes #14140, closes #14139, closes #14110, closes #14179, closes #14178\n` + 'OUTPUT=closes #14151, closes #14140, closes #14139, closes #14110, closes #14179, closes #14178\n' ) }) diff --git a/tests/commands/playlist/validate.test.ts b/tests/commands/playlist/validate.test.ts index d0c6d1396..06ebc4cfe 100644 --- a/tests/commands/playlist/validate.test.ts +++ b/tests/commands/playlist/validate.test.ts @@ -10,11 +10,13 @@ it('show an error if channel name in the blocklist', () => { ) console.log(stdout) process.exit(1) - } catch (error: any) { + } catch (error: unknown) { + // @ts-ignore expect(error.status).toBe(1) expect( + // @ts-ignore error.stdout.includes( - `us_blocked.m3u\n 2 error "Fox Sports 2 Asia (Thai)" is on the blocklist due to claims of copyright holders (https://github.com/iptv-org/iptv/issues/0000)\n\n1 problems (1 errors, 0 warnings)\n` + 'us_blocked.m3u\n 2 error "Fox Sports 2 Asia (Thai)" is on the blocklist due to claims of copyright holders (https://github.com/iptv-org/iptv/issues/0000)\n\n1 problems (1 errors, 0 warnings)\n' ) ).toBe(true) } @@ -30,7 +32,7 @@ it('show a warning if channel has wrong id', () => { expect( stdout.includes( - `wrong_id.m3u\n 2 warning "qib22lAq1L.us" is not in the database\n\n1 problems (0 errors, 1 warnings)\n` + 'wrong_id.m3u\n 2 warning "qib22lAq1L.us" is not in the database\n\n1 problems (0 errors, 1 warnings)\n' ) ).toBe(true) }) diff --git a/tests/commands/readme/update.test.ts b/tests/commands/readme/update.test.ts index e703ff1b0..0ee6addf3 100644 --- a/tests/commands/readme/update.test.ts +++ b/tests/commands/readme/update.test.ts @@ -14,7 +14,7 @@ beforeEach(() => { 'tests/__data__/output/.readme/template.md' ) - const stdout = execSync( + execSync( 'DATA_DIR=tests/__data__/input/data LOGS_DIR=tests/__data__/input/logs README_DIR=tests/__data__/output/.readme npm run readme:update', { encoding: 'utf8' } )
${column.name}