diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..21dfb44b9 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,38 @@ +{ + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "@typescript-eslint" + ], + "rules": { + "no-case-declarations": "off", + "indent": [ + "error", + 2, + { "SwitchCase": 1 } + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "never" + ] + } +} diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 448d62dbc..444b524f1 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 2 - - uses: tibdex/github-app-token@v2 + - uses: tibdex/github-app-token@v1.8.2 if: ${{ !env.ACT }} id: create-app-token with: diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index 0eff5f855..781bcdaa6 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: tibdex/github-app-token@v2 + - uses: tibdex/github-app-token@v1.8.2 if: ${{ !env.ACT }} id: create-app-token with: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a83661b00..80f7f6b42 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -141,6 +141,7 @@ To run scripts use the `npm run ` command. - `update`: (shorthand) sequentially runs the `api:load`, `playlist:generate`, `api:generate` and `readme:update` commands. - `deploy`: (shorthand) sequentially runs the `playlist:deploy` and `api:deploy` commands. - `report`: (shorthand) sequentially runs the `api:load` and `report:create` commands. +- `lint`: ัhecks the scripts for syntax errors. - `test`: runs a test of all the scripts described above. ## Workflows diff --git a/README.md b/README.md index 8f1e6a066..c32b577ae 100644 --- a/README.md +++ b/README.md @@ -59,35 +59,35 @@ Same thing, but split up into separate files: CategoryChannelsPlaylist - Animation50https://iptv-org.github.io/iptv/categories/animation.m3u + Animation53https://iptv-org.github.io/iptv/categories/animation.m3u Auto15https://iptv-org.github.io/iptv/categories/auto.m3u Business57https://iptv-org.github.io/iptv/categories/business.m3u - Classic55https://iptv-org.github.io/iptv/categories/classic.m3u - Comedy57https://iptv-org.github.io/iptv/categories/comedy.m3u + Classic54https://iptv-org.github.io/iptv/categories/classic.m3u + Comedy58https://iptv-org.github.io/iptv/categories/comedy.m3u Cooking23https://iptv-org.github.io/iptv/categories/cooking.m3u Culture77https://iptv-org.github.io/iptv/categories/culture.m3u Documentary64https://iptv-org.github.io/iptv/categories/documentary.m3u Education115https://iptv-org.github.io/iptv/categories/education.m3u Entertainment354https://iptv-org.github.io/iptv/categories/entertainment.m3u Family40https://iptv-org.github.io/iptv/categories/family.m3u - General1119https://iptv-org.github.io/iptv/categories/general.m3u - Kids182https://iptv-org.github.io/iptv/categories/kids.m3u + General1122https://iptv-org.github.io/iptv/categories/general.m3u + Kids183https://iptv-org.github.io/iptv/categories/kids.m3u Legislative167https://iptv-org.github.io/iptv/categories/legislative.m3u - Lifestyle78https://iptv-org.github.io/iptv/categories/lifestyle.m3u - Movies274https://iptv-org.github.io/iptv/categories/movies.m3u + Lifestyle77https://iptv-org.github.io/iptv/categories/lifestyle.m3u + Movies275https://iptv-org.github.io/iptv/categories/movies.m3u Music484https://iptv-org.github.io/iptv/categories/music.m3u - News705https://iptv-org.github.io/iptv/categories/news.m3u + News703https://iptv-org.github.io/iptv/categories/news.m3u Outdoor44https://iptv-org.github.io/iptv/categories/outdoor.m3u Relax16https://iptv-org.github.io/iptv/categories/relax.m3u - Religious438https://iptv-org.github.io/iptv/categories/religious.m3u + Religious442https://iptv-org.github.io/iptv/categories/religious.m3u Science25https://iptv-org.github.io/iptv/categories/science.m3u Series159https://iptv-org.github.io/iptv/categories/series.m3u Shop74https://iptv-org.github.io/iptv/categories/shop.m3u - Sports206https://iptv-org.github.io/iptv/categories/sports.m3u + Sports205https://iptv-org.github.io/iptv/categories/sports.m3u Travel30https://iptv-org.github.io/iptv/categories/travel.m3u Weather14https://iptv-org.github.io/iptv/categories/weather.m3u XXX46https://iptv-org.github.io/iptv/categories/xxx.m3u - Undefined5249https://iptv-org.github.io/iptv/categories/undefined.m3u + Undefined5209https://iptv-org.github.io/iptv/categories/undefined.m3u @@ -118,7 +118,7 @@ Same thing, but split up into separate files: Albanian58https://iptv-org.github.io/iptv/languages/sqi.m3u Alemannic1https://iptv-org.github.io/iptv/languages/gsw.m3u Amharic5https://iptv-org.github.io/iptv/languages/amh.m3u - Arabic375https://iptv-org.github.io/iptv/languages/ara.m3u + Arabic368https://iptv-org.github.io/iptv/languages/ara.m3u Armenian29https://iptv-org.github.io/iptv/languages/hye.m3u Assamese7https://iptv-org.github.io/iptv/languages/asm.m3u Assyrian Neo-Aramaic1https://iptv-org.github.io/iptv/languages/aii.m3u @@ -134,29 +134,29 @@ Same thing, but split up into separate files: Catalan50https://iptv-org.github.io/iptv/languages/cat.m3u Chhattisgarhi1https://iptv-org.github.io/iptv/languages/hne.m3u Chinese150https://iptv-org.github.io/iptv/languages/zho.m3u - Croatian13https://iptv-org.github.io/iptv/languages/hrv.m3u + Croatian14https://iptv-org.github.io/iptv/languages/hrv.m3u Czech36https://iptv-org.github.io/iptv/languages/ces.m3u Danish20https://iptv-org.github.io/iptv/languages/dan.m3u Dhanwar (Nepal)1https://iptv-org.github.io/iptv/languages/dhw.m3u Dhivehi3https://iptv-org.github.io/iptv/languages/div.m3u Dholuo1https://iptv-org.github.io/iptv/languages/luo.m3u Dimili1https://iptv-org.github.io/iptv/languages/zza.m3u - Dutch191https://iptv-org.github.io/iptv/languages/nld.m3u - English2171https://iptv-org.github.io/iptv/languages/eng.m3u + Dutch192https://iptv-org.github.io/iptv/languages/nld.m3u + English2182https://iptv-org.github.io/iptv/languages/eng.m3u Estonian9https://iptv-org.github.io/iptv/languages/est.m3u Ewe1https://iptv-org.github.io/iptv/languages/ewe.m3u Faroese1https://iptv-org.github.io/iptv/languages/fao.m3u Fataleka1https://iptv-org.github.io/iptv/languages/far.m3u Filipino1https://iptv-org.github.io/iptv/languages/fil.m3u - Finnish25https://iptv-org.github.io/iptv/languages/fin.m3u - French383https://iptv-org.github.io/iptv/languages/fra.m3u + Finnish24https://iptv-org.github.io/iptv/languages/fin.m3u + French387https://iptv-org.github.io/iptv/languages/fra.m3u Galician12https://iptv-org.github.io/iptv/languages/glg.m3u Galolen1https://iptv-org.github.io/iptv/languages/gal.m3u Georgian8https://iptv-org.github.io/iptv/languages/kat.m3u - German280https://iptv-org.github.io/iptv/languages/deu.m3u + German278https://iptv-org.github.io/iptv/languages/deu.m3u Gikuyu2https://iptv-org.github.io/iptv/languages/kik.m3u Goan Konkani1https://iptv-org.github.io/iptv/languages/gom.m3u - Greek122https://iptv-org.github.io/iptv/languages/ell.m3u + Greek121https://iptv-org.github.io/iptv/languages/ell.m3u Greenlandic2https://iptv-org.github.io/iptv/languages/kal.m3u Gujarati10https://iptv-org.github.io/iptv/languages/guj.m3u Haitian5https://iptv-org.github.io/iptv/languages/hat.m3u @@ -169,15 +169,15 @@ Same thing, but split up into separate files: Inuktitut1https://iptv-org.github.io/iptv/languages/iku.m3u Irish5https://iptv-org.github.io/iptv/languages/gle.m3u Italian330https://iptv-org.github.io/iptv/languages/ita.m3u - Japanese41https://iptv-org.github.io/iptv/languages/jpn.m3u + Japanese34https://iptv-org.github.io/iptv/languages/jpn.m3u Javanese3https://iptv-org.github.io/iptv/languages/jav.m3u Kannada18https://iptv-org.github.io/iptv/languages/kan.m3u Kazakh34https://iptv-org.github.io/iptv/languages/kaz.m3u Khmer12https://iptv-org.github.io/iptv/languages/khm.m3u Kinyarwanda3https://iptv-org.github.io/iptv/languages/kin.m3u - Kirghiz7https://iptv-org.github.io/iptv/languages/kir.m3u + Kirghiz6https://iptv-org.github.io/iptv/languages/kir.m3u Konkani (macrolanguage)2https://iptv-org.github.io/iptv/languages/kok.m3u - Korean112https://iptv-org.github.io/iptv/languages/kor.m3u + Korean111https://iptv-org.github.io/iptv/languages/kor.m3u Kurdish24https://iptv-org.github.io/iptv/languages/kur.m3u Lahnda1https://iptv-org.github.io/iptv/languages/lah.m3u Lao9https://iptv-org.github.io/iptv/languages/lao.m3u @@ -207,7 +207,7 @@ Same thing, but split up into separate files: Portuguese361https://iptv-org.github.io/iptv/languages/por.m3u Romanian116https://iptv-org.github.io/iptv/languages/ron.m3u Romany1https://iptv-org.github.io/iptv/languages/rom.m3u - Russian302https://iptv-org.github.io/iptv/languages/rus.m3u + Russian304https://iptv-org.github.io/iptv/languages/rus.m3u Saint Lucian Creole French2https://iptv-org.github.io/iptv/languages/acf.m3u Santali1https://iptv-org.github.io/iptv/languages/sat.m3u Serbian82https://iptv-org.github.io/iptv/languages/srp.m3u @@ -217,7 +217,7 @@ Same thing, but split up into separate files: Slovak44https://iptv-org.github.io/iptv/languages/slk.m3u Slovenian16https://iptv-org.github.io/iptv/languages/slv.m3u Somali8https://iptv-org.github.io/iptv/languages/som.m3u - Spanish1846https://iptv-org.github.io/iptv/languages/spa.m3u + Spanish1852https://iptv-org.github.io/iptv/languages/spa.m3u Swahili14https://iptv-org.github.io/iptv/languages/swa.m3u Swedish19https://iptv-org.github.io/iptv/languages/swe.m3u Tagalog14https://iptv-org.github.io/iptv/languages/tgl.m3u @@ -238,7 +238,7 @@ Same thing, but split up into separate files: Wolof2https://iptv-org.github.io/iptv/languages/wol.m3u Yucatec Maya1https://iptv-org.github.io/iptv/languages/yua.m3u Yue Chinese10https://iptv-org.github.io/iptv/languages/yue.m3u - Undefined1275https://iptv-org.github.io/iptv/languages/undefined.m3u + Undefined1238https://iptv-org.github.io/iptv/languages/undefined.m3u @@ -272,7 +272,7 @@ Same thing, but split up into separate files: ๐Ÿ‡ฆ๐Ÿ‡ด Angola14https://iptv-org.github.io/iptv/countries/ao.m3u ๐Ÿ‡ฆ๐Ÿ‡ฎ Anguilla5https://iptv-org.github.io/iptv/countries/ai.m3u ๐Ÿ‡ฆ๐Ÿ‡ฌ Antigua and Barbuda7https://iptv-org.github.io/iptv/countries/ag.m3u - ๐Ÿ‡ฆ๐Ÿ‡ท Argentina316https://iptv-org.github.io/iptv/countries/ar.m3u + ๐Ÿ‡ฆ๐Ÿ‡ท Argentina318https://iptv-org.github.io/iptv/countries/ar.m3u       Buenos Aires30https://iptv-org.github.io/iptv/subdivisions/ar-b.m3u       Catamarca2https://iptv-org.github.io/iptv/subdivisions/ar-k.m3u       Chaco5https://iptv-org.github.io/iptv/subdivisions/ar-h.m3u @@ -298,8 +298,8 @@ Same thing, but split up into separate files:       Tucuman7https://iptv-org.github.io/iptv/subdivisions/ar-t.m3u ๐Ÿ‡ฆ๐Ÿ‡ฒ Armenia40https://iptv-org.github.io/iptv/countries/am.m3u ๐Ÿ‡ฆ๐Ÿ‡ผ Aruba6https://iptv-org.github.io/iptv/countries/aw.m3u - ๐Ÿ‡ฆ๐Ÿ‡บ Australia38https://iptv-org.github.io/iptv/countries/au.m3u - ๐Ÿ‡ฆ๐Ÿ‡น Austria48https://iptv-org.github.io/iptv/countries/at.m3u + ๐Ÿ‡ฆ๐Ÿ‡บ Australia51https://iptv-org.github.io/iptv/countries/au.m3u + ๐Ÿ‡ฆ๐Ÿ‡น Austria47https://iptv-org.github.io/iptv/countries/at.m3u ๐Ÿ‡ฆ๐Ÿ‡ฟ Azerbaijan33https://iptv-org.github.io/iptv/countries/az.m3u ๐Ÿ‡ง๐Ÿ‡ธ Bahamas7https://iptv-org.github.io/iptv/countries/bs.m3u ๐Ÿ‡ง๐Ÿ‡ญ Bahrain38https://iptv-org.github.io/iptv/countries/bh.m3u @@ -311,7 +311,7 @@ Same thing, but split up into separate files: ๐Ÿ‡ง๐Ÿ‡ฏ Benin19https://iptv-org.github.io/iptv/countries/bj.m3u ๐Ÿ‡ง๐Ÿ‡ฒ Bermuda4https://iptv-org.github.io/iptv/countries/bm.m3u ๐Ÿ‡ง๐Ÿ‡น Bhutan8https://iptv-org.github.io/iptv/countries/bt.m3u - ๐Ÿ‡ง๐Ÿ‡ด Bolivia94https://iptv-org.github.io/iptv/countries/bo.m3u + ๐Ÿ‡ง๐Ÿ‡ด Bolivia96https://iptv-org.github.io/iptv/countries/bo.m3u       Cochabamba1https://iptv-org.github.io/iptv/subdivisions/bo-c.m3u       La Paz2https://iptv-org.github.io/iptv/subdivisions/bo-l.m3u       Oruro1https://iptv-org.github.io/iptv/subdivisions/bo-o.m3u @@ -344,7 +344,7 @@ Same thing, but split up into separate files: ๐Ÿ‡ป๐Ÿ‡ฌ British Virgin Islands6https://iptv-org.github.io/iptv/countries/vg.m3u ๐Ÿ‡ง๐Ÿ‡ณ Brunei31https://iptv-org.github.io/iptv/countries/bn.m3u ๐Ÿ‡ง๐Ÿ‡ฌ Bulgaria39https://iptv-org.github.io/iptv/countries/bg.m3u - ๐Ÿ‡ง๐Ÿ‡ซ Burkina Faso14https://iptv-org.github.io/iptv/countries/bf.m3u + ๐Ÿ‡ง๐Ÿ‡ซ Burkina Faso15https://iptv-org.github.io/iptv/countries/bf.m3u ๐Ÿ‡ง๐Ÿ‡ฎ Burundi12https://iptv-org.github.io/iptv/countries/bi.m3u ๐Ÿ‡ฐ๐Ÿ‡ญ Cambodia42https://iptv-org.github.io/iptv/countries/kh.m3u ๐Ÿ‡จ๐Ÿ‡ฒ Cameroon39https://iptv-org.github.io/iptv/countries/cm.m3u @@ -376,7 +376,7 @@ Same thing, but split up into separate files:       Nuble3https://iptv-org.github.io/iptv/subdivisions/cl-nb.m3u       Valparaiso2https://iptv-org.github.io/iptv/subdivisions/cl-vs.m3u ๐Ÿ‡จ๐Ÿ‡ณ China562https://iptv-org.github.io/iptv/countries/cn.m3u - ๐Ÿ‡จ๐Ÿ‡ด Colombia137https://iptv-org.github.io/iptv/countries/co.m3u + ๐Ÿ‡จ๐Ÿ‡ด Colombia139https://iptv-org.github.io/iptv/countries/co.m3u       Antioquia1https://iptv-org.github.io/iptv/subdivisions/co-ant.m3u       Atlantico1https://iptv-org.github.io/iptv/subdivisions/co-atl.m3u       Bolivar1https://iptv-org.github.io/iptv/subdivisions/co-bol.m3u @@ -395,19 +395,19 @@ Same thing, but split up into separate files:       Valle del Cauca5https://iptv-org.github.io/iptv/subdivisions/co-vac.m3u ๐Ÿ‡ฐ๐Ÿ‡ฒ Comoros41https://iptv-org.github.io/iptv/countries/km.m3u ๐Ÿ‡จ๐Ÿ‡ฐ Cook Islands6https://iptv-org.github.io/iptv/countries/ck.m3u - ๐Ÿ‡จ๐Ÿ‡ท Costa Rica96https://iptv-org.github.io/iptv/countries/cr.m3u + ๐Ÿ‡จ๐Ÿ‡ท Costa Rica98https://iptv-org.github.io/iptv/countries/cr.m3u       Puntarenas1https://iptv-org.github.io/iptv/subdivisions/cr-p.m3u       San Jose1https://iptv-org.github.io/iptv/subdivisions/cr-sj.m3u - ๐Ÿ‡ญ๐Ÿ‡ท Croatia27https://iptv-org.github.io/iptv/countries/hr.m3u - ๐Ÿ‡จ๐Ÿ‡บ Cuba53https://iptv-org.github.io/iptv/countries/cu.m3u + ๐Ÿ‡ญ๐Ÿ‡ท Croatia28https://iptv-org.github.io/iptv/countries/hr.m3u + ๐Ÿ‡จ๐Ÿ‡บ Cuba55https://iptv-org.github.io/iptv/countries/cu.m3u ๐Ÿ‡จ๐Ÿ‡ผ Curacao10https://iptv-org.github.io/iptv/countries/cw.m3u - ๐Ÿ‡จ๐Ÿ‡พ Cyprus40https://iptv-org.github.io/iptv/countries/cy.m3u + ๐Ÿ‡จ๐Ÿ‡พ Cyprus39https://iptv-org.github.io/iptv/countries/cy.m3u ๐Ÿ‡จ๐Ÿ‡ฟ Czech Republic43https://iptv-org.github.io/iptv/countries/cz.m3u ๐Ÿ‡จ๐Ÿ‡ฉ Democratic Republic of the Congo33https://iptv-org.github.io/iptv/countries/cd.m3u ๐Ÿ‡ฉ๐Ÿ‡ฐ Denmark34https://iptv-org.github.io/iptv/countries/dk.m3u ๐Ÿ‡ฉ๐Ÿ‡ฏ Djibouti46https://iptv-org.github.io/iptv/countries/dj.m3u ๐Ÿ‡ฉ๐Ÿ‡ฒ Dominica5https://iptv-org.github.io/iptv/countries/dm.m3u - ๐Ÿ‡ฉ๐Ÿ‡ด Dominican Republic207https://iptv-org.github.io/iptv/countries/do.m3u + ๐Ÿ‡ฉ๐Ÿ‡ด Dominican Republic209https://iptv-org.github.io/iptv/countries/do.m3u       Distrito Nacional (Santo Domingo)2https://iptv-org.github.io/iptv/subdivisions/do-01.m3u       La Altagracia2https://iptv-org.github.io/iptv/subdivisions/do-11.m3u       La Vega3https://iptv-org.github.io/iptv/subdivisions/do-13.m3u @@ -417,12 +417,12 @@ Same thing, but split up into separate files:       Santiago1https://iptv-org.github.io/iptv/subdivisions/do-25.m3u       Valverde1https://iptv-org.github.io/iptv/subdivisions/do-27.m3u ๐Ÿ‡น๐Ÿ‡ฑ East Timor27https://iptv-org.github.io/iptv/countries/tl.m3u - ๐Ÿ‡ช๐Ÿ‡จ Ecuador82https://iptv-org.github.io/iptv/countries/ec.m3u + ๐Ÿ‡ช๐Ÿ‡จ Ecuador84https://iptv-org.github.io/iptv/countries/ec.m3u       Azuay1https://iptv-org.github.io/iptv/subdivisions/ec-a.m3u       Loja1https://iptv-org.github.io/iptv/subdivisions/ec-l.m3u       Orellana1https://iptv-org.github.io/iptv/subdivisions/ec-d.m3u ๐Ÿ‡ช๐Ÿ‡ฌ Egypt77https://iptv-org.github.io/iptv/countries/eg.m3u - ๐Ÿ‡ธ๐Ÿ‡ป El Salvador67https://iptv-org.github.io/iptv/countries/sv.m3u + ๐Ÿ‡ธ๐Ÿ‡ป El Salvador69https://iptv-org.github.io/iptv/countries/sv.m3u ๐Ÿ‡ฌ๐Ÿ‡ถ Equatorial Guinea14https://iptv-org.github.io/iptv/countries/gq.m3u ๐Ÿ‡ช๐Ÿ‡ท Eritrea12https://iptv-org.github.io/iptv/countries/er.m3u ๐Ÿ‡ช๐Ÿ‡ช Estonia24https://iptv-org.github.io/iptv/countries/ee.m3u @@ -430,24 +430,24 @@ Same thing, but split up into separate files: ๐Ÿ‡ซ๐Ÿ‡ฐ Falkland Islands3https://iptv-org.github.io/iptv/countries/fk.m3u ๐Ÿ‡ซ๐Ÿ‡ด Faroe Islands1https://iptv-org.github.io/iptv/countries/fo.m3u ๐Ÿ‡ซ๐Ÿ‡ฏ Fiji7https://iptv-org.github.io/iptv/countries/fj.m3u - ๐Ÿ‡ซ๐Ÿ‡ฎ Finland41https://iptv-org.github.io/iptv/countries/fi.m3u + ๐Ÿ‡ซ๐Ÿ‡ฎ Finland40https://iptv-org.github.io/iptv/countries/fi.m3u       Keski-Suomi1https://iptv-org.github.io/iptv/subdivisions/fi-08.m3u       Pohjanmaa3https://iptv-org.github.io/iptv/subdivisions/fi-12.m3u - ๐Ÿ‡ซ๐Ÿ‡ท France262https://iptv-org.github.io/iptv/countries/fr.m3u + ๐Ÿ‡ซ๐Ÿ‡ท France265https://iptv-org.github.io/iptv/countries/fr.m3u ๐Ÿ‡ฌ๐Ÿ‡ซ French Guiana7https://iptv-org.github.io/iptv/countries/gf.m3u ๐Ÿ‡ต๐Ÿ‡ซ French Polynesia7https://iptv-org.github.io/iptv/countries/pf.m3u ๐Ÿ‡น๐Ÿ‡ซ French Southern Territories12https://iptv-org.github.io/iptv/countries/tf.m3u ๐Ÿ‡ฌ๐Ÿ‡ฆ Gabon14https://iptv-org.github.io/iptv/countries/ga.m3u ๐Ÿ‡ฌ๐Ÿ‡ฒ Gambia14https://iptv-org.github.io/iptv/countries/gm.m3u ๐Ÿ‡ฌ๐Ÿ‡ช Georgia20https://iptv-org.github.io/iptv/countries/ge.m3u - ๐Ÿ‡ฉ๐Ÿ‡ช Germany265https://iptv-org.github.io/iptv/countries/de.m3u + ๐Ÿ‡ฉ๐Ÿ‡ช Germany264https://iptv-org.github.io/iptv/countries/de.m3u ๐Ÿ‡ฌ๐Ÿ‡ญ Ghana36https://iptv-org.github.io/iptv/countries/gh.m3u ๐Ÿ‡ฌ๐Ÿ‡ท Greece117https://iptv-org.github.io/iptv/countries/gr.m3u ๐Ÿ‡ฌ๐Ÿ‡ฑ Greenland6https://iptv-org.github.io/iptv/countries/gl.m3u ๐Ÿ‡ฌ๐Ÿ‡ฉ Grenada5https://iptv-org.github.io/iptv/countries/gd.m3u ๐Ÿ‡ฌ๐Ÿ‡ต Guadeloupe9https://iptv-org.github.io/iptv/countries/gp.m3u ๐Ÿ‡ฌ๐Ÿ‡บ Guam7https://iptv-org.github.io/iptv/countries/gu.m3u - ๐Ÿ‡ฌ๐Ÿ‡น Guatemala104https://iptv-org.github.io/iptv/countries/gt.m3u + ๐Ÿ‡ฌ๐Ÿ‡น Guatemala106https://iptv-org.github.io/iptv/countries/gt.m3u       Escuintla2https://iptv-org.github.io/iptv/subdivisions/gt-05.m3u       Izabal1https://iptv-org.github.io/iptv/subdivisions/gt-18.m3u       Quiche1https://iptv-org.github.io/iptv/subdivisions/gt-14.m3u @@ -461,7 +461,7 @@ Same thing, but split up into separate files: ๐Ÿ‡ฌ๐Ÿ‡ผ Guinea-Bissau12https://iptv-org.github.io/iptv/countries/gw.m3u ๐Ÿ‡ฌ๐Ÿ‡พ Guyana4https://iptv-org.github.io/iptv/countries/gy.m3u ๐Ÿ‡ญ๐Ÿ‡น Haiti40https://iptv-org.github.io/iptv/countries/ht.m3u - ๐Ÿ‡ญ๐Ÿ‡ณ Honduras110https://iptv-org.github.io/iptv/countries/hn.m3u + ๐Ÿ‡ญ๐Ÿ‡ณ Honduras112https://iptv-org.github.io/iptv/countries/hn.m3u ๐Ÿ‡ญ๐Ÿ‡ฐ Hong Kong21https://iptv-org.github.io/iptv/countries/hk.m3u ๐Ÿ‡ญ๐Ÿ‡บ Hungary118https://iptv-org.github.io/iptv/countries/hu.m3u ๐Ÿ‡ฎ๐Ÿ‡ธ Iceland16https://iptv-org.github.io/iptv/countries/is.m3u @@ -501,7 +501,7 @@ Same thing, but split up into separate files: ๐Ÿ‡ฎ๐Ÿ‡ถ Iraq128https://iptv-org.github.io/iptv/countries/iq.m3u ๐Ÿ‡ฎ๐Ÿ‡ช Ireland22https://iptv-org.github.io/iptv/countries/ie.m3u ๐Ÿ‡ฎ๐Ÿ‡ฑ Israel21https://iptv-org.github.io/iptv/countries/il.m3u - ๐Ÿ‡ฎ๐Ÿ‡น Italy409https://iptv-org.github.io/iptv/countries/it.m3u + ๐Ÿ‡ฎ๐Ÿ‡น Italy408https://iptv-org.github.io/iptv/countries/it.m3u ๐Ÿ‡จ๐Ÿ‡ฎ Ivory Coast30https://iptv-org.github.io/iptv/countries/ci.m3u ๐Ÿ‡ฏ๐Ÿ‡ฒ Jamaica11https://iptv-org.github.io/iptv/countries/jm.m3u ๐Ÿ‡ฏ๐Ÿ‡ต Japan47https://iptv-org.github.io/iptv/countries/jp.m3u @@ -510,8 +510,8 @@ Same thing, but split up into separate files: ๐Ÿ‡ฐ๐Ÿ‡ช Kenya54https://iptv-org.github.io/iptv/countries/ke.m3u ๐Ÿ‡ฐ๐Ÿ‡ฎ Kiribati6https://iptv-org.github.io/iptv/countries/ki.m3u ๐Ÿ‡ฝ๐Ÿ‡ฐ Kosovo25https://iptv-org.github.io/iptv/countries/xk.m3u - ๐Ÿ‡ฐ๐Ÿ‡ผ Kuwait47https://iptv-org.github.io/iptv/countries/kw.m3u - ๐Ÿ‡ฐ๐Ÿ‡ฌ Kyrgyzstan9https://iptv-org.github.io/iptv/countries/kg.m3u + ๐Ÿ‡ฐ๐Ÿ‡ผ Kuwait38https://iptv-org.github.io/iptv/countries/kw.m3u + ๐Ÿ‡ฐ๐Ÿ‡ฌ Kyrgyzstan8https://iptv-org.github.io/iptv/countries/kg.m3u ๐Ÿ‡ฑ๐Ÿ‡ฆ Laos44https://iptv-org.github.io/iptv/countries/la.m3u ๐Ÿ‡ฑ๐Ÿ‡ป Latvia25https://iptv-org.github.io/iptv/countries/lv.m3u ๐Ÿ‡ฑ๐Ÿ‡ง Lebanon57https://iptv-org.github.io/iptv/countries/lb.m3u @@ -533,7 +533,7 @@ Same thing, but split up into separate files: ๐Ÿ‡ฒ๐Ÿ‡ท Mauritania43https://iptv-org.github.io/iptv/countries/mr.m3u ๐Ÿ‡ฒ๐Ÿ‡บ Mauritius13https://iptv-org.github.io/iptv/countries/mu.m3u ๐Ÿ‡พ๐Ÿ‡น Mayotte13https://iptv-org.github.io/iptv/countries/yt.m3u - ๐Ÿ‡ฒ๐Ÿ‡ฝ Mexico209https://iptv-org.github.io/iptv/countries/mx.m3u + ๐Ÿ‡ฒ๐Ÿ‡ฝ Mexico211https://iptv-org.github.io/iptv/countries/mx.m3u       Aguascalientes1https://iptv-org.github.io/iptv/subdivisions/mx-agu.m3u       Baja California1https://iptv-org.github.io/iptv/subdivisions/mx-bcn.m3u       Chihuahua4https://iptv-org.github.io/iptv/subdivisions/mx-chh.m3u @@ -557,7 +557,7 @@ Same thing, but split up into separate files:       Zacatecas1https://iptv-org.github.io/iptv/subdivisions/mx-zac.m3u ๐Ÿ‡ซ๐Ÿ‡ฒ Micronesia6https://iptv-org.github.io/iptv/countries/fm.m3u ๐Ÿ‡ฒ๐Ÿ‡ฉ Moldova30https://iptv-org.github.io/iptv/countries/md.m3u - ๐Ÿ‡ฒ๐Ÿ‡จ Monaco12https://iptv-org.github.io/iptv/countries/mc.m3u + ๐Ÿ‡ฒ๐Ÿ‡จ Monaco13https://iptv-org.github.io/iptv/countries/mc.m3u ๐Ÿ‡ฒ๐Ÿ‡ณ Mongolia26https://iptv-org.github.io/iptv/countries/mn.m3u ๐Ÿ‡ฒ๐Ÿ‡ช Montenegro18https://iptv-org.github.io/iptv/countries/me.m3u       Ulcinj1https://iptv-org.github.io/iptv/subdivisions/me-20.m3u @@ -571,7 +571,7 @@ Same thing, but split up into separate files: ๐Ÿ‡ณ๐Ÿ‡ฑ Netherlands201https://iptv-org.github.io/iptv/countries/nl.m3u ๐Ÿ‡ณ๐Ÿ‡จ New Caledonia6https://iptv-org.github.io/iptv/countries/nc.m3u ๐Ÿ‡ณ๐Ÿ‡ฟ New Zealand32https://iptv-org.github.io/iptv/countries/nz.m3u - ๐Ÿ‡ณ๐Ÿ‡ฎ Nicaragua62https://iptv-org.github.io/iptv/countries/ni.m3u + ๐Ÿ‡ณ๐Ÿ‡ฎ Nicaragua64https://iptv-org.github.io/iptv/countries/ni.m3u ๐Ÿ‡ณ๐Ÿ‡ช Niger13https://iptv-org.github.io/iptv/countries/ne.m3u ๐Ÿ‡ณ๐Ÿ‡ฌ Nigeria55https://iptv-org.github.io/iptv/countries/ng.m3u ๐Ÿ‡ณ๐Ÿ‡บ Niue6https://iptv-org.github.io/iptv/countries/nu.m3u @@ -585,16 +585,16 @@ Same thing, but split up into separate files:       Islamabad1https://iptv-org.github.io/iptv/subdivisions/pk-is.m3u ๐Ÿ‡ต๐Ÿ‡ผ Palau6https://iptv-org.github.io/iptv/countries/pw.m3u ๐Ÿ‡ต๐Ÿ‡ธ Palestine59https://iptv-org.github.io/iptv/countries/ps.m3u - ๐Ÿ‡ต๐Ÿ‡ฆ Panama69https://iptv-org.github.io/iptv/countries/pa.m3u + ๐Ÿ‡ต๐Ÿ‡ฆ Panama71https://iptv-org.github.io/iptv/countries/pa.m3u ๐Ÿ‡ต๐Ÿ‡ฌ Papua New Guinea6https://iptv-org.github.io/iptv/countries/pg.m3u - ๐Ÿ‡ต๐Ÿ‡พ Paraguay88https://iptv-org.github.io/iptv/countries/py.m3u + ๐Ÿ‡ต๐Ÿ‡พ Paraguay90https://iptv-org.github.io/iptv/countries/py.m3u       Alto Parana2https://iptv-org.github.io/iptv/subdivisions/py-10.m3u       Boqueron1https://iptv-org.github.io/iptv/subdivisions/py-19.m3u       Caaguazu1https://iptv-org.github.io/iptv/subdivisions/py-5.m3u       Central1https://iptv-org.github.io/iptv/subdivisions/py-11.m3u       Itapua1https://iptv-org.github.io/iptv/subdivisions/py-7.m3u       Presidente Hayes1https://iptv-org.github.io/iptv/subdivisions/py-15.m3u - ๐Ÿ‡ต๐Ÿ‡ช Peru200https://iptv-org.github.io/iptv/countries/pe.m3u + ๐Ÿ‡ต๐Ÿ‡ช Peru202https://iptv-org.github.io/iptv/countries/pe.m3u       Amazonas1https://iptv-org.github.io/iptv/subdivisions/pe-ama.m3u       Ancash1https://iptv-org.github.io/iptv/subdivisions/pe-anc.m3u       Apurimac1https://iptv-org.github.io/iptv/subdivisions/pe-apu.m3u @@ -611,7 +611,7 @@ Same thing, but split up into separate files: ๐Ÿ‡ต๐Ÿ‡ณ Pitcairn Islands6https://iptv-org.github.io/iptv/countries/pn.m3u ๐Ÿ‡ต๐Ÿ‡ฑ Poland66https://iptv-org.github.io/iptv/countries/pl.m3u ๐Ÿ‡ต๐Ÿ‡น Portugal53https://iptv-org.github.io/iptv/countries/pt.m3u - ๐Ÿ‡ต๐Ÿ‡ท Puerto Rico85https://iptv-org.github.io/iptv/countries/pr.m3u + ๐Ÿ‡ต๐Ÿ‡ท Puerto Rico87https://iptv-org.github.io/iptv/countries/pr.m3u ๐Ÿ‡ถ๐Ÿ‡ฆ Qatar38https://iptv-org.github.io/iptv/countries/qa.m3u ๐Ÿ‡จ๐Ÿ‡ฌ Republic of the Congo16https://iptv-org.github.io/iptv/countries/cg.m3u       Brazzaville1https://iptv-org.github.io/iptv/subdivisions/cg-bzv.m3u @@ -643,7 +643,7 @@ Same thing, but split up into separate files: ๐Ÿ‡ธ๐Ÿ‡ด Somalia61https://iptv-org.github.io/iptv/countries/so.m3u ๐Ÿ‡ฟ๐Ÿ‡ฆ South Africa36https://iptv-org.github.io/iptv/countries/za.m3u ๐Ÿ‡ฌ๐Ÿ‡ธ South Georgia and the South Sandwich Islands3https://iptv-org.github.io/iptv/countries/gs.m3u - ๐Ÿ‡ฐ๐Ÿ‡ท South Korea112https://iptv-org.github.io/iptv/countries/kr.m3u + ๐Ÿ‡ฐ๐Ÿ‡ท South Korea111https://iptv-org.github.io/iptv/countries/kr.m3u       Busan-gwangyeoksi2https://iptv-org.github.io/iptv/subdivisions/kr-26.m3u       Chungcheongbuk-do2https://iptv-org.github.io/iptv/subdivisions/kr-43.m3u       Daegu-gwangyeoksi2https://iptv-org.github.io/iptv/subdivisions/kr-27.m3u @@ -677,7 +677,7 @@ Same thing, but split up into separate files:       Valenciana, Comunidad15https://iptv-org.github.io/iptv/subdivisions/es-vc.m3u ๐Ÿ‡ฑ๐Ÿ‡ฐ Sri Lanka20https://iptv-org.github.io/iptv/countries/lk.m3u ๐Ÿ‡ธ๐Ÿ‡ฉ Sudan50https://iptv-org.github.io/iptv/countries/sd.m3u - ๐Ÿ‡ธ๐Ÿ‡ท Suriname3https://iptv-org.github.io/iptv/countries/sr.m3u + ๐Ÿ‡ธ๐Ÿ‡ท Suriname4https://iptv-org.github.io/iptv/countries/sr.m3u ๐Ÿ‡ธ๐Ÿ‡ฟ Swaziland13https://iptv-org.github.io/iptv/countries/sz.m3u ๐Ÿ‡ธ๐Ÿ‡ช Sweden43https://iptv-org.github.io/iptv/countries/se.m3u ๐Ÿ‡จ๐Ÿ‡ญ Switzerland71https://iptv-org.github.io/iptv/countries/ch.m3u @@ -701,10 +701,10 @@ Same thing, but split up into separate files: ๐Ÿ‡ฆ๐Ÿ‡ช United Arab Emirates76https://iptv-org.github.io/iptv/countries/ae.m3u ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom194https://iptv-org.github.io/iptv/countries/uk.m3u       Wales2https://iptv-org.github.io/iptv/subdivisions/gb-wls.m3u - ๐Ÿ‡บ๐Ÿ‡ธ United States1882https://iptv-org.github.io/iptv/countries/us.m3u + ๐Ÿ‡บ๐Ÿ‡ธ United States1845https://iptv-org.github.io/iptv/countries/us.m3u       Alabama4https://iptv-org.github.io/iptv/subdivisions/us-al.m3u       Alaska2https://iptv-org.github.io/iptv/subdivisions/us-ak.m3u -       Arizona12https://iptv-org.github.io/iptv/subdivisions/us-az.m3u +       Arizona11https://iptv-org.github.io/iptv/subdivisions/us-az.m3u       Arkansas4https://iptv-org.github.io/iptv/subdivisions/us-ar.m3u       California146https://iptv-org.github.io/iptv/subdivisions/us-ca.m3u       Colorado19https://iptv-org.github.io/iptv/subdivisions/us-co.m3u @@ -753,11 +753,11 @@ Same thing, but split up into separate files:       Washington8https://iptv-org.github.io/iptv/subdivisions/us-wa.m3u       Wisconsin7https://iptv-org.github.io/iptv/subdivisions/us-wi.m3u       Wyoming1https://iptv-org.github.io/iptv/subdivisions/us-wy.m3u - ๐Ÿ‡บ๐Ÿ‡พ Uruguay60https://iptv-org.github.io/iptv/countries/uy.m3u + ๐Ÿ‡บ๐Ÿ‡พ Uruguay62https://iptv-org.github.io/iptv/countries/uy.m3u ๐Ÿ‡บ๐Ÿ‡ฟ Uzbekistan9https://iptv-org.github.io/iptv/countries/uz.m3u ๐Ÿ‡ป๐Ÿ‡บ Vanuatu6https://iptv-org.github.io/iptv/countries/vu.m3u ๐Ÿ‡ป๐Ÿ‡ฆ Vatican City19https://iptv-org.github.io/iptv/countries/va.m3u - ๐Ÿ‡ป๐Ÿ‡ช Venezuela107https://iptv-org.github.io/iptv/countries/ve.m3u + ๐Ÿ‡ป๐Ÿ‡ช Venezuela110https://iptv-org.github.io/iptv/countries/ve.m3u       Aragua2https://iptv-org.github.io/iptv/subdivisions/ve-d.m3u       Lara1https://iptv-org.github.io/iptv/subdivisions/ve-k.m3u ๐Ÿ‡ป๐Ÿ‡ณ Vietnam125https://iptv-org.github.io/iptv/countries/vn.m3u @@ -792,38 +792,38 @@ Same thing, but split up into separate files: RegionChannelsPlaylist - Africa423https://iptv-org.github.io/iptv/regions/afr.m3u - Americas3801https://iptv-org.github.io/iptv/regions/amer.m3u - Arab world426https://iptv-org.github.io/iptv/regions/arab.m3u - Asia2947https://iptv-org.github.io/iptv/regions/asia.m3u - Asia-Pacific1912https://iptv-org.github.io/iptv/regions/apac.m3u + Africa424https://iptv-org.github.io/iptv/regions/afr.m3u + Americas3765https://iptv-org.github.io/iptv/regions/amer.m3u + Arab world417https://iptv-org.github.io/iptv/regions/arab.m3u + Asia2935https://iptv-org.github.io/iptv/regions/asia.m3u + Asia-Pacific1924https://iptv-org.github.io/iptv/regions/apac.m3u Association of Southeast Asian Nations471https://iptv-org.github.io/iptv/regions/asean.m3u Benelux240https://iptv-org.github.io/iptv/regions/benelux.m3u Caribbean251https://iptv-org.github.io/iptv/regions/carib.m3u Central America205https://iptv-org.github.io/iptv/regions/cenamer.m3u - Central and Eastern Europe1019https://iptv-org.github.io/iptv/regions/cee.m3u - Central Asia64https://iptv-org.github.io/iptv/regions/cas.m3u - Commonwealth of Independent States460https://iptv-org.github.io/iptv/regions/cis.m3u - Europe3241https://iptv-org.github.io/iptv/regions/eur.m3u - Europe, the Middle East and Africa4056https://iptv-org.github.io/iptv/regions/emea.m3u - Hispanic America1470https://iptv-org.github.io/iptv/regions/hispam.m3u - Latin America1779https://iptv-org.github.io/iptv/regions/latam.m3u - Latin America and the Caribbean1801https://iptv-org.github.io/iptv/regions/lac.m3u + Central and Eastern Europe1020https://iptv-org.github.io/iptv/regions/cee.m3u + Central Asia63https://iptv-org.github.io/iptv/regions/cas.m3u + Commonwealth of Independent States459https://iptv-org.github.io/iptv/regions/cis.m3u + Europe3240https://iptv-org.github.io/iptv/regions/eur.m3u + Europe, the Middle East and Africa4047https://iptv-org.github.io/iptv/regions/emea.m3u + Hispanic America1471https://iptv-org.github.io/iptv/regions/hispam.m3u + Latin America1780https://iptv-org.github.io/iptv/regions/latam.m3u + Latin America and the Caribbean1802https://iptv-org.github.io/iptv/regions/lac.m3u Maghreb60https://iptv-org.github.io/iptv/regions/maghreb.m3u - Middle East698https://iptv-org.github.io/iptv/regions/mideast.m3u - Middle East and North Africa749https://iptv-org.github.io/iptv/regions/mena.m3u - Nordics97https://iptv-org.github.io/iptv/regions/nord.m3u - North America2613https://iptv-org.github.io/iptv/regions/noram.m3u - Northern America2016https://iptv-org.github.io/iptv/regions/nam.m3u - Northern Europe126https://iptv-org.github.io/iptv/regions/neur.m3u - Oceania55https://iptv-org.github.io/iptv/regions/oce.m3u - South America1193https://iptv-org.github.io/iptv/regions/southam.m3u + Middle East688https://iptv-org.github.io/iptv/regions/mideast.m3u + Middle East and North Africa739https://iptv-org.github.io/iptv/regions/mena.m3u + Nordics96https://iptv-org.github.io/iptv/regions/nord.m3u + North America2576https://iptv-org.github.io/iptv/regions/noram.m3u + Northern America1979https://iptv-org.github.io/iptv/regions/nam.m3u + Northern Europe125https://iptv-org.github.io/iptv/regions/neur.m3u + Oceania68https://iptv-org.github.io/iptv/regions/oce.m3u + South America1195https://iptv-org.github.io/iptv/regions/southam.m3u South Asia593https://iptv-org.github.io/iptv/regions/sas.m3u Southeast Asia492https://iptv-org.github.io/iptv/regions/sea.m3u - Southern Europe1097https://iptv-org.github.io/iptv/regions/ser.m3u - Sub-Saharan Africa339https://iptv-org.github.io/iptv/regions/ssa.m3u - West Africa139https://iptv-org.github.io/iptv/regions/wafr.m3u - Western Europe1002https://iptv-org.github.io/iptv/regions/wer.m3u + Southern Europe1095https://iptv-org.github.io/iptv/regions/ser.m3u + Sub-Saharan Africa340https://iptv-org.github.io/iptv/regions/ssa.m3u + West Africa140https://iptv-org.github.io/iptv/regions/wafr.m3u + Western Europe1003https://iptv-org.github.io/iptv/regions/wer.m3u diff --git a/package-lock.json b/package-lock.json index e16a1924b..de69f1752 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "name": "iptv", "license": "MIT", "dependencies": { + "@freearhey/core": "^0.1.2", "@octokit/core": "^4.2.1", "@octokit/plugin-paginate-rest": "^7.1.2", "@octokit/plugin-rest-endpoint-methods": "^7.1.3", @@ -33,6 +34,20 @@ "transliteration": "^2.3.5", "ts-jest": "^29.1.1", "typescript": "^5.2.2" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", + "eslint": "^8.49.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { @@ -675,6 +690,166 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@freearhey/core": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@freearhey/core/-/core-0.1.2.tgz", + "integrity": "sha512-o6FaLHiKED0JkUXxqHcUUM2P+Jd4kvE96p0MZlLjhCFAPii/lVr5mTwrHehKMzve/r7AbDUX7kyNLNG8Qec6uw==", + "dependencies": { + "@types/fs-extra": "^11.0.2", + "@types/lodash": "^4.14.198", + "fs-extra": "^11.1.1", + "glob": "^10.3.4", + "lodash": "^4.17.21", + "natural-orderby": "^3.0.2", + "normalize-url": "^6.1.0", + "signale": "^1.4.0" + } + }, + "node_modules/@freearhey/core/node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1145,6 +1320,41 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@octokit/auth-token": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", @@ -1430,9 +1640,9 @@ } }, "node_modules/@types/fs-extra": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", - "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz", + "integrity": "sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==", "dependencies": { "@types/jsonfile": "*", "@types/node": "*" @@ -1495,6 +1705,12 @@ "jest-expect-message": "*" } }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, "node_modules/@types/jsonfile": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", @@ -1518,6 +1734,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz", "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==" }, + "node_modules/@types/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "dev": true + }, "node_modules/@types/signale": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/@types/signale/-/signale-1.4.4.tgz", @@ -1544,12 +1766,295 @@ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "optional": true, - "peer": true, + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -1557,6 +2062,31 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1832,7 +2362,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "peer": true, "engines": { "node": ">=6" } @@ -1990,10 +2519,9 @@ } }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "peer": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -2020,6 +2548,12 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -2061,6 +2595,30 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2123,6 +2681,244 @@ "node": ">=8" } }, + "node_modules/eslint": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -2136,6 +2932,48 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -2183,11 +3021,81 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-glob/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -2216,6 +3124,18 @@ "node": ">=0.8.0" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -2279,6 +3199,26 @@ "node": ">=8" } }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, "node_modules/foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -2462,6 +3402,39 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-parent/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -2540,6 +3513,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2575,6 +3554,40 @@ "node": ">=10.17.0" } }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -2598,7 +3611,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "peer": true, "engines": { "node": ">=0.8.19" } @@ -2693,6 +3705,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -3584,6 +4605,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -3595,6 +4622,18 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "peer": true }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -3625,6 +4664,15 @@ "node": ">= 10.0.0" } }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -3643,6 +4691,19 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -3704,6 +4765,12 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3803,6 +4870,15 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "peer": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -3846,14 +4922,12 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "peer": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/natural-orderby": { "version": "3.0.2", @@ -3976,6 +5050,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -4009,6 +5100,18 @@ "node": ">=6" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -4080,6 +5183,15 @@ "node": "14 || >=16.14" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -4217,6 +5329,15 @@ "node": ">=8" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-format": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", @@ -4254,6 +5375,15 @@ "node": ">= 6" } }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/pure-rand": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz", @@ -4279,6 +5409,26 @@ "teleport": ">=0.2.0" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -4339,6 +5489,74 @@ "node": ">=10" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -4590,7 +5808,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "peer": true, "engines": { "node": ">=8" }, @@ -4674,6 +5891,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -4772,6 +5995,18 @@ "node": ">=0.8.0" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { "version": "29.1.1", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", @@ -4890,6 +6125,18 @@ "node": ">=0.4.0" } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -4936,6 +6183,15 @@ "node": ">= 4.0.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -5076,7 +6332,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "peer": true, "engines": { "node": ">=10" }, @@ -5086,6 +6341,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.1.tgz", @@ -5563,6 +6824,121 @@ "@jridgewell/trace-mapping": "0.3.9" } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dev": true + }, + "@freearhey/core": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@freearhey/core/-/core-0.1.2.tgz", + "integrity": "sha512-o6FaLHiKED0JkUXxqHcUUM2P+Jd4kvE96p0MZlLjhCFAPii/lVr5mTwrHehKMzve/r7AbDUX7kyNLNG8Qec6uw==", + "requires": { + "@types/fs-extra": "^11.0.2", + "@types/lodash": "^4.14.198", + "fs-extra": "^11.1.1", + "glob": "^10.3.4", + "lodash": "^4.17.21", + "natural-orderby": "^3.0.2", + "normalize-url": "^6.1.0", + "signale": "^1.4.0" + }, + "dependencies": { + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -5935,6 +7311,32 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@octokit/auth-token": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", @@ -6201,9 +7603,9 @@ } }, "@types/fs-extra": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", - "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz", + "integrity": "sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==", "requires": { "@types/jsonfile": "*", "@types/node": "*" @@ -6265,62 +7667,260 @@ "jest-expect-message": "*" } }, - "@types/jsonfile": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", - "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", + "@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true + }, + "@types/jsonfile": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", + "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", + "requires": { + "@types/node": "*" + } + }, + "@types/lodash": { + "version": "4.14.198", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", + "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==" + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "@types/node": { + "version": "17.0.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz", + "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==" + }, + "@types/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", + "dev": true + }, + "@types/signale": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@types/signale/-/signale-1.4.4.tgz", + "integrity": "sha512-VYy4VL64gA4uyUIYVj4tiGFF0VpdnRbJeqNENKGX42toNiTvt83rRzxdr0XK4DR3V01zPM0JQNIsL+IwWWfhsQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", + "dev": true, "requires": { - "@types/node": "*" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "semver": "^7.5.4" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, - "@types/lodash": { - "version": "4.14.198", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", - "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==" - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" - }, - "@types/node": { - "version": "17.0.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz", - "integrity": "sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==" - }, - "@types/signale": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@types/signale/-/signale-1.4.4.tgz", - "integrity": "sha512-VYy4VL64gA4uyUIYVj4tiGFF0VpdnRbJeqNENKGX42toNiTvt83rRzxdr0XK4DR3V01zPM0JQNIsL+IwWWfhsQ==", + "@typescript-eslint/visitor-keys": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", + "dev": true, "requires": { - "@types/node": "*" + "@typescript-eslint/types": "6.7.2", + "eslint-visitor-keys": "^3.4.1" } }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "devOptional": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} }, - "@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { - "@types/yargs-parser": "*" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "optional": true, - "peer": true - }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -6533,8 +8133,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "peer": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camelcase": { "version": "5.3.1", @@ -6641,10 +8240,9 @@ } }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "peer": true, + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -6656,6 +8254,12 @@ "peer": true, "requires": {} }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -6685,6 +8289,24 @@ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==" }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -6737,12 +8359,204 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" }, + "eslint": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "globals": { + "version": "13.22.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz", + "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "peer": true }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -6778,11 +8592,71 @@ "jest-util": "^29.6.3" } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -6807,6 +8681,15 @@ } } }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -6849,6 +8732,23 @@ "path-exists": "^4.0.0" } }, + "flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "requires": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, "foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -6997,6 +8897,32 @@ } } }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -7040,6 +8966,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -7066,6 +8998,30 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "peer": true }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -7079,8 +9035,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "peer": true + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, "inflight": { "version": "1.0.6", @@ -7151,6 +9106,12 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -7824,6 +9785,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "peer": true }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -7835,6 +9802,18 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "peer": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -7856,6 +9835,15 @@ } } }, + "keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -7868,6 +9856,16 @@ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "peer": true }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -7919,6 +9917,12 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -7993,6 +9997,12 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "peer": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -8024,14 +10034,12 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "peer": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "natural-orderby": { "version": "3.0.2", @@ -8121,6 +10129,20 @@ "mimic-fn": "^2.1.0" } }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -8142,6 +10164,15 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -8191,6 +10222,12 @@ } } }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -8288,6 +10325,12 @@ "find-up": "^4.0.0" } }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, "pretty-format": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", @@ -8315,6 +10358,12 @@ "sisteransi": "^1.0.5" } }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, "pure-rand": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz", @@ -8326,6 +10375,12 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -8368,6 +10423,46 @@ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "peer": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -8561,8 +10656,7 @@ "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "peer": true + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "strip-outer": { "version": "1.0.1", @@ -8620,6 +10714,12 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -8694,6 +10794,13 @@ } } }, + "ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "requires": {} + }, "ts-jest": { "version": "29.1.1", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", @@ -8755,6 +10862,15 @@ } } }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -8782,6 +10898,15 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -8889,8 +11014,7 @@ "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "peer": true + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/package.json b/package.json index 55ec7891f..fdef5ed7e 100644 --- a/package.json +++ b/package.json @@ -20,14 +20,15 @@ "update": "npm run api:load && npm run playlist:generate && npm run api:generate && npm run readme:update", "deploy": "npm run playlist:deploy && npm run api:deploy", "report": "npm run api:load && npm run report:create", + "lint": "npx eslint ./scripts/**/*.ts ./tests/**/*.ts", "test": "jest --runInBand", "ts-node": "node --no-warnings=ExperimentalWarning --experimental-specifier-resolution=node --loader ts-node/esm" }, "jest": { "transform": { - "^.*test.(ts|js)$": "ts-jest" + "^.+\\.ts$": "ts-jest" }, - "testRegex": "tests/(.*?/)?.*test.(ts|js)$", + "testRegex": "tests/(.*?/)?.*test.ts$", "setupFilesAfterEnv": [ "jest-expect-message" ] @@ -40,8 +41,8 @@ "author": "Arhey", "private": true, "license": "MIT", - "type": "module", "dependencies": { + "@freearhey/core": "^0.1.2", "@octokit/core": "^4.2.1", "@octokit/plugin-paginate-rest": "^7.1.2", "@octokit/plugin-rest-endpoint-methods": "^7.1.3", @@ -68,5 +69,10 @@ "transliteration": "^2.3.5", "ts-jest": "^29.1.1", "typescript": "^5.2.2" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", + "eslint": "^8.49.0" } } diff --git a/scripts/commands/api/generate.ts b/scripts/commands/api/generate.ts index 0c0b033d7..f1acd6a8c 100644 --- a/scripts/commands/api/generate.ts +++ b/scripts/commands/api/generate.ts @@ -1,5 +1,6 @@ +import { Logger, Storage } from '@freearhey/core' import { API_DIR, STREAMS_DIR } from '../../constants' -import { Logger, PlaylistParser, Storage } from '../../core' +import { PlaylistParser } from '../../core' import { Stream } from '../../models' async function main() { diff --git a/scripts/commands/playlist/format.ts b/scripts/commands/playlist/format.ts index 862b90e36..d532db607 100644 --- a/scripts/commands/playlist/format.ts +++ b/scripts/commands/playlist/format.ts @@ -1,5 +1,6 @@ +import { Logger, Storage, Collection } from '@freearhey/core' import { STREAMS_DIR, DATA_DIR } from '../../constants' -import { Storage, Logger, PlaylistParser, Collection } from '../../core' +import { PlaylistParser } from '../../core' import { Stream, Playlist, Channel } from '../../models' import { program } from 'commander' diff --git a/scripts/commands/playlist/generate.ts b/scripts/commands/playlist/generate.ts index 44a75be23..7ca6d4a80 100644 --- a/scripts/commands/playlist/generate.ts +++ b/scripts/commands/playlist/generate.ts @@ -1,7 +1,6 @@ -import { File, PlaylistParser, Storage } from '../../core' +import { Logger, Storage, Collection, File } from '@freearhey/core' +import { PlaylistParser } from '../../core' import { Stream, Category, Channel, Language, Country, Region, Subdivision } from '../../models' -import { Collection } from '../../core/collection' -import { Logger } from '../../core/logger' import _ from 'lodash' import { CategoriesGenerator, @@ -124,7 +123,7 @@ async function loadStreams({ if (channel.logo) stream.logo = channel.logo } else { const file = new File(stream.filepath) - const [_, countryCode] = file.getFilename().match(/^([a-z]{2})(_|$)/) || [null, null] + const [_, countryCode] = file.name().match(/^([a-z]{2})(_|$)/) || [null, null] const defaultBroadcastArea = countryCode ? [`c/${countryCode.toUpperCase()}`] : [] stream.broadcastArea = new Collection(defaultBroadcastArea) diff --git a/scripts/commands/playlist/update.ts b/scripts/commands/playlist/update.ts index 2eab9107d..b9814f463 100644 --- a/scripts/commands/playlist/update.ts +++ b/scripts/commands/playlist/update.ts @@ -1,5 +1,6 @@ +import { Logger, Storage, Collection, Dictionary } from '@freearhey/core' import { DATA_DIR, STREAMS_DIR } from '../../constants' -import { Storage, Logger, Collection, Dictionary, IssueLoader, PlaylistParser } from '../../core' +import { IssueLoader, PlaylistParser } from '../../core' import { Stream, Playlist, Channel, Issue } from '../../models' let processedIssues = new Collection() diff --git a/scripts/commands/playlist/validate.ts b/scripts/commands/playlist/validate.ts index 03295a47c..b128058cf 100644 --- a/scripts/commands/playlist/validate.ts +++ b/scripts/commands/playlist/validate.ts @@ -1,4 +1,5 @@ -import { Logger, Storage, PlaylistParser, Collection, File, Dictionary } from '../../core' +import { Logger, Storage, Collection, Dictionary, File } from '@freearhey/core' +import { PlaylistParser } from '../../core' import { Channel, Stream, Blocked } from '../../models' import { program } from 'commander' import chalk from 'chalk' diff --git a/scripts/commands/readme/update.ts b/scripts/commands/readme/update.ts index 5dc06ae98..7af55feff 100644 --- a/scripts/commands/readme/update.ts +++ b/scripts/commands/readme/update.ts @@ -1,5 +1,6 @@ +import { Logger } from '@freearhey/core' import { CategoryTable, CountryTable, LanguageTable, RegionTable } from '../../tables' -import { Logger, Markdown } from '../../core' +import { Markdown } from '../../core' import { README_DIR } from '../../constants' import path from 'path' diff --git a/scripts/commands/report/create.ts b/scripts/commands/report/create.ts index d3da0a9d4..030a10d60 100644 --- a/scripts/commands/report/create.ts +++ b/scripts/commands/report/create.ts @@ -1,5 +1,6 @@ +import { Logger, Storage, Collection, Dictionary } from '@freearhey/core' import { DATA_DIR, STREAMS_DIR } from '../../constants' -import { Collection, Dictionary, IssueLoader, Storage, Logger, PlaylistParser } from '../../core' +import { IssueLoader, PlaylistParser } from '../../core' import { Blocked, Channel, Issue, Stream } from '../../models' async function main() { @@ -27,22 +28,25 @@ async function main() { const streams = await parser.parse(files) const groupedStreams = streams.groupBy((stream: Stream) => stream.url) - logger.info('loading issue from github...') - const issues = await loader.load({ labels: ['streams:add'] }) - logger.info('creating report...') + let report = new Collection() + + logger.info('checking streams:add requests...') + const addRequests = await loader.load({ labels: ['streams:add'] }) const buffer = new Dictionary() - const report = issues.map((issue: Issue) => { + addRequests.forEach((issue: Issue) => { const channelId = issue.data.get('channel_id') || undefined const streamUrl = issue.data.get('stream_url') || undefined const result = new Dictionary({ issueNumber: issue.number, + type: 'streams:add', channelId, status: undefined }) - if (!channelId || !streamUrl) result.set('status', 'error') + if (!channelId) result.set('status', 'missing_id') + else if (!streamUrl) result.set('status', 'missing_link') else if (groupedBlocklist.has(channelId)) result.set('status', 'blocked') else if (groupedChannels.missing(channelId)) result.set('status', 'invalid_id') else if (groupedStreams.has(streamUrl)) result.set('status', 'fullfilled') @@ -51,9 +55,51 @@ async function main() { buffer.set(streamUrl, true) - return result.data() + report.add(result.data()) }) + logger.info('checking streams:edit requests...') + const editRequests = await loader.load({ labels: ['streams:edit'] }) + editRequests.forEach((issue: Issue) => { + const channelId = issue.data.get('channel_id') || undefined + const streamUrl = issue.data.get('stream_url') || undefined + + const result = new Dictionary({ + issueNumber: issue.number, + type: 'streams:edit', + channelId, + status: undefined + }) + + if (!streamUrl) result.set('status', 'missing_link') + else if (groupedStreams.missing(streamUrl)) result.set('status', 'invalid_link') + else if (channelId && groupedChannels.missing(channelId)) result.set('status', 'invalid_id') + else result.set('status', 'pending') + + report.add(result.data()) + }) + + logger.info('checking broken streams reports...') + const brokenStreamReports = await loader.load({ labels: ['broken stream'] }) + brokenStreamReports.forEach((issue: Issue) => { + const streamUrl = issue.data.get('stream_url') || undefined + + const result = new Dictionary({ + issueNumber: issue.number, + type: 'broken stream', + channelId: undefined, + status: undefined + }) + + if (!streamUrl) result.set('status', 'missing_link') + else if (groupedStreams.missing(streamUrl)) result.set('status', 'invalid_link') + else result.set('status', 'pending') + + report.add(result.data()) + }) + + report = report.orderBy(item => item.issueNumber) + console.table(report.all()) } diff --git a/scripts/core/collection.ts b/scripts/core/collection.ts deleted file mode 100644 index 92836dcb5..000000000 --- a/scripts/core/collection.ts +++ /dev/null @@ -1,175 +0,0 @@ -import _ from 'lodash' -import { orderBy, Order } from 'natural-orderby' -import { Dictionary } from './' - -type Iteratee = (value: any, value2?: any) => void - -export class Collection { - _items: any[] - - constructor(items?: any[]) { - this._items = Array.isArray(items) ? items : [] - } - - first(predicate?: Iteratee) { - if (predicate) { - return this._items.find(predicate) - } - - return this._items[0] - } - - last(predicate?: Iteratee) { - if (predicate) { - return _.findLast(this._items, predicate) - } - - return this._items[this._items.length - 1] - } - - find(iteratee: Iteratee): Collection { - const found = this._items.filter(iteratee) - - return new Collection(found) - } - - add(data: any) { - this._items.push(data) - - return this - } - - intersects(collection: Collection): boolean { - return _.intersection(this._items, collection.all()).length > 0 - } - - count() { - return this._items.length - } - - join(separator: string) { - return this._items.join(separator) - } - - indexOf(value: string) { - return this._items.indexOf(value) - } - - push(data: any) { - this.add(data) - } - - uniq() { - const items = _.uniq(this._items) - - return new Collection(items) - } - - reduce(iteratee: Iteratee, accumulator: any) { - const items = _.reduce(this._items, iteratee, accumulator) - - return new Collection(items) - } - - filter(iteratee: Iteratee) { - const items = _.filter(this._items, iteratee) - - return new Collection(items) - } - - forEach(iteratee: Iteratee) { - for (let item of this._items) { - iteratee(item) - } - - return this - } - - remove(iteratee: Iteratee): Collection { - const removed = _.remove(this._items, iteratee) - - return new Collection(removed) - } - - concat(collection: Collection) { - const items = this._items.concat(collection._items) - - return new Collection(items) - } - - isEmpty(): boolean { - return this._items.length === 0 - } - - notEmpty(): boolean { - return this._items.length > 0 - } - - sort() { - const items = this._items.sort() - - return new Collection(items) - } - - orderBy(iteratees: Iteratee | Iteratee[], orders?: Order | Order[]) { - const items = orderBy(this._items, iteratees, orders) - - return new Collection(items) - } - - keyBy(iteratee: Iteratee) { - const items = _.keyBy(this._items, iteratee) - - return new Dictionary(items) - } - - empty() { - return this._items.length === 0 - } - - includes(value: any) { - if (typeof value === 'function') { - const found = this._items.find(value) - - return !!found - } - - return this._items.includes(value) - } - - missing(value: any) { - if (typeof value === 'function') { - const found = this._items.find(value) - - return !found - } - - return !this._items.includes(value) - } - - uniqBy(iteratee: Iteratee) { - const items = _.uniqBy(this._items, iteratee) - - return new Collection(items) - } - - groupBy(iteratee: Iteratee) { - const object = _.groupBy(this._items, iteratee) - - return new Dictionary(object) - } - - map(iteratee: Iteratee) { - const items = this._items.map(iteratee) - - return new Collection(items) - } - - all() { - return this._items - } - - toJSON() { - return JSON.stringify(this._items) - } -} diff --git a/scripts/core/dictionary.ts b/scripts/core/dictionary.ts deleted file mode 100644 index 0058f58e4..000000000 --- a/scripts/core/dictionary.ts +++ /dev/null @@ -1,31 +0,0 @@ -export class Dictionary { - dict: any - - constructor(dict?: any) { - this.dict = dict || {} - } - - set(key: string, value: any) { - this.dict[key] = value - } - - has(key: string): boolean { - return !!this.dict[key] - } - - missing(key: string): boolean { - return !this.dict[key] - } - - get(key: string): any { - return this.dict[key] ? this.dict[key] : undefined - } - - keys(): string[] { - return Object.keys(this.dict) - } - - data() { - return this.dict - } -} diff --git a/scripts/core/file.ts b/scripts/core/file.ts deleted file mode 100644 index 54c88fe64..000000000 --- a/scripts/core/file.ts +++ /dev/null @@ -1,31 +0,0 @@ -import * as path from 'path' - -export class File { - filepath: string - content: string - - constructor(filepath: string, content?: string) { - this.filepath = path.normalize(filepath) - this.content = content || '' - } - - getFilename() { - return path.parse(this.filepath).name - } - - dirname() { - return path.dirname(this.filepath) - } - - basename() { - return path.basename(this.filepath) - } - - append(data: string) { - this.content = this.content + data - } - - extension() { - return this.filepath.split('.').pop() - } -} 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/index.ts b/scripts/core/index.ts index 75090eca2..a1419eb00 100644 --- a/scripts/core/index.ts +++ b/scripts/core/index.ts @@ -1,13 +1,7 @@ -export * from './logger' export * from './playlistParser' export * from './numberParser' export * from './logParser' export * from './markdown' -export * from './file' -export * from './collection' -export * from './dictionary' -export * from './storage' -export * from './url' export * from './issueLoader' export * from './issueParser' export * from './htmlTable' diff --git a/scripts/core/issueLoader.ts b/scripts/core/issueLoader.ts index 572e9d789..34c7cb2b0 100644 --- a/scripts/core/issueLoader.ts +++ b/scripts/core/issueLoader.ts @@ -1,7 +1,8 @@ +import { Collection } from '@freearhey/core' import { restEndpointMethods } from '@octokit/plugin-rest-endpoint-methods' import { paginateRest } from '@octokit/plugin-paginate-rest' import { Octokit } from '@octokit/core' -import { Collection, IssueParser } from './' +import { IssueParser } from './' import { TESTING, OWNER, REPO } from '../constants' const CustomOctokit = Octokit.plugin(paginateRest, restEndpointMethods) @@ -10,21 +11,26 @@ 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': - issues = (await import('../../tests/__data__/input/issues/streams_add')).default + issues = require('../../tests/__data__/input/issues/streams_add.js') + break + case 'streams:edit': + issues = require('../../tests/__data__/input/issues/streams_edit.js') + break + case 'broken stream': + issues = require('../../tests/__data__/input/issues/broken_stream.js') break case 'streams:add,approved': - issues = (await import('../../tests/__data__/input/issues/streams_add_approved')).default + issues = require('../../tests/__data__/input/issues/streams_add_approved.js') break case 'streams:edit,approved': - issues = (await import('../../tests/__data__/input/issues/streams_edit_approved')).default + issues = require('../../tests/__data__/input/issues/streams_edit_approved.js') break case 'streams:remove,approved': - issues = (await import('../../tests/__data__/input/issues/streams_remove_approved')) - .default + issues = require('../../tests/__data__/input/issues/streams_remove_approved.js') break } } else { diff --git a/scripts/core/issueParser.ts b/scripts/core/issueParser.ts index bcc6dcc70..196e03920 100644 --- a/scripts/core/issueParser.ts +++ b/scripts/core/issueParser.ts @@ -1,6 +1,5 @@ -import { Dictionary } from './' +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() @@ -40,6 +39,8 @@ export class IssueParser { data.set(id, value) }) - return new Issue({ number: issue.number, data }) + const labels = issue.labels.map(label => label.name) + + return new Issue({ number: issue.number, labels, data }) } } 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/logger.ts b/scripts/core/logger.ts deleted file mode 100644 index 0305ddd00..000000000 --- a/scripts/core/logger.ts +++ /dev/null @@ -1,9 +0,0 @@ -import signale from 'signale' - -const { Signale } = signale - -export class Logger extends Signale { - constructor(options?: any) { - super(options) - } -} diff --git a/scripts/core/playlistParser.ts b/scripts/core/playlistParser.ts index 7a96dacc7..296288e13 100644 --- a/scripts/core/playlistParser.ts +++ b/scripts/core/playlistParser.ts @@ -1,6 +1,6 @@ +import { Collection, Storage } from '@freearhey/core' import parser from 'iptv-playlist-parser' import { Stream } from '../models' -import { Collection, Storage } from './' import path from 'path' import { STREAMS_DIR } from '../constants' @@ -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) @@ -26,7 +26,7 @@ export class PlaylistParser { async parseFile(filepath: string): Promise { const streams = new Collection() - const content = await this.storage.read(filepath) + const content = await this.storage.load(filepath) const parsed: parser.Playlist = parser.parse(content) parsed.items.forEach((item: parser.PlaylistItem) => { diff --git a/scripts/core/storage.ts b/scripts/core/storage.ts deleted file mode 100644 index 81f2ede4f..000000000 --- a/scripts/core/storage.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { File, Collection } from './' -import * as path from 'path' -import fs from 'fs-extra' -import { glob } from 'glob' - -export class Storage { - rootDir: string - - constructor(rootDir?: string) { - this.rootDir = path.normalize(rootDir || './') - } - - async list(pattern: string): Promise { - const files = await glob(pattern, { - cwd: this.rootDir - }) - - return files.sort() - } - - async createDir(dir: string): Promise { - if (await fs.exists(dir)) return - - await fs.mkdir(dir, { recursive: true }).catch(console.error) - } - - async load(filepath: string): Promise { - return this.read(filepath) - } - - async read(filepath: string): Promise { - const absFilepath = path.join(this.rootDir, filepath) - - return await fs.readFile(absFilepath, { encoding: 'utf8' }) - } - - async json(filepath: string): Promise { - const absFilepath = path.join(this.rootDir, filepath) - const content = await fs.readFile(absFilepath, { encoding: 'utf8' }) - - return JSON.parse(content) - } - - async exists(filepath: string): Promise { - const absFilepath = path.join(this.rootDir, filepath) - - return await fs.exists(absFilepath) - } - - async write(filepath: string, data: string = ''): Promise { - const absFilepath = path.join(this.rootDir, filepath) - const dir = path.dirname(absFilepath) - - await this.createDir(dir) - await fs.writeFile(absFilepath, data, { encoding: 'utf8', flag: 'w' }) - } - - async append(filepath: string, data: string = ''): Promise { - const absFilepath = path.join(this.rootDir, filepath) - - await fs.appendFile(absFilepath, data, { encoding: 'utf8', flag: 'w' }) - } - - async clear(filepath: string): Promise { - await this.write(filepath) - } - - async createStream(filepath: string): Promise { - const absFilepath = path.join(this.rootDir, filepath) - const dir = path.dirname(absFilepath) - - await this.createDir(dir) - - return fs.createWriteStream(absFilepath) as unknown as NodeJS.WriteStream - } - - async save(filepath: string, content: string): Promise { - await this.write(filepath, content) - } - - async saveFile(file: File): Promise { - await this.write(file.filepath, file.content) - } -} diff --git a/scripts/core/url.ts b/scripts/core/url.ts deleted file mode 100644 index df6ff4dd8..000000000 --- a/scripts/core/url.ts +++ /dev/null @@ -1,20 +0,0 @@ -import normalizeUrl from 'normalize-url' - -export class URL { - url: string - - constructor(url: string) { - this.url = url - } - - normalize(): URL { - const normalized = normalizeUrl(this.url, { stripWWW: false }) - this.url = decodeURIComponent(normalized).replace(/\s/g, '+') - - return this - } - - toString(): string { - return this.url - } -} diff --git a/scripts/generators/categoriesGenerator.ts b/scripts/generators/categoriesGenerator.ts index 48a99107e..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 '../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 bd683760a..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 '../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 733eb9186..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 '../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 f48945047..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 '../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 9a8754db9..b4389ff5f 100644 --- a/scripts/generators/indexGenerator.ts +++ b/scripts/generators/indexGenerator.ts @@ -1,32 +1,32 @@ -import { Collection, Logger, Storage } from '../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 692e896dd..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 '../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 500d51c9a..a1f0a8062 100644 --- a/scripts/generators/indexNsfwGenerator.ts +++ b/scripts/generators/indexNsfwGenerator.ts @@ -1,30 +1,30 @@ -import { Collection, Logger, Storage } from '../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 ebebb85e6..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 '../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 728807e9a..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 '../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 d2325c3a6..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 '../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/channel.ts b/scripts/models/channel.ts index 668b72914..dd7a7a1d9 100644 --- a/scripts/models/channel.ts +++ b/scripts/models/channel.ts @@ -1,4 +1,4 @@ -import { Collection } from '../core' +import { Collection } from '@freearhey/core' type ChannelProps = { id: string diff --git a/scripts/models/issue.ts b/scripts/models/issue.ts index 85261261c..fecb1fde1 100644 --- a/scripts/models/issue.ts +++ b/scripts/models/issue.ts @@ -1,16 +1,19 @@ -import { Dictionary } from '../core' +import { Dictionary } from '@freearhey/core' type IssueProps = { number: number + labels: string[] data: Dictionary } export class Issue { number: number + labels: string[] data: Dictionary - constructor({ number, data }: IssueProps) { + constructor({ number, labels, data }: IssueProps) { this.number = number + this.labels = labels this.data = data } } diff --git a/scripts/models/playlist.ts b/scripts/models/playlist.ts index b9b5c60ac..ba0a25c5c 100644 --- a/scripts/models/playlist.ts +++ b/scripts/models/playlist.ts @@ -1,4 +1,4 @@ -import { Collection } from '../core' +import { Collection } from '@freearhey/core' import { Stream } from '../models' type PlaylistOptions = { @@ -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/models/region.ts b/scripts/models/region.ts index 6db1c3a43..72b30c192 100644 --- a/scripts/models/region.ts +++ b/scripts/models/region.ts @@ -1,4 +1,4 @@ -import { Collection } from '../core' +import { Collection } from '@freearhey/core' type RegionProps = { code: string diff --git a/scripts/models/stream.ts b/scripts/models/stream.ts index b6d3e20c3..37559f931 100644 --- a/scripts/models/stream.ts +++ b/scripts/models/stream.ts @@ -1,4 +1,4 @@ -import { URL, Collection } from '../core' +import { URL, Collection } from '@freearhey/core' import { Category, Language } from './index' type StreamProps = { @@ -86,7 +86,7 @@ export class Stream { } noCategories(): boolean { - return this.categories.empty() + return this.categories.isEmpty() } hasCategory(category: Category): boolean { @@ -94,7 +94,7 @@ export class Stream { } noLanguages(): boolean { - return this.languages.empty() + return this.languages.isEmpty() } hasLanguage(language: Language): boolean { @@ -102,7 +102,7 @@ export class Stream { } noBroadcastArea(): boolean { - return this.broadcastArea.empty() + return this.broadcastArea.isEmpty() } isInternational(): boolean { diff --git a/scripts/tables/categoryTable.ts b/scripts/tables/categoryTable.ts index 57f11c15b..a3fb49f14 100644 --- a/scripts/tables/categoryTable.ts +++ b/scripts/tables/categoryTable.ts @@ -1,4 +1,5 @@ -import { Storage, HTMLTable, Collection, LogParser, LogItem, File } from '../core' +import { Storage, Collection, File } from '@freearhey/core' +import { HTMLTable, LogParser, LogItem } from '../core' import { Category } from '../models' import { DATA_DIR, LOGS_DIR, README_DIR } from '../constants' import { Table } from './table' @@ -13,7 +14,7 @@ export class CategoryTable implements Table { const parser = new LogParser() const logsStorage = new Storage(LOGS_DIR) - const generatorsLog = await logsStorage.read('generators.log') + const generatorsLog = await logsStorage.load('generators.log') let data = new Collection() parser @@ -21,7 +22,7 @@ export class CategoryTable implements Table { .filter((logItem: LogItem) => logItem.filepath.includes('categories/')) .forEach((logItem: LogItem) => { const file = new File(logItem.filepath) - const categoryId = file.getFilename() + const categoryId = file.name() const category: Category = categories.first( (category: Category) => category.id === categoryId ) diff --git a/scripts/tables/countryTable.ts b/scripts/tables/countryTable.ts index c78a23eaa..5e167b7fd 100644 --- a/scripts/tables/countryTable.ts +++ b/scripts/tables/countryTable.ts @@ -1,4 +1,5 @@ -import { Storage, HTMLTable, Collection, LogParser, LogItem, File } from '../core' +import { Storage, Collection, File } from '@freearhey/core' +import { HTMLTable, LogParser, LogItem } from '../core' import { Country, Subdivision } from '../models' import { DATA_DIR, LOGS_DIR, README_DIR } from '../constants' import { Table } from './table' @@ -17,7 +18,7 @@ export class CountryTable implements Table { const parser = new LogParser() const logsStorage = new Storage(LOGS_DIR) - const generatorsLog = await logsStorage.read('generators.log') + const generatorsLog = await logsStorage.load('generators.log') let data = new Collection() parser @@ -28,7 +29,7 @@ export class CountryTable implements Table { ) .forEach((logItem: LogItem) => { const file = new File(logItem.filepath) - const code = file.getFilename().toUpperCase() + const code = file.name().toUpperCase() const [countryCode, subdivisionCode] = code.split('-') || ['', ''] if (subdivisionCode) { @@ -47,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/scripts/tables/languageTable.ts b/scripts/tables/languageTable.ts index 2b298b180..f0b54d242 100644 --- a/scripts/tables/languageTable.ts +++ b/scripts/tables/languageTable.ts @@ -1,4 +1,5 @@ -import { Storage, HTMLTable, Collection, LogParser, LogItem, File } from '../core' +import { Storage, Collection, File } from '@freearhey/core' +import { HTMLTable, LogParser, LogItem } from '../core' import { Language } from '../models' import { DATA_DIR, LOGS_DIR, README_DIR } from '../constants' import { Table } from './table' @@ -13,7 +14,7 @@ export class LanguageTable implements Table { const parser = new LogParser() const logsStorage = new Storage(LOGS_DIR) - const generatorsLog = await logsStorage.read('generators.log') + const generatorsLog = await logsStorage.load('generators.log') let data = new Collection() parser @@ -21,7 +22,7 @@ export class LanguageTable implements Table { .filter((logItem: LogItem) => logItem.filepath.includes('languages/')) .forEach((logItem: LogItem) => { const file = new File(logItem.filepath) - const languageCode = file.getFilename() + const languageCode = file.name() const language: Language = languages.first( (language: Language) => language.code === languageCode ) diff --git a/scripts/tables/regionTable.ts b/scripts/tables/regionTable.ts index ee29f4088..60a6e5ff7 100644 --- a/scripts/tables/regionTable.ts +++ b/scripts/tables/regionTable.ts @@ -1,4 +1,5 @@ -import { Storage, HTMLTable, Collection, LogParser, LogItem, File } from '../core' +import { Storage, Collection, File } from '@freearhey/core' +import { HTMLTable, LogParser, LogItem } from '../core' import { Region } from '../models' import { DATA_DIR, LOGS_DIR, README_DIR } from '../constants' import { Table } from './table' @@ -13,7 +14,7 @@ export class RegionTable implements Table { const parser = new LogParser() const logsStorage = new Storage(LOGS_DIR) - const generatorsLog = await logsStorage.read('generators.log') + const generatorsLog = await logsStorage.load('generators.log') let data = new Collection() parser @@ -21,7 +22,7 @@ export class RegionTable implements Table { .filter((logItem: LogItem) => logItem.filepath.includes('regions/')) .forEach((logItem: LogItem) => { const file = new File(logItem.filepath) - const regionCode = file.getFilename().toUpperCase() + const regionCode = file.name().toUpperCase() const region: Region = regions.first((region: Region) => region.code === regionCode) if (region) { diff --git a/streams/ae.m3u b/streams/ae.m3u index 0eef93389..2b483b7bc 100644 --- a/streams/ae.m3u +++ b/streams/ae.m3u @@ -11,8 +11,6 @@ https://admdn5.cdn.mangomolo.com/adsports2/smil:adsports2.stream.smil/playlist.m https://dacastmmd.mmdlive.lldns.net/dacastmmd/d3e9fc3b874a46159ce3724d802e3f8d/playlist.m3u8 #EXTINF:-1 tvg-id="AlAanTV.ae",Al Aan TV (1080p) https://shls-live-ak.akamaized.net/out/v1/dfbdea4c1bf149629764e58c6ff314c8/index.m3u8 -#EXTINF:-1 tvg-id="AlAanTV.ae",Al Aan TV (720p) -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.dailymotion.com/AlAanTV #EXTINF:-1 tvg-id="Alarabiya.ae",Al Arabiya (1080p) https://live.alarabiya.net/alarabiapublish/alarabiya.smil/playlist.m3u8 #EXTINF:-1 tvg-id="Alarabiya.ae",Al Arabiya (1080p) @@ -52,8 +50,6 @@ https://shls-cartoon-net-prod-dub.shahid.net/out/v1/dc4aa87372374325a66be458f29e #EXTINF:-1 tvg-id="CitrussTV.ae",Citruss TV (720p) [Geo-blocked] https://d7km4gkevcbok.cloudfront.net/live/watch_720p30.m3u8 #EXTINF:-1 tvg-id="CNBCArabiya.ae",CNBC Arabia (1080p) -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.dailymotion.com/CNBCArabia -#EXTINF:-1 tvg-id="CNBCArabiya.ae",CNBC Arabia (1080p) https://ythls.onrender.com/channel/UCsHdPPJXT-yKVTLGkn3DSvQ.m3u8 #EXTINF:-1 tvg-id="DubaiOne.ae",Dubai One (1080p) https://dminnvll.cdn.mangomolo.com/dubaione/smil:dubaione.stream.smil/playlist.m3u8 @@ -159,7 +155,7 @@ https://weyyak-live.akamaized.net/weyyak_drama/index.m3u8 https://weyyak-live.akamaized.net/weyyak_mix/index.m3u8 #EXTINF:-1 tvg-id="WeyyakNawaem.ae",Weyyak Nawaem (720p) https://weyyak-live.akamaized.net/weyyak_nawaem/index.m3u8 -#EXTINF:-1 tvg-id="",Yas (1080p) +#EXTINF:-1 tvg-id="YasTV.ae",Yas TV (1080p) https://admdn1.cdn.mangomolo.com/yastv/smil:yastv.stream.smil/playlist.m3u8 #EXTINF:-1 tvg-id="ZeeAflam.in",Zee Aflam (720p) [Not 24/7] https://weyyak-live.akamaized.net/weyyak_zee_aflam/index.m3u8 diff --git a/streams/at.m3u b/streams/at.m3u index 80c0cdf67..2da4b6650 100644 --- a/streams/at.m3u +++ b/streams/at.m3u @@ -9,9 +9,9 @@ https://stream.openplayout.org/hls/dorftv/live.m3u8 http://stream.fs1.tv:8080/hls/webstream.m3u8 #EXTINF:-1 tvg-id="FS1Salzburg.at",FS1 Salzburg (720p) [Not 24/7] https://stream.fs1.tv/hls/webstream.m3u8 -#EXTINF:-1 tvg-id="FUELTV.at",Fuel TV (1080p) +#EXTINF:-1 tvg-id="FUELTV.at",FUEL TV (1080p) https://d35j504z0x2vu2.cloudfront.net/v1/manifest/0bc8e8376bd8417a1b6761138aa41c26c7309312/fuel-tv/606c2f67-acff-4152-975a-e5bfef54eb61/2.m3u8 -#EXTINF:-1 tvg-id="GoTV.at",GoTV (576p) +#EXTINF:-1 tvg-id="GoTV.at",GoTV (576p) [Not 24/7] https://nstream17.gotv.at:1443/live/gotvlive/manifest.mpd #EXTINF:-1 tvg-id="HitradioO3.at",Hitradio ร–3 (720p) [Not 24/7] https://studiocam-oe3.mdn.ors.at/out/u/studiocam_oe3/q6a/manifest_1.m3u8 @@ -23,12 +23,10 @@ https://kronetv.mdn.ors.at/out/u/kronetv-nodrm.m3u8 https://bitcdn-kronehit.bitmovin.com/v2/hls/playlist.m3u8 #EXTINF:-1 tvg-id="KurierTV.at",Kurier TV (720p) https://schautv.mdn.ors.at/out/u/schautv-nodrm.m3u8 -#EXTINF:-1 tvg-id="LandleTV.at",Lรคndle Tv (1080p) +#EXTINF:-1 tvg-id="LandleTV.at",Lรคndle TV (1080p) [Not 24/7] https://streaming13.huberwebmedia.at/LiveApp/streams/985585225397790082777809.m3u8 -#EXTINF:-1 tvg-id="M4.at",M4 (1090p) [Not 24/7] -https://5a32c05065c79.streamlock.net/live/stream/playlist.m3u8 -#EXTINF:-1 tvg-id="M4TV.at",M4TV [Geo-blocked] -https://streaming.m4tv.at/live/m4tv.stream/playlist.m3u8 +#EXTINF:-1 tvg-id="M4.at",GemeindeTV (1080p) [Not 24/7] +https://ythls.onrender.com/channel/UCbGaZEFvBLMe8eNgoBFDRZg.m3u8 #EXTINF:-1 tvg-id="Oe24TV.at",oe24 TV (1080p) https://varoe24live.sf.apa.at/oe24-live1/oe24.smil/playlist.m3u8 #EXTINF:-1 tvg-id="OktoTV.at",Okto TV (1080p) @@ -47,11 +45,11 @@ http://p3-6.mov.at:1935/live/weekstream/master.m3u8 https://ms01.w24.at/R9/smil:liveeventR9.smil/playlist.m3u8 #EXTINF:-1 tvg-id="RedBullTV.at",Red Bull TV (1080p) https://rbmn-live.akamaized.net/hls/live/590964/BoRB-AT/master.m3u8 -#EXTINF:-1 tvg-id="RTV.at",RTV (1080p) +#EXTINF:-1 tvg-id="RTV.at",RTV (1080p) [Not 24/7] http://iptv.rtv-ooe.at/stream.m3u8 #EXTINF:-1 tvg-id="SchladmingDachsteinTV.at",Schladming-Dachstein TV (720p) https://m317.video-stream-hosting.de/gzSoftware-live/_definst_/smil:livestream.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="ServusTV.at",ServusTV [Geo-blocked] +#EXTINF:-1 tvg-id="ServusTV.at",ServusTV (1080p) [Geo-blocked] https://stv-live.akamaized.net/hls/live/2031011/lingeoSTVATwebPri/master.m3u8 #EXTINF:-1 tvg-id="SwamijiTV.at",Swamiji TV (720p) [Not 24/7] https://stream.swamiji.tv/YogaIPTV/smil:YogaStream.smil/playlist.m3u8 diff --git a/streams/au.m3u b/streams/au.m3u index e91f2bd0d..2d4e74e62 100644 --- a/streams/au.m3u +++ b/streams/au.m3u @@ -1,9 +1,11 @@ #EXTM3U -#EXTINF:-1 tvg-id="ABCNewsAustralia.au",ABC News (720p) +#EXTINF:-1 tvg-id="ABCNewsAustralia.au",ABC News Australia (720p) https://abc-iview-mediapackagestreams-2.akamaized.net/out/v1/6e1cc6d25ec0480ea099a5399d73bc4b/index.m3u8 -#EXTINF:-1 tvg-id="AUSTamilTV.au",Aus Tamil (720p) [Not 24/7] +#EXTINF:-1 tvg-id="ABCNewsAustralia.au",ABC News Australia (720p) [Not 24/7] +https://ythls.onrender.com/channel/UCVgO39Bk5sMo66-6o6Spn6Q.m3u8 +#EXTINF:-1 tvg-id="AUSTamilTV.au",AUS Tamil TV (720p) [Not 24/7] https://bk7l2pn7dx53-hls-live.5centscdn.com/austamil/fe01ce2a7fbac8fafaed7c982a04e229.sdp/playlist.m3u8 -#EXTINF:-1 tvg-id="AusbizTV.au",ausbiz TV (720p) [Geo-blocked] +#EXTINF:-1 tvg-id="AusbizTV.au",ausbiz TV (720p) [Not 24/7] https://d9quh89lh7dtw.cloudfront.net/public-output/index.m3u8 #EXTINF:-1 tvg-id="C31Melbourne.au",C31 Melbourne (240p) https://d1k6kax80wecy5.cloudfront.net/RLnAKY/index.m3u8 @@ -12,17 +14,13 @@ https://d1k6kax80wecy5.cloudfront.net/WFqZJc/index.m3u8 #EXTINF:-1 tvg-id="ExpoChannel.au",Expo Channel (360p) https://tvsnhlslivetest.akamaized.net/hls/live/2034711/EXPO-MSL4/master.m3u8 #EXTINF:-1 tvg-id="JonmoBhumiTV.au",JonmoBhumi TV (720p) [Not 24/7] -https://cdn.appv.jagobd.com:444/c3VydmVyX8RpbEU9Mi8xNy8yMDE0GIDU6RgzQ6NTAgdEoaeFzbF92YWxIZTO0U0ezN1IzMyfvcGVMZEJCTEFWeVN3PTOmdFsaWRtaW51aiPhnPTI/jonmobhumitv.stream/playlist.m3u8 +https://us170.jagobd.com:447/c3VydmVyX8RpbEU9Mi8xNy8yMDE0GIDU6RgzQ6NTAgdEoaeFzbF92YWxIZTO0U0ezN1IzMyfvcGVMZEJCTEFWeVN3PTOmdFsaWRtaW51aiPhnPTI/jonmobhumitv.stream/playlist.m3u8 #EXTINF:-1 tvg-id="M4TVMalayalam.au",M4TV Malayalam (1080p) [Not 24/7] https://app.m4stream.live/mfourmalayalamhls/live.m3u8 -#EXTINF:-1 tvg-id="",Race Central TV (720p) +#EXTINF:-1 tvg-id="",Race Central TV (720p) [Not 24/7] https://nrpus.bozztv.com/36bay2/gusa-racecentral/index.m3u8 #EXTINF:-1 tvg-id="Racingcom.au",Racing.com (720p) https://racingvic-i.akamaized.net/hls/live/598695/racingvic/index1500.m3u8 -#EXTINF:-1 tvg-id="RTV.au",Rainbow TV Australia (720p) -http://www.rtvcdn.com.au:8082/TV0002.m3u8 -#EXTINF:-1 tvg-id="SBSViceland.au",SBS Viceland [Geo-blocked] -https://dai.google.com/linear/hls/event/nPy2IRtvQTWudFfYwdBgsg/master.m3u8 #EXTINF:-1 tvg-id="SkyNewsExtra1.au",Sky News Extra 1 (540p) https://skynewsau-live.akamaized.net/hls/live/2002689/skynewsau-extra1/master.m3u8 #EXTINF:-1 tvg-id="SkyNewsExtra2.au",Sky News Extra 2 (540p) [Not 24/7] @@ -37,3 +35,35 @@ https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01486-tickernews-tickernewsweb-ono/ https://nrpus.bozztv.com/36bay2/gusa-moviemagictv/index.m3u8 #EXTINF:-1 tvg-id="TVSN.au",TVSN (1080p) https://tvsnhlslivetest.akamaized.net/hls/live/2034711/TVSN-MSL4/master.m3u8 +#EXTINF:-1 tvg-id="TVSN.au",TVSN (1080p) [Not 24/7] +https://ythls.onrender.com/channel/UCo4sch-fwKIeyzyPIWRXjdw.m3u8 +#EXTINF:-1 tvg-id="9Gem.au",9Gem (720p) [Geo-blocked] +https://9now-livestreams.akamaized.net/hls/live/2007330/ch9-syd/master.m3u8 +#EXTINF:-1 tvg-id="9Go.au",9Go! (720p) [Geo-blocked] +https://9now-livestreams.akamaized.net/hls/live/2008312/go-syd/master.m3u8 +#EXTINF:-1 tvg-id="9Life.au",9Life (720p) [Geo-blocked] +https://9now-livestreams.akamaized.net/hls/live/2008313/life-syd/master.m3u8 +#EXTINF:-1 tvg-id="ADHTV.au",ADH TV (1080p) [Not 24/7] +https://ythls.onrender.com/channel/UCtzTaKI8AkiSjyzm1_JbMUg.m3u8 +#EXTINF:-1 tvg-id="GuidanceTVAustralia.au",Guidance TV Australia (720p) [Not 24/7] +https://ythls.onrender.com/channel/UC81VkX0QeICZw7o2jMwGThg.m3u8 +#EXTINF:-1 tvg-id="2GB.au",2GB Sydney (1080p) +https://2gblive.akamaized.net/hls/live/2033805/2GB/index.m3u8 +#EXTINF:-1 tvg-id="HopeChannelAustralia.au",Hope Channel Australia (1080p) +https://videodelivery.net/9fb3596948ddf463fde0ec4b85625b24/manifest/video.m3u8 +#EXTINF:-1 tvg-id="9Rush.au",9Rush (720p) [Geo-blocked] +https://9now-livestreams.akamaized.net/hls/live/2010626/rush-syd/master.m3u8 +#EXTINF:-1 tvg-id="Channel9.au",Channel 9 (720p) [Geo-blocked] +https://9now-livestreams.akamaized.net/hls/live/2008322/ch9-mel/master.m3u8 +#EXTINF:-1 tvg-id="Channel7.au",Channel 7 [Geo-blocked] +https://npc.cdn.7livecloud.io/hls/live/SYD1/master.m3u8 +#EXTINF:-1 tvg-id="7two.au",7two [Geo-blocked] +https://npc.cdn.7livecloud.io/hls/live/MEL2/master.m3u8 +#EXTINF:-1 tvg-id="7mate.au",7mate [Geo-blocked] +https://npc.cdn.7livecloud.io/hls/live/MEL3/master.m3u8 +#EXTINF:-1 tvg-id="7flix.au",7flix [Geo-blocked] +https://npc.cdn.7livecloud.io/hls/live/MEL6/master.m3u8 +#EXTINF:-1 tvg-id="SkyRacing1.au",Sky Racing 1 [Geo-blocked] +https://skylivetab-new.akamaized.net/hls/live/2038780/sky1/index.m3u8 +#EXTINF:-1 tvg-id="SkyRacing2.au",Sky Racing 2 [Geo-blocked] +https://skylivetab-new.akamaized.net/hls/live/2038781/sky2/index.m3u8 diff --git a/streams/bf.m3u b/streams/bf.m3u index 9872987e0..991770fb9 100644 --- a/streams/bf.m3u +++ b/streams/bf.m3u @@ -1,5 +1,7 @@ #EXTM3U #EXTINF:-1 tvg-id="RTB.bf",RTB (360p) [Not 24/7] https://edge.vedge.infomaniak.com/livecast/ik:rtbtvlive1/manifest.m3u8 -#EXTINF:-1 tvg-id="TVAlHouda.bf",TV Al Houda (360p) [Not 24/7] +#EXTINF:-1 tvg-id="TVAlHouda.bf",TV Al Houda (720p) [Not 24/7] https://ssh101.bozztv.com/ssh101/alhoudatv/playlist.m3u8 +#EXTINF:-1 tvg-id="ImpactTV.bf",Impact TV (360p) [Not 24/7] +https://edge20.vedge.infomaniak.com/livecast/ik:fluxtvimpact/manifest.m3u8 diff --git a/streams/cl.m3u b/streams/cl.m3u index 7ac81f22c..0a1391edb 100644 --- a/streams/cl.m3u +++ b/streams/cl.m3u @@ -111,8 +111,6 @@ https://v2.tustreaming.cl/clicktv/playlist.m3u8 https://mediacpstreamchile.com:1936/clubtv/clubtv/playlist.m3u8 #EXTINF:-1 tvg-id="ConcepcionTV.cl",Concepciรณn TV (1080p) http://live.mundogo.cl/mundo/concepciontv/index.m3u8 -#EXTINF:-1 tvg-id="Contivision.cl",Contivision (720p) -https://unlimited2-cl-isp.dps.live/cm/cm.smil/playlist.m3u8 #EXTINF:-1 tvg-id="CosmosTV.cl",Cosmos TV (720p) https://v1.tustreaming.cl/cosmostv/index.m3u8 #EXTINF:-1 tvg-id="CRTV.cl",CRTV (720p) @@ -135,13 +133,13 @@ http://live.mundogo.cl/mundo/EquizTV/index.m3u8 https://github.com/MachineSystems/archived_m3u8/raw/main/elpinguino_cl.m3u8 #EXTINF:-1 tvg-id="ElTipografo.cl",El Tipรณgrafo (1080p) http://live.mundogo.cl/mundo/Tipografo/index.m3u8 -#EXTINF:-1 tvg-id="",EnerGeek Fanpop (720p) [Not 24/7] +#EXTINF:-1 tvg-id="FanpopTV.cl",Fanpop TV (720p) [Not 24/7] https://wifispeed.trapemn.tv:1936/infantil/energeek-2/playlist.m3u8 #EXTINF:-1 tvg-id="EnerGeekRadio.cl",EnerGeek Radio (936p) https://wifiexpert-1.energeek.cl/energeek/radio/playlist.m3u8 #EXTINF:-1 tvg-id="",EnerGeek Retro (720p) [Not 24/7] https://stream.wifispeed.cl:3103/live/energeek1live.m3u8 -#EXTINF:-1 tvg-id="",EnerGeek Retro (720p) [Not 24/7] +#EXTINF:-1 tvg-id="EnerGeek.cl",EnerGeek (720p) [Not 24/7] https://wifispeed.trapemn.tv:1936/infantil/energeek-1/playlist.m3u8 #EXTINF:-1 tvg-id="EnfoqueDigitalTV.cl",Enfoque Digital TV (1080p) https://5eaccbab48461.streamlock.net:1936/8074/8074/playlist.m3u8 @@ -449,3 +447,5 @@ https://zmlive.zappingtv.com/zm-free/zm.smil/playlist.m3u8 http://38.131.11.9:1080/play/a00x #EXTINF:-1 tvg-id="ZonaPlayTV.cl",Zona Play TV (720p) https://paneltv.online:1936/8100/8100/playlist.m3u8 +#EXTINF:-1 tvg-id="Contivision.cl",Contivision (720p) +https://unlimited6-cl.dps.live/cm/cm.smil/playlist.m3u8 diff --git a/streams/cy.m3u b/streams/cy.m3u index c86c00a7d..af9a572be 100644 --- a/streams/cy.m3u +++ b/streams/cy.m3u @@ -5,8 +5,6 @@ https://sc-kuzeykibrissmarttv.ercdn.net/adatv/bant1/playlist.m3u8 https://dev.aftermind.xyz/edge-hls/unitrust/alfasports/index.m3u8?token=8TXWzhY3h6jrzqEqu #EXTINF:-1 tvg-id="AlfaSport.cy",Alfa Sport (1080p) [Not 24/7] https://dev.aftermind.xyz/hls/unitrust/alfasports/index.m3u8?token=8TXWzhY3h6jrzqEqu -#EXTINF:-1 tvg-id="AlphaTVCyprus.cy",Alpha TV Cyprus (1080p) -http://l4.cloudskep.com/alphacyp/acy/playlist.m3u8 #EXTINF:-1 tvg-id="ANT1Cyprus.cy",ANT1 Cyprus (1080p) http://l2.cloudskep.com/ant1cm2/abr/playlist.m3u8 #EXTINF:-1 tvg-id="BRT1.cy",BRT 1 (720p) [Not 24/7] diff --git a/streams/de.m3u b/streams/de.m3u index 57a02c842..94e5c0e6c 100644 --- a/streams/de.m3u +++ b/streams/de.m3u @@ -414,8 +414,6 @@ https://bild-und-ton.stream/sophiatv-en/smil:sophia-tv-en.smil/playlist.m3u8 https://bild-und-ton.stream/sophiatv-es/smil:sophia-tv-es.smil/playlist.m3u8 #EXTINF:-1 tvg-id="SophiaTV.it",Sophia TV Italy (720p) https://bild-und-ton.stream/sophiatv-it/smil:sophia-tv-it.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="Sport1.de",Sport 1 (1080p) [Geo-blocked] -https://oz.sport1.de/api/ottv1/2/livestream/view/sport2.m3u8 #EXTINF:-1 tvg-id="SRFernsehen.de",SR Fernsehen (720p) https://srfs.akamaized.net/hls/live/689649/srfsgeo/index.m3u8 #EXTINF:-1 tvg-id="SRF.de",SRF (1080p) diff --git a/streams/fi.m3u b/streams/fi.m3u index 1bd046bd2..94c276245 100644 --- a/streams/fi.m3u +++ b/streams/fi.m3u @@ -33,8 +33,6 @@ https://ythls.onrender.com/channel/UCyDiTtktwmrc20Bvs_G4pow.m3u8 https://vod.tv7.fi/tv7-ee/smil:tv7-ee.smil/playlist.m3u8 #EXTINF:-1 tvg-id="TaivasTV7.fi",Taivas TV7 (720p) https://vod.tv7.fi/tv7-fi/smil:tv7-fi.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="TLCFinland.fi",TLC Finland (720p) -https://live-fi.tvkaista.net/tlc/live.m3u8 #EXTINF:-1 tvg-id="TV5.fi",TV5 (720p) [Not 24/7] https://live-fi.tvkaista.net/tv5/live.m3u8 #EXTINF:-1 tvg-id="WorTV.fi",WรถrTV (1080p) [Not 24/7] diff --git a/streams/fr.m3u b/streams/fr.m3u index a2f9372b0..3f0d8a57f 100644 --- a/streams/fr.m3u +++ b/streams/fr.m3u @@ -373,3 +373,7 @@ https://ythls.onrender.com/channel/UCqvIdlrnd4DCcqp2DZwaZYw.m3u8 https://live.digiteka.com/1/WGQ1NnhEN0lzM0NU/dk1EOHhw/hls/live/playlist.m3u8 #EXTINF:-1 tvg-id="Weo.fr",Wรฉo (Picardie) (480p) [Not 24/7] https://live.digiteka.com/1/Zks2L0VsM2V0T242/QTBqcFly/hls/live/playlist.m3u8 +#EXTINF:-1 tvg-id="France3Lorraine.fr",France 3 Lorraine +http://livetv.ktv.zone/225/play.m3u8 +#EXTINF:-1 tvg-id="France4.fr",France 4 +http://livetv.ktv.zone/116/play.m3u8 diff --git a/streams/fr_groupem6.m3u b/streams/fr_groupem6.m3u index eb14b688d..42d977caf 100644 --- a/streams/fr_groupem6.m3u +++ b/streams/fr_groupem6.m3u @@ -3,8 +3,6 @@ https://origin2-6play.live.6cloud.fr/pool_rnpls9by/gulli/sixplaysd/hls_short_q2hyb21h_gulli/index.m3u8 #EXTINF:-1 tvg-id="GulliBilArabi.fr",Gulli Bil Arabi (1080p) https://shls-gulli-bil-arabi-prod-dub.shahid.net/out/v1/5454d215afba410c90b233f400730958/index.m3u8 -#EXTINF:-1 tvg-id="M6.fr",M6 -https://raw.githubusercontent.com/Sphinxroot/HSL/main/M6.m3u8 #EXTINF:-1 tvg-id="M6.fr",M6 (1080p) https://shls-m6-france-prod-dub.shahid.net/out/v1/c8a9f6e000cd4ebaa4d2fc7d18c15988/index.m3u8 #EXTINF:-1 tvg-id="M6Music.fr",M6 Music (1080p) diff --git a/streams/hr.m3u b/streams/hr.m3u index 2617d6b38..5a01f1c60 100644 --- a/streams/hr.m3u +++ b/streams/hr.m3u @@ -27,3 +27,5 @@ http://185.62.75.22:1935/trend/myStream/playlist.m3u8 https://tvjadran.stream.agatin.hr:3412/live/tvjadranlive.m3u8 #EXTINF:-1 tvg-id="TVZapad.hr",TV Zapad (1080p) http://webtv.zapad.tv:8080/memfs/1ad23803-84c3-41c7-aa91-fce4c7eac52e.m3u8 +#EXTINF:-1 tvg-id="TVNova.hr",TV Nova +https://stream.agatin.hr:3727/live/tvnovalive.m3u8 diff --git a/streams/id.m3u b/streams/id.m3u index 2e5b2875d..c63f63556 100644 --- a/streams/id.m3u +++ b/streams/id.m3u @@ -526,3 +526,14 @@ https://cdn-telkomsel-01.akamaized.net/Content/HLS/Live/channel(18564c27-ff44-4d https://ams.juraganstreaming.com:5443/LiveApp/streams/wesaltv.m3u8 #EXTINF:-1 tvg-id="ZeeBioskop.id",Zee Bioskop (360p) [Geo-blocked] http://edge.linknetott.swiftserve.com/Content/HLS/Live/Channel(ch161)/index.m3u8 +https://app-etslive-2.vidio.com/live/6399/master.m3u8 +#EXTINF:-1 tvg-id="CitraDangdut.id",Citra Dangdut [Geo-blocked] +http://vod.linknetott.swiftcontent.com/Content/HLS/Live/Channel(ch377)/index.m3u8 +#EXTINF:-1 tvg-id="CitraMuslim.id",Citra Muslim [Geo-blocked] +http://vod.linknetott.swiftcontent.com/Content/HLS/Live/Channel(ch334)/index.m3u8 +#EXTINF:-1 tvg-id="CitraDrama.id",Citra Drama (720p) [Geo-blocked] +http://vod.linknetott.swiftcontent.com/Content/HLS/Live/Channel(ch378)/index.m3u8 +#EXTINF:-1 tvg-id="Horee.id",Horee! (720p) [Geo-blocked] +http://vod.linknetott.swiftcontent.com/Content/HLS/Live/Channel(ch375)/index.m3u8 +#EXTINF:-1 tvg-id="IDXChannel.id",IDX Channel (720p) [Geo-blocked] +http://vod.linknetott.swiftcontent.com/Content/HLS/Live/Channel(ch389)/index.m3u8 diff --git a/streams/it.m3u b/streams/it.m3u index 42af9e3d3..d96e18b9e 100644 --- a/streams/it.m3u +++ b/streams/it.m3u @@ -616,8 +616,6 @@ http://fms.tvavicenza.it:1935/live/diretta_1/playlist.m3u8 #EXTINF:-1 tvg-id="TVL.it",TVL (720p) [Not 24/7] https://live.mariatvcdn.com/mariatvcdn/70564e1c6884c007c76f0c128d679eed.sdp/playlist.m3u8 #EXTINF:-1 tvg-id="",TVR Sicilia HD (1080p) [Not 24/7] -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.twitch.tv/canale6tv -#EXTINF:-1 tvg-id="",TVR Sicilia HD (1080p) [Not 24/7] https://ssh101.bozztv.com/ssh101/televita/playlist.m3u8 #EXTINF:-1 tvg-id="TVRS.it",TVRS (576p) [Not 24/7] http://wms.shared.streamshow.it:1935/tvrs/tvrs/live.m3u8 diff --git a/streams/kg.m3u b/streams/kg.m3u index 428250e08..e00abf6d9 100644 --- a/streams/kg.m3u +++ b/streams/kg.m3u @@ -1,19 +1,15 @@ #EXTM3U -#EXTINF:-1 tvg-id="AlaToo24.kg",Ala-Too 24 (576p) -http://onlinetv.ktrk.kg:1935/live/myStream3/playlist.m3u8 #EXTINF:-1 tvg-id="Balastan.kg",Balastan https://64e5ed58c00d4.streamlock.net/live/smil:balastan.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="Balastan.kg",Balastan (576p) -http://onlinetv.ktrk.kg:1935/live/myStream6/playlist.m3u8 -#EXTINF:-1 tvg-id="KTRK.kg",KTRK (720p) -http://onlinetv.ktrk.kg:1935/live/myStream/playlist.m3u8 -#EXTINF:-1 tvg-id="Muzika.kg",KTRK Muzika (720p) -http://onlinetv.ktrk.kg:1935/live/myStream2/playlist.m3u8 -#EXTINF:-1 tvg-id="KTRKSport.kg",KTRK Sport (576p) -http://onlinetv.ktrk.kg:1935/live/myStream4/playlist.m3u8 -#EXTINF:-1 tvg-id="Madaniyat.kg",Madaniyat (576p) -http://onlinetv.ktrk.kg:1935/live/myStream5/playlist.m3u8 #EXTINF:-1 tvg-id="TV1KG.kg",TV1 KG (1080p) http://212.2.225.30:1935/live/site.stream/playlist.m3u8 #EXTINF:-1 tvg-id="",ะ›ัŽะฑะธะผั‹ะน HD/ะขะะข4 (576p) http://92.245.103.126:1935/live/live.stream/playlist.m3u8 +#EXTINF:-1 tvg-id="Music.kg",ะœัƒะทั‹ะบะฐ (272p) +https://64e5ed58c00d4.streamlock.net/live/smil:music.smil/playlist.m3u8 +#EXTINF:-1 tvg-id="AlaToo24.kg",ะะปะฐ-ั‚ะพะพ 24 (272p) +https://64e5ed58c00d4.streamlock.net/live/smil:alatoo24.smil/playlist.m3u8 +#EXTINF:-1 tvg-id="KTRKSport.kg",ะฃะขะ ะš ะกะฟะพั€ั‚ (272p) +https://64e5ed58c00d4.streamlock.net/live/smil:sport.smil/playlist.m3u8 +#EXTINF:-1 tvg-id="UTRK.kg",ะฃะขะ ะš ะšั‹ั€ะณั‹ะทัั‚ะฐะฝ (272p) +https://64e5ed58c00d4.streamlock.net/live/smil:utrk.smil/playlist.m3u8 diff --git a/streams/kr.m3u b/streams/kr.m3u index 791866884..33ccffd5f 100644 --- a/streams/kr.m3u +++ b/streams/kr.m3u @@ -93,10 +93,6 @@ https://jcnonair-1108.acs.wecandeo.com/ms/3162/1108/index.m3u8 http://live.worktv.or.kr:1935/live/wowtvlive1.sdp/playlist.m3u8 #EXTINF:-1 tvg-id="JobplusTV.kr",Job Plus TV (ํ•œ๊ตญ์ง์—…๋ฐฉ์†ก) (480p) https://live.jobplustv.or.kr/live/wowtvlive1.sdp/playlist.m3u8 -#EXTINF:-1 tvg-id="KBS1TV.kr",KBS1 (720p) -http://ye23.vip/z7z8/2021/kbs2020.php?id=1 -#EXTINF:-1 tvg-id="KBS2TV.kr",KBS2 (720p) [Not 24/7] -http://ye23.vip/z7z8/2021/kbs2020.php?id=2 #EXTINF:-1 tvg-id="KBSDrama.kr",KBS Drama (480p) http://mytv.dothome.co.kr/ch/catv/2.php #EXTINF:-1 tvg-id="KBSDrama.kr",KBS Drama (480p) @@ -265,3 +261,5 @@ https://ythls.onrender.com/channel/UC38IlqMxZ_YtFg3eSGmmJnQ.m3u8 https://ythls.onrender.com/channel/UCizGMtU0Lt-O9X0tLJzyZ2Q.m3u8 #EXTINF:-1 tvg-id="YTNScience.kr",YTN Science (720p) https://ythls.onrender.com/channel/UCZdBJIbJz0P9xyFipgOj1fA.m3u8 +#EXTINF:-1 tvg-id="Tooniverse.kr",Tooniverse +http://code.vthanhtivi.pw/getlink/jptvvn/118/playlist.m3u8 diff --git a/streams/kw.m3u b/streams/kw.m3u index b3548c2de..c851da7fe 100644 --- a/streams/kw.m3u +++ b/streams/kw.m3u @@ -5,23 +5,5 @@ https://kali.vdopanel.com:3986/live/mbashalive.m3u8 https://5e74a9d684b2e.streamlock.net/liveTrans/ngrp:channel23_all/playlist.m3u8 #EXTINF:-1 tvg-id="AlraiTV.kw",Alrai TV (1080p) https://svs.itworkscdn.net/alraitvlive/alraitv.smil/playlist.m3u8 -#EXTINF:-1 tvg-id="KTV1.kw",KTV 1 (1080p) -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTV1 -#EXTINF:-1 tvg-id="KTV2.kw",KTV 2 (1080p) -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTV2 -#EXTINF:-1 tvg-id="KTVAlMajlis.kw",KTV Al Majlis (1080p) -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVSportExtra -#EXTINF:-1 tvg-id="KTVAlQurain.kw",KTV Al Qurain (1080p) [Not 24/7] -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVPlus -#EXTINF:-1 tvg-id="KTVArabe.kw",KTV Arabe (1080p) -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVArabe -#EXTINF:-1 tvg-id="KTVKhallikBilbait.kw",KTV Drama (1080p) -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KhallikBilbait -#EXTINF:-1 tvg-id="KTVEthraa.kw",KTV Ethraa (1080p) -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVEthraa -#EXTINF:-1 tvg-id="KTVSport.kw",KTV Sport (1080p) -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVSports -#EXTINF:-1 tvg-id="KTVSportPlus.kw",KTV Sport Plus (1080p) -http://mc-qs.lanesh4d0w.tech/iptv-query?streaming-ip=https://www.media.gov.kw/LiveTV.aspx?PanChannel=KTVSportPlus #EXTINF:-1 tvg-id="MarinaTV.kw",Marina TV (1080p) [Not 24/7] https://ythls.onrender.com/channel/UC1TelTm8bbY2jw0guInSvBA.m3u8 diff --git a/streams/mc.m3u b/streams/mc.m3u index 242e17e49..eedd55969 100644 --- a/streams/mc.m3u +++ b/streams/mc.m3u @@ -3,3 +3,5 @@ https://webtvmonacoinfo.mc/live/prod_720/index.m3u8 #EXTINF:-1 tvg-id="SuperyachtTV.mc",Superyacht TV (1080p) https://sy.wns.live/hls/stream.m3u8 +#EXTINF:-1 tvg-id="TVMonaco.mc",TV Monaco (1080p) +https://production-fast-mcrtv.content.okast.tv/channels/2116dc08-1959-465d-857f-3619daefb66b/b702b2b9-aebd-436c-be69-2118f56f3d86/2024/media.m3u8 diff --git a/streams/my.m3u b/streams/my.m3u index 1ab5a5fb2..1441baf39 100644 --- a/streams/my.m3u +++ b/streams/my.m3u @@ -63,8 +63,6 @@ https://d25tgymtnqzu8s.cloudfront.net/smil:tv1/playlist.m3u8?id=1 https://d25tgymtnqzu8s.cloudfront.net/smil:tv2/playlist.m3u8?id=2 #EXTINF:-1 tvg-id="TV3.my",TV3 https://live-streams-ssai-01.tonton.com.my/live/2dd2b7cd-1b34-4871-b669-57b5c9beca23/live.isml/.m3u8 -#EXTINF:-1 tvg-id="TV3.my",TV3 (720p) [Geo-blocked] -https://live-sg1.global.ssl.fastly.net/live-hls/tonton1.m3u8 #EXTINF:-1 tvg-id="",TV6 [Geo-blocked] #EXTVLCOPT:http-referrer=https://rtm-player.glueapi.io/ https://d25tgymtnqzu8s.cloudfront.net/smil:tv6/playlist.m3u8?id=6 diff --git a/streams/sr.m3u b/streams/sr.m3u new file mode 100644 index 000000000..ff07b6e4b --- /dev/null +++ b/streams/sr.m3u @@ -0,0 +1,3 @@ +#EXTM3U +#EXTINF:-1 tvg-id="TrishulBroadcastingNetwork.sr",TBN TV (720p) [Not 24/7] +https://live.suricloud.com/hls/tbntv/index.m3u8 diff --git a/streams/uk.m3u b/streams/uk.m3u index 68c456f1a..f8089c678 100644 --- a/streams/uk.m3u +++ b/streams/uk.m3u @@ -59,8 +59,6 @@ https://ythls.onrender.com/channel/UC2ZoBzeCXrZcMz4f82eMe-g.m3u8 #EXTINF:-1 tvg-id="GarshomTV.uk",Garshom TV (360p) [Not 24/7] https://og2qd3aal7an-hls-live.5centscdn.com/garshomtv/d0dbe915091d400bd8ee7f27f0791303.sdp/playlist.m3u8 #EXTINF:-1 tvg-id="GBNews.uk",GB News (1080p) -https://live-gbnews-ssai.simplestreamcdn.com/v1/master/82267e84b9e5053b3fd0ade12cb1a146df74169a/gbnews-live/live.m3u8 -#EXTINF:-1 tvg-id="GBNews.uk",GB News (1080p) https://live-gbnews.simplestreamcdn.com/live5/gbnews/bitrate1.isml/manifest.m3u8 #EXTINF:-1 tvg-id="GBNews.uk",GB News (1080p) https://ythls.onrender.com/channel/UC0vn8ISa4LKMunLbzaXLnOQ.m3u8 diff --git a/streams/uk_bbc.m3u b/streams/uk_bbc.m3u index 35b677195..f14b93809 100644 --- a/streams/uk_bbc.m3u +++ b/streams/uk_bbc.m3u @@ -1,54 +1,40 @@ #EXTM3U #EXTINF:-1 tvg-id="BBCAlba.uk",BBC Alba (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_alba/iptv_hd_abr_v1.mpd -#EXTINF:-1 tvg-id="BBCAlba.uk",BBC Alba (540p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_alba/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 +https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_alba/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p) -https://vs-cmaf-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.mpd +https://vs-cmaf-pushb-ww-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p) -https://vs-cmaf-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_http.mpd +https://vs-cmaf-pushb-ww-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_http.mpd #EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p) -https://vs-cmaf-pushb-ww.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.mpd +https://vs-cmaf-pushb-ww.live.cf.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p) -https://vs-cmaf-pushb-ww.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_cloudfrontms_live.mpd +https://vs-cmaf-pushb-ww.live.cf.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_http.mpd #EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p) -https://vs-cmaf-pushb-ww.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_http.mpd +https://vs-hls-pushb-ww-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.m3u8 #EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p) -https://vs-hls-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.m3u8 -#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (720p) -https://vs-hls-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/t=3840/v=pv14/b=5070016/main.m3u8 -#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (540p) -https://vs-hls-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_akamai_hls_live.m3u8 +https://vs-hls-pushb-ww-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/t=3840/v=pv14/b=5070016/main.m3u8 #EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (540p) -https://vs-hls-pushb-ww.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.m3u8 -#EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (540p) -https://vs-hls-pushb-ww.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2_cloudfrontms_live.m3u8 +https://vs-hls-pushb-ww.live.cf.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_arabic_tv/pc_hd_abr_v2.m3u8 #EXTINF:-1 tvg-id="BBCArabic.uk",BBC Arabic (480p) https://ythls.onrender.com/channel/UCelk6aHijZq-GJBBB9YpReA.m3u8 #EXTINF:-1 tvg-id="BBCFour.uk",BBC Four (540p) [Geo-blocked] https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_four_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="BBCFour.uk",BBC Four HD (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_four_hd/iptv_hd_abr_v1.mpd +https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_four_hd/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="BBCFour.uk",BBC Four HD (720p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_four_hd/t=3840/v=pv14/b=5070016/main.m3u8 +https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_four_hd/t=3840/v=pv14/b=5070016/main.m3u8 #EXTINF:-1 tvg-id="BBCNews.uk",BBC News (540p) [Geo-blocked] -https://vs-hls-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_news_channel_hd/mobile_wifi_main_sd_abr_v2.m3u8 +https://vs-hls-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_news_channel_hd/mobile_wifi_main_sd_abr_v2.m3u8 #EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (720p) [Geo-blocked] -https://vs-cmaf-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_news_channel_hd/iptv_hd_abr_v1.mpd +https://vs-cmaf-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_news_channel_hd/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="BBCNews.uk",BBC News HD (720p) [Geo-blocked] -https://vs-hls-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_news_channel_hd/t=3840/v=pv14/b=5070016/main.m3u8 +https://vs-hls-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_news_channel_hd/t=3840/v=pv14/b=5070016/main.m3u8 #EXTINF:-1 tvg-id="BBCOneChannelIslands.uk",BBC One Channel Islands (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_channel_islands/pc_hd_abr_v2.mpd -#EXTINF:-1 tvg-id="BBCOneChannelIslands.uk",BBC One Channel Islands (540p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_channel_islands/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_channel_islands/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCOneEast.uk",BBC One East (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_east/pc_hd_abr_v2.mpd -#EXTINF:-1 tvg-id="BBCOneEast.uk",BBC One East (540p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_east/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_east/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCOneEastMidlands.uk",BBC One East Midlands (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_east_midlands/pc_hd_abr_v2.mpd -#EXTINF:-1 tvg-id="BBCOneEastMidlands.uk",BBC One East Midlands (540p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_east_midlands/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_east_midlands/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCOneYorkshire.uk",BBC One East Yorkshire (720p) [Geo-blocked] https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_east_yorkshire/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCOneYorkshire.uk",BBC One East Yorkshire (540p) [Geo-blocked] @@ -70,15 +56,11 @@ https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_n #EXTINF:-1 tvg-id="BBCOneNorthEastCumbria.uk",BBC One North East (540p) [Geo-blocked] https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_north_east/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="BBCOneNorthWest.uk",BBC One North West (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_north_west/pc_hd_abr_v2.mpd -#EXTINF:-1 tvg-id="BBCOneNorthWest.uk",BBC One North West (540p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_north_west/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 -#EXTINF:-1 tvg-id="BBCOneNorthernIreland.uk",BBC One Northern Ireland (540p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_northern_ireland_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_north_west/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCOneNorthernIreland.uk",BBC One Northern Ireland HD (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_northern_ireland_hd/pc_hd_abr_v2.mpd +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_northern_ireland_hd/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCOneNorthernIreland.uk",BBC One Northern Ireland HD (720p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_northern_ireland_hd/t=3840/v=pv14/b=5070016/main.m3u8 +https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_northern_ireland_hd/t=3840/v=pv14/b=5070016/main.m3u8 #EXTINF:-1 tvg-id="BBCOneScotland.uk",BBC One Scotland (540p) [Geo-blocked] https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_scotland_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="BBCOneScotland.uk",BBC One Scotland HD (720p) [Geo-blocked] @@ -94,17 +76,17 @@ https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_s #EXTINF:-1 tvg-id="BBCOneSouthEast.uk",BBC One South East (540p) [Geo-blocked] https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_south_east/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="BBCOneSouthWest.uk",BBC One South West (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_south_west/pc_hd_abr_v2.mpd +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_south_west/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCOneSouthWest.uk",BBC One South West (540p) [Geo-blocked] https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_south_west/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="BBCOneWales.uk",BBC One Wales (720p) [Geo-blocked] https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_wales_hd/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCOneWales.uk",BBC One Wales (720p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_wales_hd/t=3840/v=pv14/b=5070016/main.m3u8 +https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_wales_hd/t=3840/v=pv14/b=5070016/main.m3u8 #EXTINF:-1 tvg-id="BBCOneWales.uk",BBC One Wales (540p) [Geo-blocked] https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_wales_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="BBCOneWest.uk",BBC One West (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_west/pc_hd_abr_v2.mpd +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_one_west/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCOneWest.uk",BBC One West (540p) [Geo-blocked] https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_west/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="BBCOneWestMidlands.uk",BBC One West Midlands (720p) [Geo-blocked] @@ -116,9 +98,7 @@ https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_y #EXTINF:-1 tvg-id="BBCOneYorksLincs.uk",BBC One Yorks (540p) [Geo-blocked] https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_one_yorks/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="BBCParliament.uk",BBC Parliament (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_parliament/iptv_hd_abr_v1.mpd -#EXTINF:-1 tvg-id="BBCParliament.uk",BBC Parliament (540p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_parliament/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_parliament/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="BBCPersian.uk",BBC Persian (720p) https://vs-cmaf-pushb-ww-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_persian_tv/pc_hd_abr_v2_akamai_dash_live.mpd #EXTINF:-1 tvg-id="BBCPersian.uk",BBC Persian (720p) @@ -187,34 +167,30 @@ https://vs-cmaf-pushb-uk.live.cf.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:red_bu https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_scotland_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="BBCScotland.uk",BBC Scotland HD (720p) [Geo-blocked] https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_scotland_hd/iptv_hd_abr_v1.mpd -#EXTINF:-1 tvg-id="BBCScotland.uk",BBC Scotland HD (720p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/content/x=3/v=pv14/b=5070016/t=3840/i=urn:bbc:pips:service:bbc_scotland_hd/main.m3u8 #EXTINF:-1 tvg-id="BBCThree.uk",BBC Three (540p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_three_hd/t=3840/v=pv10/b=1604032/main.m3u8 +https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_three_hd/t=3840/v=pv10/b=1604032/main.m3u8 #EXTINF:-1 tvg-id="BBCThree.uk",BBC Three HD (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_three_hd/iptv_hd_abr_v1.mpd +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_three_hd/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="BBCThree.uk",BBC Three HD (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_three_hd/iptv_hd_abr_v1.mpd +https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_three_hd/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="BBCThree.uk",BBC Three HD (720p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_three_hd/t=3840/v=pv14/b=5070016/main.m3u8 +https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_three_hd/t=3840/v=pv14/b=5070016/main.m3u8 #EXTINF:-1 tvg-id="BBCTwoEngland.uk",BBC Two HD (720p) [Geo-blocked] -https://vs-cmaf-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_hd/iptv_hd_abr_v1.mpd +https://vs-cmaf-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_hd/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="BBCTwoEngland.uk",BBC Two HD (720p) [Geo-blocked] -https://vs-cmaf-push-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:bbc_two_hd/pc_hd_abr_v2.mpd +https://vs-cmaf-push-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:bbc_two_hd/pc_hd_abr_v2.mpd #EXTINF:-1 tvg-id="BBCTwoEngland.uk",BBC Two HD (720p) [Geo-blocked] -https://vs-hls-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_hd/t=3840/v=pv14/b=5070016/main.m3u8 +https://vs-hls-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_hd/t=3840/v=pv14/b=5070016/main.m3u8 #EXTINF:-1 tvg-id="BBCTwoEngland.uk",BBC Two HD (540p) [Geo-blocked] -https://vs-hls-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_hd/mobile_wifi_main_sd_abr_v2.m3u8 +https://vs-hls-push-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_hd/mobile_wifi_main_sd_abr_v2.m3u8 #EXTINF:-1 tvg-id="BBCTwoNorthernIreland.uk",BBC Two Northen Ireland (540p) [Geo-blocked] https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_northern_ireland_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="BBCTwoNorthernIreland.uk",BBC Two Northern Ireland HD (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_northern_ireland_hd/iptv_hd_abr_v1.mpd +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_northern_ireland_hd/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="BBCTwoNorthernIreland.uk",BBC Two Northern Ireland HD (720p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_northern_ireland_hd/t=3840/v=pv14/b=5070016/main.m3u8 +https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_northern_ireland_hd/t=3840/v=pv14/b=5070016/main.m3u8 #EXTINF:-1 tvg-id="BBCTwoWales.uk",BBC Two Wales (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_wales_digital/iptv_hd_abr_v1.mpd -#EXTINF:-1 tvg-id="BBCTwoWales.uk",BBC Two Wales (540p) [Geo-blocked] -https://vs-hls-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:bbc_two_wales_digital/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:bbc_two_wales_digital/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="BBCUHD1.uk",BBC UHD 1 (2160p) [Geo-blocked] [Not 24/7] https://ve-uhd-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:uhd_stream_01/iptv_uhd_v1.mpd #EXTINF:-1 tvg-id="BBCUHD2.uk",BBC UHD 2 (2160p) [Geo-blocked] [Not 24/7] @@ -225,22 +201,18 @@ https://ve-uhd-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:uhd_stream_ https://ve-uhd-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:uhd_stream_04/iptv_uhd_v1.mpd #EXTINF:-1 tvg-id="BBCUHD5.uk",BBC UHD 5 (2160p) [Geo-blocked] [Not 24/7] https://ve-uhd-push-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:uhd_stream_05/iptv_uhd_v1.mpd -#EXTINF:-1 tvg-id="CBBC.uk",CBBC (540p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbbc_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 #EXTINF:-1 tvg-id="CBBC.uk",CBBC HD (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbbc_hd/iptv_hd_abr_v1.mpd +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:cbbc_hd/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="CBBC.uk",CBBC HD (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:cbbc_hd/iptv_hd_abr_v1.mpd +https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:cbbc_hd/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="CBBC.uk",CBBC HD (720p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbbc_hd/t=3840/v=pv14/b=5070016/main.m3u8 -#EXTINF:-1 tvg-id="CBeebies.uk",CBeebies (540p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbeebies_hd/mobile_wifi_main_sd_abr_v2_akamai_hls_live_http.m3u8 +https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:cbbc_hd/t=3840/v=pv14/b=5070016/main.m3u8 #EXTINF:-1 tvg-id="CBeebies.uk",CBeebies HD (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbeebies_hd/iptv_hd_abr_v1.mpd +https://vs-cmaf-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:cbeebies_hd/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="CBeebies.uk",CBeebies HD (720p) [Geo-blocked] -https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=3/i=urn:bbc:pips:service:cbeebies_hd/iptv_hd_abr_v1.mpd +https://vs-cmaf-pushb-uk.live.fastly.md.bbci.co.uk/x=4/i=urn:bbc:pips:service:cbeebies_hd/iptv_hd_abr_v1.mpd #EXTINF:-1 tvg-id="CBeebies.uk",CBeebies HD (720p) [Geo-blocked] -https://vs-hls-pushb-uk-live.akamaized.net/x=3/i=urn:bbc:pips:service:cbeebies_hd/t=3840/v=pv14/b=5070016/main.m3u8 +https://vs-hls-pushb-uk-live.akamaized.net/x=4/i=urn:bbc:pips:service:cbeebies_hd/t=3840/v=pv14/b=5070016/main.m3u8 #EXTINF:-1 tvg-id="S4C.uk",S4C (1080p) [Geo-blocked] https://live-uk.s4c-cdn.co.uk/out/v1/a0134f1fd5a2461b9422b574566d4442/live_uk.m3u8 #EXTINF:-1 tvg-id="S4C.uk",S4C (720p) [Geo-blocked] diff --git a/streams/us.m3u b/streams/us.m3u index ef4e929e1..bfb007fc3 100644 --- a/streams/us.m3u +++ b/streams/us.m3u @@ -181,12 +181,8 @@ https://cdn3.wowza.com/5/ZWQ1K2NYTmpFbGsr/BEK-WOWZA-1/smil:BEKPRIMEeast.smil/pla https://cdn3.wowza.com/5/ZWQ1K2NYTmpFbGsr/BEK-WOWZA-1/smil:BEKPRIMEW.smil/playlist.m3u8 #EXTINF:-1 tvg-id="BetterHealthTV.us",Better Health TV (480p) https://tgn.bozztv.com/betterlife/betterhealth/betterhealth/index.m3u8 -#EXTINF:-1 tvg-id="BetterHealthTV.us",Better Health TV (480p) -https://uni10rtmp.tulix.tv/betterhealth/betterhealth.stream/playlist.m3u8 #EXTINF:-1 tvg-id="BetterLifeNatureChannel.us",Better Life Nature Channel (480p) https://tgn.bozztv.com/betterlife/betternature/betternature/index.m3u8 -#EXTINF:-1 tvg-id="BetterLifeNatureChannel.us",Better Life Nature Channel (480p) -https://uni10rtmp.tulix.tv/betternature/betternature.stream/playlist.m3u8 #EXTINF:-1 tvg-id="BetterLifeTV.us",Better Life TV (720p) https://tgn.bozztv.com/betterlife/betterlife/betterlife/index.m3u8 #EXTINF:-1 tvg-id="",Big City TV @@ -402,8 +398,6 @@ https://cdn20.liveonlineservices.com/hls/eye95tv.m3u8 https://biblescreen.faithlifecdn.com/biblescreen/bibleScreen/playlist.m3u8 #EXTINF:-1 tvg-id="ChristmasMusic.us",Faithlife TV Christmas Music (720p) https://vse2-na-us-ne24.secdn.net/logos-channel/live/christmas/playlist.m3u8 -#EXTINF:-1 tvg-id="FastTV.us",Fast TV -https://3fa797d5.wurl.com/manifest/f36d25e7e52f1ba8d7e56eb859c636563214f541/T05PX01vdG9yVHJlbmRGYXN0VFZfSExT/b5e5e0e2-12b3-4312-93c9-c0a7c50b41ca/4.m3u8 #EXTINF:-1 tvg-id="" user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148",Fast&Fun Box (Russian) (480p) #EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 http://ott-cdn.ucom.am/s79/index.m3u8 @@ -1098,3 +1092,7 @@ https://thegateway.app/YouToo/CueTones/playlist.m3u8 https://thegateway.app/YouToo/YTamerica/playlist.m3u8 #EXTINF:-1 tvg-id="DisneyChannelRussia.ru",ะšะฐะฝะฐะป Disney (576p) [Not 24/7] http://188.40.68.167/russia/disney/playlist.m3u8 +#EXTINF:-1 tvg-id="SUMtvLatino.us",SUMtv Latino (1080p) +https://bozztv.com/uni10rtmp/ssstv2-cdn/smil:ssstv2web.smil/playlist.m3u8 +#EXTINF:-1 tvg-id="EVTVMiami.us",EVTV Miami (720p) [Not 24/7] +https://streannliveevtv.cachefly.net/Protected/sp=1;dirmatch=true/3be25dc13406bf70ff0208230e6fa803b88b95013fad257c025e481e2be3e214/evtv1/evtv1/playlist.m3u8 diff --git a/streams/us_canelatv.m3u b/streams/us_canelatv.m3u index a2995bb52..3597cfeaf 100644 --- a/streams/us_canelatv.m3u +++ b/streams/us_canelatv.m3u @@ -11,19 +11,19 @@ https://stream.ads.ottera.tv/playlist.m3u8?network_id=654 https://stream.ads.ottera.tv/playlist.m3u8?network_id=2548 #EXTINF:-1 tvg-id="",Canela Telenovelas https://stream.ads.ottera.tv/playlist.m3u8?network_id=1152 -#EXTINF:-1 tvg-id="",CanelaTV +#EXTINF:-1 tvg-id="CanelaTV.us",CanelaTV https://stream.ads.ottera.tv/playlist.m3u8?network_id=119 #EXTINF:-1 tvg-id="",CHILL LATINO https://stream.ads.ottera.tv/playlist.m3u8?network_id=1085 -#EXTINF:-1 tvg-id="",Cine Romantico +#EXTINF:-1 tvg-id="CineRomantico.us",Cine Romantico https://stream.ads.ottera.tv/playlist.m3u8?network_id=656 #EXTINF:-1 tvg-id="",Combate Global https://stream.ads.ottera.tv/playlist.m3u8?network_id=960 -#EXTINF:-1 tvg-id="",El Rey +#EXTINF:-1 tvg-id="ElRey.us",El Rey https://stream.ads.ottera.tv/playlist.m3u8?network_id=1544 #EXTINF:-1 tvg-id="",El Talisman https://stream.ads.ottera.tv/playlist.m3u8?network_id=1079 -#EXTINF:-1 tvg-id="",Flou Cine +#EXTINF:-1 tvg-id="FlouCine.us",Flou Cine https://amg01768-flou-flou-canelatv-yri41.amagi.tv/playlist/amg01768-flou-flou-canelatv/playlist.m3u8 #EXTINF:-1 tvg-id="",Flow Caribe https://stream.ads.ottera.tv/playlist.m3u8?network_id=1083 @@ -35,7 +35,7 @@ https://stream.ads.ottera.tv/playlist.m3u8?network_id=3010 https://stream.ads.ottera.tv/playlist.m3u8?network_id=3366 #EXTINF:-1 tvg-id="",Novelas Turcas https://stream.ads.ottera.tv/playlist.m3u8?network_id=5088 -#EXTINF:-1 tvg-id="",Novelisima +#EXTINF:-1 tvg-id="Novelisima.us",Novelisima https://stream.ads.ottera.tv/playlist.m3u8?network_id=2380 #EXTINF:-1 tvg-id="",Planeta de Aventuras https://stream.ads.ottera.tv/playlist.m3u8?network_id=4311 @@ -47,7 +47,7 @@ https://stream.ads.ottera.tv/playlist.m3u8?network_id=1545 https://stream.ads.ottera.tv/playlist.m3u8?network_id=1084 #EXTINF:-1 tvg-id="",Ritmos Inolvidables https://stream.ads.ottera.tv/playlist.m3u8?network_id=1081 -#EXTINF:-1 tvg-id="",Sony Canal Novelas +#EXTINF:-1 tvg-id="SonyCanalNovelas.us",Sony Canal Novelas https://a89829b8dca2471ab52ea9a57bc28a35.mediatailor.us-east-1.amazonaws.com/v1/master/0fb304b2320b25f067414d481a779b77db81760d/CanelaTV_SonyCanalNovelas/playlist.m3u8 #EXTINF:-1 tvg-id="",Tierra De Amor Y Venganza https://stream.ads.ottera.tv/playlist.m3u8?network_id=1080 diff --git a/streams/us_cineversetv.m3u b/streams/us_cineversetv.m3u index 8ab86478a..24762e492 100644 --- a/streams/us_cineversetv.m3u +++ b/streams/us_cineversetv.m3u @@ -1,5 +1,5 @@ #EXTM3U -#EXTINF:-1 tvg-id="",ALF +#EXTINF:-1 tvg-id="ALF.us",ALF https://97bd5884f7a348aa93b50e48d031be0e.mediatailor.us-east-1.amazonaws.com/v1/master/f4e8c53a8367a5b58e20ce054ea3ce25a3e904d3/ONO_ALF/playlist.m3u8 #EXTINF:-1 tvg-id="AsianCrush.us",AsianCrush https://amg01201-cinedigmenterta-asiancrush-cineverse-x701o.amagi.tv/playlist/amg01201-cinedigmenterta-asiancrush-cineverse/playlist.m3u8 @@ -13,9 +13,9 @@ https://amg01201-cinedigmenterta-crimehunters-cineverse-cnqvb.amagi.tv/playlist/ https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-docurama-cineverse/playlist.m3u8 #EXTINF:-1 tvg-id="DoveChannel.us",Dove Channel https://amg01201-cinedigmenterta-dove-cineverse-1fck5.amagi.tv/playlist/amg01201-cinedigmenterta-dove-cineverse/playlist.m3u8 -#EXTINF:-1 tvg-id="",El Rey Network +#EXTINF:-1 tvg-id="ElRey.us",El Rey Network https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-elrey-cineverse/playlist.m3u8 -#EXTINF:-1 tvg-id="",Farscape +#EXTINF:-1 tvg-id="Farscape.us",Farscape https://a8d3367c658948afb1901efdd9babe5b.mediatailor.us-east-1.amazonaws.com/v1/master/f4e8c53a8367a5b58e20ce054ea3ce25a3e904d3/ONO_Farscape/playlist.m3u8 #EXTINF:-1 tvg-id="GustoTV.us",GustoTV https://amg01077-gustoworldwidem-gustotv-cineverse-h7u1r.amagi.tv/playlist/amg01077-gustoworldwidem-gustotv-cineverse/playlist.m3u8 @@ -39,19 +39,19 @@ https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-retrocrush-lg https://b1570a6919f94bcfa2f061daee64c70f.mediatailor.us-east-1.amazonaws.com/v1/master/04fd913bb278d8775298c26fdca9d9841f37601f/ONO_ScreamFactoryTV/playlist.m3u8 #EXTINF:-1 tvg-id="ShoutFactoryTV.us",Shout Factory TV https://amg00163-shoutfactory-shoutfactory-dmr-maeqc.amagi.tv/playlist/amg00163-shoutfactory-shoutfactory-dmr/playlist.m3u8 -#EXTINF:-1 tvg-id="",Shout! Cult +#EXTINF:-1 tvg-id="ShoutCult.us",Shout! Cult https://837dd61e3fed471fbbe33391a57920d4.mediatailor.us-east-1.amazonaws.com/v1/master/f4e8c53a8367a5b58e20ce054ea3ce25a3e904d3/ONO_ShoutCult/playlist.m3u8 #EXTINF:-1 tvg-id="SoReal.us",So...Real https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-soreal-cineverse/playlist.m3u8 #EXTINF:-1 tvg-id="TheBobRossChannel.us",The Bob Ross Channel https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-bobross-cineverse/playlist.m3u8 -#EXTINF:-1 tvg-id="",The Bob Ross Channel Spanish +#EXTINF:-1 tvg-id="TheBobRossChannelenEspanol.us",The Bob Ross Channel Spanish https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-bobrossspanish-lgus/playlist.m3u8 #EXTINF:-1 tvg-id="TheCarolBurnettShow.us",The Carol Burnett Show https://amg00163-shoutfactory-carolburnett-dmr-cpk9r.amagi.tv/playlist/amg00163-shoutfactory-carolburnett-dmr/playlist.m3u8 #EXTINF:-1 tvg-id="TheCountryNetwork.us",The Country Network https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-countrynetwork-cineverse/playlist.m3u8 -#EXTINF:-1 tvg-id="",The Elvis Channel +#EXTINF:-1 tvg-id="TheElvisPresleyChannel.us",The Elvis Presley Channel https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-elvis-cineverse/playlist.m3u8 #EXTINF:-1 tvg-id="TheFilmDetective.us",The Film Detective https://cdn-uw2-prod.tsv2.amagi.tv/linear/amg01201-cinedigmenterta-filmdetective-cineverse/playlist.m3u8 diff --git a/streams/us_freemoviesplus.m3u b/streams/us_freemoviesplus.m3u deleted file mode 100644 index a7e8894cb..000000000 --- a/streams/us_freemoviesplus.m3u +++ /dev/null @@ -1,33 +0,0 @@ -#EXTM3U -#EXTINF:-1 tvg-id="",Crime and Thrillers -https://topic-crimeandthrillers-1-us.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Ditty TV -https://memphisstudios-dittytv-1-eu.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Food -https://food-us.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Glory Kick Boxing -https://glorykickboxing-glorykickboxing-1-eu.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Intipacha -https://bonudiemsa-intipacha-2-eu.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Just for Laughs Gags -https://distributionsjustepourrire-justforlaughsgags-1-eu.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Nosey 2 -https://nosey-2-us.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Pecan -https://bold-tv-corp-pecan-tv-1-eu.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Pelimex -https://telecine-pelimex-1-eu.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Real Nosey -https://nosey-realnosey-1-us.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Space Science Now -https://magellan-space-science-now-1-us.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Todays Homeowner -https://janson-todayshomeowner-1-us.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",True Crime Now -https://alliantcontent-truecrimenow-1-us.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",Vintage TV -https://chestnut-vintagetv-1-us.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",War and Military Now -https://alliantcontent-warandmilitarynow-1-us.freemoviesplus.wurl.tv/playlist.m3u8 -#EXTINF:-1 tvg-id="",WatchMojo -https://watchmojo-1-eu.freemoviesplus.wurl.tv/playlist.m3u8 diff --git a/streams/us_local.m3u b/streams/us_local.m3u index d586bf366..8a440bd92 100644 --- a/streams/us_local.m3u +++ b/streams/us_local.m3u @@ -595,8 +595,6 @@ https://reflect-tampa-bay-community.cablecast.tv/live-16/live/live.m3u8 https://reflect-temecula.cablecast.tv/live-2/live/live.m3u8 #EXTINF:-1 tvg-id="Tempe11.us",Tempe Channel 11 https://cdn3.wowza.com/5/cFh0V0QwUVc4SDl2/tempe/G0355_003/chunklist.m3u8 -#EXTINF:-1 tvg-id="TUTV.us",Temple University TV (tutv) (720p) -https://templeuni.secure.footprint.net/egress/bhandler/templeuni/streama/manifest.m3u8 #EXTINF:-1 tvg-id="WCWNDT1.us",The CW (WCWN-DT1) Albamy NY (1080p) https://16live00.akamaized.net/CW/index.m3u8 #EXTINF:-1 tvg-id="WJACDT4.us",The CW Altoona PA (WJAC4) (720p) diff --git a/streams/us_pbs.m3u b/streams/us_pbs.m3u index 5eb504372..7871e74c9 100644 --- a/streams/us_pbs.m3u +++ b/streams/us_pbs.m3u @@ -215,8 +215,6 @@ https://wsredt.lls.pbs.org/out/v1/d615170d96024c229c6ae2177dec84e5/index.m3u8 https://wtvpdt.lls.pbs.org/out/v1/9e8f6bfce87a437d8a8a9aab016421e8/index.m3u8 #EXTINF:-1 tvg-id="WHYYDT1.us",PBS Philadelphia PA (WHYY-DT1) (1080p) https://whyydt.lls.pbs.org/out/v1/40b7857a84ee4302be8ab755a719cc14/index.m3u8 -#EXTINF:-1 tvg-id="KAETDT1.us",PBS Phoenix AZ (KAET) (1080p) -https://kaetdt.lls.pbs.org/out/v1/259f25e61b3d47ce8a7e2339a00c5561/index.m3u8 #EXTINF:-1 tvg-id="WQEDDT1.us",PBS Pittsburgh PA (WQED) (1080p) https://wqeddt.lls.pbs.org/out/v1/1f10d52cea0f45ae88184800e9e6b79e/index.m3u8 #EXTINF:-1 tvg-id="WCFEDT1.us",PBS Plattsburgh NY (WCFE) (1080p) diff --git a/streams/us_simultv.m3u b/streams/us_simultv.m3u deleted file mode 100644 index 6899d457b..000000000 --- a/streams/us_simultv.m3u +++ /dev/null @@ -1,41 +0,0 @@ -#EXTM3U -#EXTINF:-1 tvg-id="",2A Network (720p) -https://simultv.s.llnwi.net/n4s4/2ANetwork/interlink.m3u8 -#EXTINF:-1 tvg-id="",Cowboy Theater (720p) -https://simultv.s.llnwi.net/o054/CowboyTheater/interlink.m3u8 -#EXTINF:-1 tvg-id="",Cut Up N Cook (720p) -https://simultv.s.llnwi.net/n4s4/CutUpNCook/interlink.m3u8 -#EXTINF:-1 tvg-id="",Dimensions -https://simultv.s.llnwi.net/o054/Dimensions/interlink.m3u8 -#EXTINF:-1 tvg-id="",Funnybone (720p) -https://simultv.s.llnwi.net/o054/FunnyBone/interlink.m3u8 -#EXTINF:-1 tvg-id="KartoonCircus.us",Kartoon Circus -https://simultv.s.llnwi.net/o062/KartoonCircus/interlink.m3u8 -#EXTINF:-1 tvg-id="KartoonCircus.us",Kartoon Circus (720p) -https://simultv.s.llnwi.net/n4s4/KartoonCircus/interlink.m3u8 -#EXTINF:-1 tvg-id="",Kid Central (720p) -https://simultv.s.llnwi.net/o058/KidCentral/interlink.m3u8 -#EXTINF:-1 tvg-id="Lifestyle.us",Lifestyle -https://simultv.s.llnwi.net/o058/Lifestyle/interlink.m3u8 -#EXTINF:-1 tvg-id="",Military Home Life (720p) -https://simultv.s.llnwi.net/n4s4/MilitaryHomeLife/interlink.m3u8 -#EXTINF:-1 tvg-id="Mythos.us",Mythos -https://simultv.s.llnwi.net/o058/Mythos/interlink.m3u8 -#EXTINF:-1 tvg-id="PrimeTimeDrama.us",Prime Time Drama -https://simultv.s.llnwi.net/o064/PrimeTimeDrama/interlink.m3u8 -#EXTINF:-1 tvg-id="",Providence Christian Network -https://simultv.s.llnwi.net/n4s4/ProvidenceNetwork/interlink.m3u8 -#EXTINF:-1 tvg-id="",Ready Set Action (720p) -https://simultv.s.llnwi.net/o059/ReadySetAction/interlink.m3u8 -#EXTINF:-1 tvg-id="",Slap Tech -https://simultv.s.llnwi.net/o061/SlapTech/interlink.m3u8 -#EXTINF:-1 tvg-id="SpydarTV.us",Spydar -https://simultv.s.llnwi.net/o062/Spydar/interlink.m3u8 -#EXTINF:-1 tvg-id="SpydarTV.us",Spydar TV (720p) -https://simultv.s.llnwi.net/n4s4/Spydar/interlink.m3u8 -#EXTINF:-1 tvg-id="",Switch (720p) -https://simultv.s.llnwi.net/o062/Switch/interlink.m3u8 -#EXTINF:-1 tvg-id="Xcorps.us",Xcorps (720p) -https://simultv.s.llnwi.net/n4s4/xcorps/interlink.m3u8 -#EXTINF:-1 tvg-id="",XZone (720p) -https://simultv.s.llnwi.net/o060/xzone/interlink.m3u8 diff --git a/tests/__data__/input/issues/broken_stream.js b/tests/__data__/input/issues/broken_stream.js new file mode 100644 index 000000000..68c205433 --- /dev/null +++ b/tests/__data__/input/issues/broken_stream.js @@ -0,0 +1,81 @@ +module.exports = [ + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14140', + id: 1881649602, + node_id: 'I_kwDOCWUK8M5wJ7HC', + number: 14140, + title: 'Broken: RIK HD Cyprus', + user: { + login: 'ROBGagn', + id: 124619576, + node_id: 'U_kgDOB22LOA', + avatar_url: 'https://avatars.githubusercontent.com/u/124619576?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/ROBGagn', + html_url: 'https://github.com/ROBGagn', + followers_url: 'https://api.github.com/users/ROBGagn/followers', + following_url: 'https://api.github.com/users/ROBGagn/following{/other_user}', + gists_url: 'https://api.github.com/users/ROBGagn/gists{/gist_id}', + starred_url: 'https://api.github.com/users/ROBGagn/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/ROBGagn/subscriptions', + organizations_url: 'https://api.github.com/users/ROBGagn/orgs', + repos_url: 'https://api.github.com/users/ROBGagn/repos', + events_url: 'https://api.github.com/users/ROBGagn/events{/privacy}', + received_events_url: 'https://api.github.com/users/ROBGagn/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 1707513547, + node_id: 'MDU6TGFiZWwxNzA3NTEzNTQ3', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/broken%20stream', + name: 'broken stream', + color: 'FBCA04', + default: false, + description: 'Stream is not working properly' + }, + { + id: 3241837512, + node_id: 'MDU6TGFiZWwzMjQxODM3NTEy', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/CY', + name: 'CY', + color: '90FA7B', + default: false, + description: 'Cyprus' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 0, + created_at: '2023-09-05T10:09:04Z', + updated_at: '2023-09-07T00:50:06Z', + closed_at: null, + author_association: 'NONE', + active_lock_reason: null, + body: '### Broken Link\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist.m3u8\n\n### What happened to the stream?\n\nNot loading\n\n### Possible Replacement (optional)\n\nhttp://l6.cloudskep.com/rikcy/rikhd/playlist2.m3u8\n\n### Notes (optional)\n\nToken needed...\r\nSame issue with RIK 1 and 2. May happen in the future with ANT1 Cyprus, Sigma and Omega.\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14140/timeline', + performed_via_github_app: null, + state_reason: null + } +] diff --git a/tests/__data__/input/issues/streams_add.js b/tests/__data__/input/issues/streams_add.js index c225c57de..4d0426e32 100644 --- a/tests/__data__/input/issues/streams_add.js +++ b/tests/__data__/input/issues/streams_add.js @@ -1,4 +1,4 @@ -export default [ +module.exports = [ { url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179', repository_url: 'https://api.github.com/repos/iptv-org/iptv', diff --git a/tests/__data__/input/issues/streams_add_approved.js b/tests/__data__/input/issues/streams_add_approved.js index 5c0f12b79..0d2b9bf96 100644 --- a/tests/__data__/input/issues/streams_add_approved.js +++ b/tests/__data__/input/issues/streams_add_approved.js @@ -1,4 +1,4 @@ -export default [ +module.exports = [ { url: 'https://api.github.com/repos/iptv-org/iptv/issues/14179', repository_url: 'https://api.github.com/repos/iptv-org/iptv', diff --git a/tests/__data__/input/issues/streams_edit.js b/tests/__data__/input/issues/streams_edit.js new file mode 100644 index 000000000..ed531ae01 --- /dev/null +++ b/tests/__data__/input/issues/streams_edit.js @@ -0,0 +1,160 @@ +module.exports = [ + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14110', + id: 1884922249, + node_id: 'I_kwDOCWUK8M5wWaGJ', + number: 14110, + title: 'Edit: Tele2000', + user: { + login: 'freearhey', + id: 7253922, + node_id: 'MDQ6VXNlcjcyNTM5MjI=', + avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/freearhey', + html_url: 'https://github.com/freearhey', + followers_url: 'https://api.github.com/users/freearhey/followers', + following_url: 'https://api.github.com/users/freearhey/following{/other_user}', + gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', + starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', + organizations_url: 'https://api.github.com/users/freearhey/orgs', + repos_url: 'https://api.github.com/users/freearhey/repos', + events_url: 'https://api.github.com/users/freearhey/events{/privacy}', + received_events_url: 'https://api.github.com/users/freearhey/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:edit', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-07T00:30:51Z', + updated_at: '2023-09-07T00:48:23Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream URL\n\nhttps://servilive.com:3126/live/tele2000live.m3u8\n\n### Channel ID\n\nBBCAmericaEast.us\n\n### Channel Name\n\nBBC America\n\n### Quality\n\n720p\n\n### Label\n\nGeo-blocked\n\n### HTTP User-Agent\n\nMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110/timeline', + performed_via_github_app: null, + state_reason: null + }, + { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120', + repository_url: 'https://api.github.com/repos/iptv-org/iptv', + labels_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/labels{/name}', + comments_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/comments', + events_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/events', + html_url: 'https://github.com/iptv-org/iptv/issues/14120', + id: 1884922249, + node_id: 'I_kwDOCWUK8M5wWaGJ', + number: 14120, + title: 'Edit: Tele2000', + user: { + login: 'freearhey', + id: 7253922, + node_id: 'MDQ6VXNlcjcyNTM5MjI=', + avatar_url: 'https://avatars.githubusercontent.com/u/7253922?v=4', + gravatar_id: '', + url: 'https://api.github.com/users/freearhey', + html_url: 'https://github.com/freearhey', + followers_url: 'https://api.github.com/users/freearhey/followers', + following_url: 'https://api.github.com/users/freearhey/following{/other_user}', + gists_url: 'https://api.github.com/users/freearhey/gists{/gist_id}', + starred_url: 'https://api.github.com/users/freearhey/starred{/owner}{/repo}', + subscriptions_url: 'https://api.github.com/users/freearhey/subscriptions', + organizations_url: 'https://api.github.com/users/freearhey/orgs', + repos_url: 'https://api.github.com/users/freearhey/repos', + events_url: 'https://api.github.com/users/freearhey/events{/privacy}', + received_events_url: 'https://api.github.com/users/freearhey/received_events', + type: 'User', + site_admin: false + }, + labels: [ + { + id: 5923498886, + node_id: 'LA_kwDOCWUK8M8AAAABYRFrhg', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/approved', + name: 'approved', + color: '85ddde', + default: false, + description: '' + }, + { + id: 5923508587, + node_id: 'LA_kwDOCWUK8M8AAAABYRGRaw', + url: 'https://api.github.com/repos/iptv-org/iptv/labels/streams:add', + name: 'streams:edit', + color: '017ff9', + default: false, + description: 'Request to add a new link to a playlist' + } + ], + state: 'open', + locked: false, + assignee: null, + assignees: [], + milestone: null, + comments: 1, + created_at: '2023-09-07T00:30:51Z', + updated_at: '2023-09-07T00:48:23Z', + closed_at: null, + author_association: 'COLLABORATOR', + active_lock_reason: null, + body: '### Stream URL\n\nhttps://livestream.telvue.com/templeuni1/f7b44cfafd5c52223d5498196c8a2e7b.sdp/playlist.m3u8\n\n### Channel ID\n\nboo.us\n\n### Channel Name\n\nBBC America\n\n### Quality\n\n720p\n\n### Label\n\nGeo-blocked\n\n### HTTP User-Agent\n\nMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 Edge/12.246\n\n### HTTP Referrer\n\n_No response_\n\n### Notes\n\n_No response_\n\n### Contributing Guide\n\n- [X] I have read [Contributing Guide](https://github.com/iptv-org/iptv/blob/master/CONTRIBUTING.md)', + reactions: { + url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/reactions', + total_count: 0, + '+1': 0, + '-1': 0, + laugh: 0, + hooray: 0, + confused: 0, + heart: 0, + rocket: 0, + eyes: 0 + }, + timeline_url: 'https://api.github.com/repos/iptv-org/iptv/issues/14120/timeline', + performed_via_github_app: null, + state_reason: null + } +] diff --git a/tests/__data__/input/issues/streams_edit_approved.js b/tests/__data__/input/issues/streams_edit_approved.js index bf434d422..8e679a127 100644 --- a/tests/__data__/input/issues/streams_edit_approved.js +++ b/tests/__data__/input/issues/streams_edit_approved.js @@ -1,4 +1,4 @@ -export default [ +module.exports = [ { url: 'https://api.github.com/repos/iptv-org/iptv/issues/14110', repository_url: 'https://api.github.com/repos/iptv-org/iptv', diff --git a/tests/__data__/input/issues/streams_remove_approved.js b/tests/__data__/input/issues/streams_remove_approved.js index 92cbc441c..3877ab97f 100644 --- a/tests/__data__/input/issues/streams_remove_approved.js +++ b/tests/__data__/input/issues/streams_remove_approved.js @@ -1,4 +1,4 @@ -export default [ +module.exports = [ { url: 'https://api.github.com/repos/iptv-org/iptv/issues/14151', repository_url: 'https://api.github.com/repos/iptv-org/iptv', 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 eb54d2198..d9c637db0 100644 --- a/tests/commands/playlist/update.test.ts +++ b/tests/commands/playlist/update.test.ts @@ -9,7 +9,7 @@ beforeEach(() => { it('can format playlists', () => { const stdout = execSync( - 'DEBUG=true DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/output/streams npm run playlist:update --silent', + 'DATA_DIR=tests/__data__/input/data STREAMS_DIR=tests/__data__/output/streams npm run playlist:update --silent', { encoding: 'utf8' } @@ -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' } ) diff --git a/tests/commands/report/create.test.ts b/tests/commands/report/create.test.ts index 55199f81c..5a3eed758 100644 --- a/tests/commands/report/create.test.ts +++ b/tests/commands/report/create.test.ts @@ -10,14 +10,17 @@ it('can create report', () => { expect( stdout.includes(` -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ (index) โ”‚ issueNumber โ”‚ channelId โ”‚ status โ”‚ -โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค -โ”‚ 0 โ”‚ 14179 โ”‚ 'ManoramaNews.in' โ”‚ 'pending' โ”‚ -โ”‚ 1 โ”‚ 14178 โ”‚ 'TV3.my' โ”‚ 'blocked' โ”‚ -โ”‚ 2 โ”‚ 14177 โ”‚ 'TUTV.us' โ”‚ 'fullfilled' โ”‚ -โ”‚ 3 โ”‚ 14176 โ”‚ 'ManoramaNews.in' โ”‚ 'duplicate' โ”‚ -โ”‚ 4 โ”‚ 14175 โ”‚ 'TFX.fr' โ”‚ 'invalid_id' โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜`) +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ (index) โ”‚ issueNumber โ”‚ type โ”‚ channelId โ”‚ status โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ 0 โ”‚ 14110 โ”‚ 'streams:edit' โ”‚ 'BBCAmericaEast.us' โ”‚ 'invalid_link' โ”‚ +โ”‚ 1 โ”‚ 14120 โ”‚ 'streams:edit' โ”‚ 'boo.us' โ”‚ 'invalid_id' โ”‚ +โ”‚ 2 โ”‚ 14140 โ”‚ 'broken stream' โ”‚ undefined โ”‚ 'invalid_link' โ”‚ +โ”‚ 3 โ”‚ 14175 โ”‚ 'streams:add' โ”‚ 'TFX.fr' โ”‚ 'invalid_id' โ”‚ +โ”‚ 4 โ”‚ 14176 โ”‚ 'streams:add' โ”‚ 'ManoramaNews.in' โ”‚ 'duplicate' โ”‚ +โ”‚ 5 โ”‚ 14177 โ”‚ 'streams:add' โ”‚ 'TUTV.us' โ”‚ 'fullfilled' โ”‚ +โ”‚ 6 โ”‚ 14178 โ”‚ 'streams:add' โ”‚ 'TV3.my' โ”‚ 'blocked' โ”‚ +โ”‚ 7 โ”‚ 14179 โ”‚ 'streams:add' โ”‚ 'ManoramaNews.in' โ”‚ 'pending' โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜`) ).toBe(true) }) diff --git a/tsconfig.json b/tsconfig.json index ccc6f3ff7..56347ece7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,9 @@ { "compilerOptions": { "strict": true, - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "NodeNext", + "target": "es2020", + "module": "nodeNext", + "moduleResolution": "nodeNext", "typeRoots": [ "./scripts/types", "./node_modules/@types" diff --git a/yarn.lock b/yarn.lock index 79504afd3..7fa70ae1b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@ampproject/remapping@^2.0.0": version "2.1.1" resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.1.tgz" @@ -301,6 +306,71 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": + version "4.8.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz" + integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== + +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.49.0": + version "8.49.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz" + integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== + +"@freearhey/core@^0.1.2": + version "0.1.2" + resolved "https://registry.npmjs.org/@freearhey/core/-/core-0.1.2.tgz" + integrity sha512-o6FaLHiKED0JkUXxqHcUUM2P+Jd4kvE96p0MZlLjhCFAPii/lVr5mTwrHehKMzve/r7AbDUX7kyNLNG8Qec6uw== + dependencies: + "@types/fs-extra" "^11.0.2" + "@types/lodash" "^4.14.198" + fs-extra "^11.1.1" + glob "^10.3.4" + lodash "^4.17.21" + natural-orderby "^3.0.2" + normalize-url "^6.1.0" + signale "^1.4.0" + +"@humanwhocodes/config-array@^0.11.11": + version "0.11.11" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" @@ -555,6 +625,27 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@octokit/auth-token@^3.0.0": version "3.0.4" resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz" @@ -742,10 +833,10 @@ dependencies: "@babel/types" "^7.20.7" -"@types/fs-extra@^11.0.1": - version "11.0.1" - resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz" - integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA== +"@types/fs-extra@^11.0.1", "@types/fs-extra@^11.0.2": + version "11.0.2" + resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz" + integrity sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ== dependencies: "@types/jsonfile" "*" "@types/node" "*" @@ -799,6 +890,11 @@ expect "^29.0.0" pretty-format "^29.0.0" +"@types/json-schema@^7.0.12": + version "7.0.13" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + "@types/jsonfile@*": version "6.1.1" resolved "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz" @@ -821,6 +917,11 @@ resolved "https://registry.npmjs.org/@types/node/-/node-17.0.18.tgz" integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA== +"@types/semver@^7.5.0": + version "7.5.2" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz" + integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw== + "@types/signale@^1.4.4": version "1.4.4" resolved "https://registry.npmjs.org/@types/signale/-/signale-1.4.4.tgz" @@ -845,15 +946,115 @@ dependencies: "@types/yargs-parser" "*" +"@typescript-eslint/eslint-plugin@^6.7.2": + version "6.7.2" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz" + integrity sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q== + dependencies: + "@eslint-community/regexpp" "^4.5.1" + "@typescript-eslint/scope-manager" "6.7.2" + "@typescript-eslint/type-utils" "6.7.2" + "@typescript-eslint/utils" "6.7.2" + "@typescript-eslint/visitor-keys" "6.7.2" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.4" + natural-compare "^1.4.0" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.7.2": + version "6.7.2" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz" + integrity sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw== + dependencies: + "@typescript-eslint/scope-manager" "6.7.2" + "@typescript-eslint/types" "6.7.2" + "@typescript-eslint/typescript-estree" "6.7.2" + "@typescript-eslint/visitor-keys" "6.7.2" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@6.7.2": + version "6.7.2" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz" + integrity sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw== + dependencies: + "@typescript-eslint/types" "6.7.2" + "@typescript-eslint/visitor-keys" "6.7.2" + +"@typescript-eslint/type-utils@6.7.2": + version "6.7.2" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz" + integrity sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ== + dependencies: + "@typescript-eslint/typescript-estree" "6.7.2" + "@typescript-eslint/utils" "6.7.2" + debug "^4.3.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/types@6.7.2": + version "6.7.2" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz" + integrity sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg== + +"@typescript-eslint/typescript-estree@6.7.2": + version "6.7.2" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz" + integrity sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ== + dependencies: + "@typescript-eslint/types" "6.7.2" + "@typescript-eslint/visitor-keys" "6.7.2" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/utils@6.7.2": + version "6.7.2" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz" + integrity sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.7.2" + "@typescript-eslint/types" "6.7.2" + "@typescript-eslint/typescript-estree" "6.7.2" + semver "^7.5.4" + +"@typescript-eslint/visitor-keys@6.7.2": + version "6.7.2" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz" + integrity sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ== + dependencies: + "@typescript-eslint/types" "6.7.2" + eslint-visitor-keys "^3.4.1" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.4.1: - version "8.7.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.4.1, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" ansi-escapes@^4.2.1: version "4.3.2" @@ -916,6 +1117,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + array-union@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" @@ -923,6 +1129,11 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" @@ -1201,7 +1412,7 @@ create-require@^1.1.0: resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-spawn@^7.0.0, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1210,10 +1421,10 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@^4.1.0, debug@^4.1.1: - version "4.3.3" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" @@ -1222,6 +1433,11 @@ dedent@^1.0.0: resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deepmerge@^4.2.2: version "4.3.1" resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" @@ -1247,6 +1463,20 @@ diff@^4.0.1: resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" @@ -1304,11 +1534,105 @@ escape-string-regexp@^2.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.49.0: + version "8.49.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz" + integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.49.0" + "@humanwhocodes/config-array" "^0.11.11" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + execa@^5.0.0: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" @@ -1340,11 +1664,39 @@ expect@^29.0.0, expect@^29.6.4: jest-message-util "^29.6.3" jest-util "^29.6.3" -fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.1" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + fb-watchman@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" @@ -1359,6 +1711,13 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + filename-reserved-regex@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz" @@ -1404,6 +1763,28 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.1.0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + dependencies: + flatted "^3.2.7" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.7: + version "3.2.9" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + foreground-child@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" @@ -1478,6 +1859,20 @@ gh-pages@^5.0.0: fs-extra "^8.1.0" globby "^6.1.0" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@^10.3.4: version "10.3.4" resolved "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz" @@ -1542,6 +1937,25 @@ globals@^11.1.0: resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== +globals@^13.19.0: + version "13.22.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz" + integrity sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz" @@ -1558,6 +1972,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" @@ -1585,6 +2004,19 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" @@ -1636,6 +2068,11 @@ is-extglob@^1.0.0: resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" @@ -1653,6 +2090,27 @@ is-glob@^2.0.0: dependencies: is-extglob "^1.0.0" +is-glob@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-glob@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + is-invalid-path@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz" @@ -1665,6 +2123,11 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + is-plain-object@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" @@ -2126,11 +2589,23 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" @@ -2141,6 +2616,16 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json5@^2.1.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" @@ -2162,6 +2647,13 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" @@ -2172,6 +2664,14 @@ leven@^3.1.0: resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" @@ -2202,11 +2702,23 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" @@ -2271,6 +2783,11 @@ merge-stream@^2.0.0: resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" @@ -2284,7 +2801,7 @@ mimic-fn@^2.1.0: resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -2340,6 +2857,11 @@ normalize-path@^3.0.0: resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + normalize-url@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-7.2.0.tgz" @@ -2371,6 +2893,18 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" @@ -2385,6 +2919,13 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-limit@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" @@ -2406,6 +2947,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" @@ -2416,6 +2964,13 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" @@ -2467,6 +3022,11 @@ path-scurry@^1.10.1: lru-cache "^9.1.1 || ^10.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" @@ -2519,6 +3079,11 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + pretty-format@^29.0.0, pretty-format@^29.6.3: version "29.6.3" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz" @@ -2536,6 +3101,11 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + pure-rand@^6.0.0: version "6.0.3" resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz" @@ -2546,6 +3116,11 @@ q@^1.2.0: resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + react-is@^18.0.0: version "18.2.0" resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" @@ -2563,6 +3138,11 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" @@ -2582,6 +3162,25 @@ resolve@^1.20.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" @@ -2795,6 +3394,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + tmpl@1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" @@ -2831,6 +3435,11 @@ trim-repeated@^1.0.0: dependencies: escape-string-regexp "^1.0.2" +ts-api-utils@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz" + integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== + ts-jest@^29.1.1: version "29.1.1" resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz" @@ -2864,17 +3473,29 @@ ts-node@>=9.0.0: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-detect@4.0.8: version "4.0.8" resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@^5.2.2, typescript@>=2.7, "typescript@>=4.3 <6": +typescript@^5.2.2, typescript@>=2.7, typescript@>=4.2.0, "typescript@>=4.3 <6": version "5.2.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== @@ -2894,6 +3515,13 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz"
${column.name}