diff --git a/.gitignore b/.gitignore
index 7bbf0b1..f5d6b12 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,4 @@
**/node_modules
**.env
.now
-/scraper/manual/examples.js
\ No newline at end of file
+/scraper/manual/examples.js
diff --git a/addon/.dockerignore b/addon/.dockerignore
deleted file mode 100644
index 5538a38..0000000
--- a/addon/.dockerignore
+++ /dev/null
@@ -1,3 +0,0 @@
-**/node_modules
-**/npm-debug.log
-**/.env
\ No newline at end of file
diff --git a/addon/Dockerfile b/addon/Dockerfile
deleted file mode 100644
index 14dd96e..0000000
--- a/addon/Dockerfile
+++ /dev/null
@@ -1,12 +0,0 @@
-FROM node:21-alpine
-
-RUN apk update && apk upgrade && \
- apk add --no-cache git
-
-WORKDIR /home/node/app
-
-COPY package*.json ./
-RUN npm ci --only-production
-COPY . .
-
-CMD [ "node", "--insecure-http-parser", "index.js" ]
\ No newline at end of file
diff --git a/addon/addon.js b/addon/addon.js
deleted file mode 100644
index 184b45a..0000000
--- a/addon/addon.js
+++ /dev/null
@@ -1,127 +0,0 @@
-import { addonBuilder } from 'stremio-addon-sdk';
-import { Type } from './lib/types.js';
-import { dummyManifest } from './lib/manifest.js';
-import { cacheWrapStream } from './lib/cache.js';
-import { toStreamInfo, applyStaticInfo } from './lib/streamInfo.js';
-import * as repository from './lib/repository.js';
-import applySorting from './lib/sort.js';
-import applyFilters from './lib/filter.js';
-import { applyMochs, getMochCatalog, getMochItemMeta } from './moch/moch.js';
-import StaticLinks from './moch/static.js';
-import { createNamedQueue } from "./lib/namedQueue.js";
-import pLimit from "p-limit";
-
-const CACHE_MAX_AGE = parseInt(process.env.CACHE_MAX_AGE) || 60 * 60; // 1 hour in seconds
-const CACHE_MAX_AGE_EMPTY = 60; // 60 seconds
-const CATALOG_CACHE_MAX_AGE = 0; // 0 minutes
-const STALE_REVALIDATE_AGE = 4 * 60 * 60; // 4 hours
-const STALE_ERROR_AGE = 7 * 24 * 60 * 60; // 7 days
-
-const builder = new addonBuilder(dummyManifest());
-const requestQueue = createNamedQueue(Infinity);
-const newLimiter = pLimit(30)
-
-builder.defineStreamHandler((args) => {
- if (!args.id.match(/tt\d+/i) && !args.id.match(/kitsu:\d+/i)) {
- return Promise.resolve({ streams: [] });
- }
-
- return requestQueue.wrap(args.id, () => resolveStreams(args))
- .then(streams => applyFilters(streams, args.extra))
- .then(streams => applySorting(streams, args.extra, args.type))
- .then(streams => applyStaticInfo(streams))
- .then(streams => applyMochs(streams, args.extra))
- .then(streams => enrichCacheParams(streams))
- .catch(error => {
- return Promise.reject(`Failed request ${args.id}: ${error}`);
- });
-});
-
-builder.defineCatalogHandler((args) => {
- const [_, mochKey, catalogId] = args.id.split('-');
- console.log(`Incoming catalog ${args.id} request with skip=${args.extra.skip || 0}`)
- return getMochCatalog(mochKey, catalogId, args.extra)
- .then(metas => ({
- metas: metas,
- cacheMaxAge: CATALOG_CACHE_MAX_AGE
- }))
- .catch(error => {
- return Promise.reject(`Failed retrieving catalog ${args.id}: ${JSON.stringify(error.message || error)}`);
- });
-})
-
-builder.defineMetaHandler((args) => {
- const [mochKey, metaId] = args.id.split(':');
- console.log(`Incoming debrid meta ${args.id} request`)
- return getMochItemMeta(mochKey, metaId, args.extra)
- .then(meta => ({
- meta: meta,
- cacheMaxAge: metaId === 'Downloads' ? 0 : CACHE_MAX_AGE
- }))
- .catch(error => {
- return Promise.reject(`Failed retrieving catalog meta ${args.id}: ${JSON.stringify(error)}`);
- });
-})
-
-async function resolveStreams(args) {
- return cacheWrapStream(args.id, () => newLimiter(() => streamHandler(args)
- .then(records => records
- .sort((a, b) => b.torrent.seeders - a.torrent.seeders || b.torrent.uploadDate - a.torrent.uploadDate)
- .map(record => toStreamInfo(record)))));
-}
-
-async function streamHandler(args) {
- // console.log(`Pending count: ${newLimiter.pendingCount}, active count: ${newLimiter.activeCount}`, )
- if (args.type === Type.MOVIE) {
- return movieRecordsHandler(args);
- } else if (args.type === Type.SERIES) {
- return seriesRecordsHandler(args);
- }
- return Promise.reject('not supported type');
-}
-
-async function seriesRecordsHandler(args) {
- if (args.id.match(/^tt\d+:\d+:\d+$/)) {
- const parts = args.id.split(':');
- const imdbId = parts[0];
- const season = parts[1] !== undefined ? parseInt(parts[1], 10) : 1;
- const episode = parts[2] !== undefined ? parseInt(parts[2], 10) : 1;
- return repository.getImdbIdSeriesEntries(imdbId, season, episode);
- } else if (args.id.match(/^kitsu:\d+(?::\d+)?$/i)) {
- const parts = args.id.split(':');
- const kitsuId = parts[1];
- const episode = parts[2] !== undefined ? parseInt(parts[2], 10) : undefined;
- return episode !== undefined
- ? repository.getKitsuIdSeriesEntries(kitsuId, episode)
- : repository.getKitsuIdMovieEntries(kitsuId);
- }
- return Promise.resolve([]);
-}
-
-async function movieRecordsHandler(args) {
- if (args.id.match(/^tt\d+$/)) {
- const parts = args.id.split(':');
- const imdbId = parts[0];
- return repository.getImdbIdMovieEntries(imdbId);
- } else if (args.id.match(/^kitsu:\d+(?::\d+)?$/i)) {
- return seriesRecordsHandler(args);
- }
- return Promise.resolve([]);
-}
-
-function enrichCacheParams(streams) {
- let cacheAge = CACHE_MAX_AGE;
- if (!streams.length) {
- cacheAge = CACHE_MAX_AGE_EMPTY;
- } else if (streams.every(stream => stream?.url?.endsWith(StaticLinks.FAILED_ACCESS))) {
- cacheAge = 0;
- }
- return {
- streams: streams,
- cacheMaxAge: cacheAge,
- staleRevalidate: STALE_REVALIDATE_AGE,
- staleError: STALE_ERROR_AGE
- }
-}
-
-export default builder.getInterface();
diff --git a/addon/index.js b/addon/index.js
deleted file mode 100644
index ab0f0a4..0000000
--- a/addon/index.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import express from 'express';
-import swStats from 'swagger-stats';
-import serverless from './serverless.js';
-import { manifest } from './lib/manifest.js';
-import { initBestTrackers } from './lib/magnetHelper.js';
-
-const app = express();
-app.enable('trust proxy');
-app.use(swStats.getMiddleware({
- name: manifest().name,
- version: manifest().version,
- timelineBucketDuration: 60 * 60 * 1000,
- apdexThreshold: 100,
- authentication: true,
- onAuthenticate: (req, username, password) => {
- return username === process.env.METRICS_USER
- && password === process.env.METRICS_PASSWORD
- },
-}))
-app.use(express.static('static', { maxAge: '1y' }));
-app.use((req, res, next) => serverless(req, res, next));
-app.listen(process.env.PORT || 7000, () => {
- initBestTrackers()
- .then(() => console.log(`Started addon at: http://localhost:${process.env.PORT || 7000}`));
-});
diff --git a/addon/lib/cache.js b/addon/lib/cache.js
deleted file mode 100644
index 3b5f93b..0000000
--- a/addon/lib/cache.js
+++ /dev/null
@@ -1,95 +0,0 @@
-import KeyvMongo from "@keyv/mongo";
-import { KeyvCacheableMemory } from "cacheable";
-import { isStaticUrl } from '../moch/static.js';
-
-const GLOBAL_KEY_PREFIX = 'torrentio-addon';
-const STREAM_KEY_PREFIX = `${GLOBAL_KEY_PREFIX}|stream`;
-const AVAILABILITY_KEY_PREFIX = `${GLOBAL_KEY_PREFIX}|availability`;
-const RESOLVED_URL_KEY_PREFIX = `${GLOBAL_KEY_PREFIX}|resolved`;
-
-const STREAM_TTL = 24 * 60 * 60 * 1000; // 24 hours
-const STREAM_EMPTY_TTL = 60 * 1000; // 1 minute
-const RESOLVED_URL_TTL = 3 * 60 * 60 * 1000; // 3 hours
-const AVAILABILITY_TTL = 5 * 24 * 60 * 60 * 1000; // 5 days
-const MESSAGE_VIDEO_URL_TTL = 60 * 1000; // 1 minutes
-// When the streams are empty we want to cache it for less time in case of timeouts or failures
-
-const MONGO_URI = process.env.MONGODB_URI;
-
-const memoryCache = new KeyvCacheableMemory({ ttl: MESSAGE_VIDEO_URL_TTL, lruSize: Infinity });
-const remoteCache = MONGO_URI && new KeyvMongo(MONGO_URI, {
- collection: 'torrentio_addon_collection',
- minPoolSize: 50,
- maxPoolSize: 200,
- maxConnecting: 5,
-});
-
-async function cacheWrap(cache, key, method, ttl) {
- if (!cache) {
- return method();
- }
- const value = await cache.get(key);
- if (value !== undefined) {
- return value;
- }
- const result = await method();
- const ttlValue = ttl instanceof Function ? ttl(result) : ttl;
- await cache.set(key, result, ttlValue);
- return result;
-}
-
-export function cacheWrapStream(id, method) {
- const ttl = (streams) => streams.length ? STREAM_TTL : STREAM_EMPTY_TTL;
- return cacheWrap(remoteCache, `${STREAM_KEY_PREFIX}:${id}`, method, ttl);
-}
-
-export function cacheWrapResolvedUrl(id, method) {
- const ttl = (url) => isStaticUrl(url) ? MESSAGE_VIDEO_URL_TTL : RESOLVED_URL_TTL;
- return cacheWrap(remoteCache, `${RESOLVED_URL_KEY_PREFIX}:${id}`, method, ttl);
-}
-
-export function cacheAvailabilityResults(infoHash, fileIds) {
- const key = `${AVAILABILITY_KEY_PREFIX}:${infoHash}`;
- const fileIdsString = fileIds.toString();
- const containsFileIds = (array) => array.some(ids => ids.toString() === fileIdsString)
- return remoteCache.get(key)
- .then(result => {
- const newResult = result || [];
- if (!containsFileIds(newResult)) {
- newResult.push(fileIds);
- newResult.sort((a, b) => b.length - a.length);
- }
- return remoteCache.set(key, newResult, AVAILABILITY_TTL);
- });
-}
-
-export function removeAvailabilityResults(infoHash, fileIds) {
- const key = `${AVAILABILITY_KEY_PREFIX}:${infoHash}`;
- const fileIdsString = fileIds.toString();
- return remoteCache.get(key)
- .then(result => {
- const storedIndex = result?.findIndex(ids => ids.toString() === fileIdsString);
- if (storedIndex >= 0) {
- result.splice(storedIndex, 1);
- return remoteCache.set(key, result, AVAILABILITY_TTL);
- }
- });
-}
-
-export function getCachedAvailabilityResults(infoHashes) {
- const keys = infoHashes.map(infoHash => `${AVAILABILITY_KEY_PREFIX}:${infoHash}`)
- return remoteCache.getMany(keys)
- .then(result => {
- const availabilityResults = {};
- infoHashes.forEach((infoHash, index) => {
- if (result[index]) {
- availabilityResults[infoHash] = result[index];
- }
- });
- return availabilityResults;
- })
- .catch(error => {
- console.log('Failed retrieve availability cache', error)
- return {};
- });
-}
diff --git a/addon/lib/configuration.js b/addon/lib/configuration.js
deleted file mode 100644
index d646297..0000000
--- a/addon/lib/configuration.js
+++ /dev/null
@@ -1,82 +0,0 @@
-import { DebridOptions } from '../moch/options.js';
-import { QualityFilter, Providers, SizeFilter } from './filter.js';
-import { LanguageOptions } from './languages.js';
-
-export const PreConfigurations = {
- lite: {
- config: liteConfig(),
- serialized: configValue(liteConfig()),
- manifest: {
- id: 'com.stremio.torrentio.lite.addon',
- name: 'Torrentio Lite',
- description: 'Preconfigured Lite version of Torrentio addon.'
- + ' To configure advanced options visit https://torrentio.strem.fun/lite'
- }
- },
- brazuca: {
- config: brazucaConfig(),
- serialized: configValue(brazucaConfig()),
- manifest: {
- id: 'com.stremio.torrentio.brazuca.addon',
- name: 'Torrentio Brazuca',
- description: 'Preconfigured version of Torrentio addon for Brazilian content.'
- + ' To configure advanced options visit https://torrentio.strem.fun/brazuca',
- logo: 'https://i.ibb.co/8mgRZPp/GwxAcDV.png'
- }
- }
-}
-
-const keysToSplit = [Providers.key, LanguageOptions.key, QualityFilter.key, SizeFilter.key, DebridOptions.key];
-const keysToUppercase = [SizeFilter.key];
-
-export function parseConfiguration(configuration) {
- if (!configuration) {
- return undefined;
- }
- if (PreConfigurations[configuration]) {
- return PreConfigurations[configuration].config;
- }
- const configValues = configuration.split('|')
- .reduce((map, next) => {
- const parameterParts = next.split('=');
- if (parameterParts.length === 2) {
- map[parameterParts[0].toLowerCase()] = parameterParts[1];
- }
- return map;
- }, {});
- keysToSplit
- .filter(key => configValues[key])
- .forEach(key => configValues[key] = configValues[key].split(',')
- .map(value => keysToUppercase.includes(key) ? value.toUpperCase() : value.toLowerCase()))
- return configValues;
-}
-
-function liteConfig() {
- const config = {};
- config[Providers.key] = Providers.options
- .filter(provider => !provider.foreign)
- .map(provider => provider.key);
- config[QualityFilter.key] = ['scr', 'cam']
- config['limit'] = 1;
- return config;
-}
-
-function brazucaConfig() {
- const config = {};
- config[Providers.key] = Providers.options
- .filter(provider => !provider.foreign || provider.foreign === '🇵🇹')
- .map(provider => provider.key);
- config[LanguageOptions.key] = ['portuguese'];
- return config;
-}
-
-function configValue(config) {
- return Object.entries(config)
- .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(',') : value}`)
- .join('|');
-}
-
-export function getManifestOverride(config) {
- const preConfig = Object.values(PreConfigurations).find(pre => pre.config === config);
- return preConfig ? preConfig.manifest : {};
-}
\ No newline at end of file
diff --git a/addon/lib/extension.js b/addon/lib/extension.js
deleted file mode 100644
index abd1b72..0000000
--- a/addon/lib/extension.js
+++ /dev/null
@@ -1,72 +0,0 @@
-const VIDEO_EXTENSIONS = [
- "3g2",
- "3gp",
- "avi",
- "flv",
- "mkv",
- "mk3d",
- "mov",
- "mp2",
- "mp4",
- "m4v",
- "mpe",
- "mpeg",
- "mpg",
- "mpv",
- "webm",
- "wmv",
- "ogm",
- "ts",
- "m2ts"
-];
-const SUBTITLE_EXTENSIONS = [
- "aqt",
- "gsub",
- "jss",
- "sub",
- "ttxt",
- "pjs",
- "psb",
- "rt",
- "smi",
- "slt",
- "ssf",
- "srt",
- "ssa",
- "ass",
- "usf",
- "idx",
- "vtt"
-];
-const DISK_EXTENSIONS = [
- "iso",
- "m2ts",
- "ts",
- "vob"
-]
-
-const ARCHIVE_EXTENSIONS = [
- "rar",
- "zip"
-]
-
-export function isVideo(filename) {
- return isExtension(filename, VIDEO_EXTENSIONS);
-}
-
-export function isSubtitle(filename) {
- return isExtension(filename, SUBTITLE_EXTENSIONS);
-}
-
-export function isDisk(filename) {
- return isExtension(filename, DISK_EXTENSIONS);
-}
-
-export function isArchive(filename) {
- return isExtension(filename, ARCHIVE_EXTENSIONS);
-}
-
-export function isExtension(filename, extensions) {
- const extensionMatch = filename?.match(/\.(\w{2,4})$/);
- return extensionMatch && extensions.includes(extensionMatch[1].toLowerCase());
-}
diff --git a/addon/lib/filter.js b/addon/lib/filter.js
deleted file mode 100644
index c8eea6f..0000000
--- a/addon/lib/filter.js
+++ /dev/null
@@ -1,269 +0,0 @@
-import { extractProvider, parseSize, extractSize } from './titleHelper.js';
-import { Type } from './types.js';
-export const Providers = {
- key: 'providers',
- options: [
- {
- key: 'yts',
- label: 'YTS'
- },
- {
- key: 'eztv',
- label: 'EZTV'
- },
- {
- key: 'rarbg',
- label: 'RARBG'
- },
- {
- key: '1337x',
- label: '1337x'
- },
- {
- key: 'thepiratebay',
- label: 'ThePirateBay'
- },
- {
- key: 'kickasstorrents',
- label: 'KickassTorrents'
- },
- {
- key: 'torrentgalaxy',
- label: 'TorrentGalaxy'
- },
- {
- key: 'magnetdl',
- label: 'MagnetDL'
- },
- {
- key: 'horriblesubs',
- label: 'HorribleSubs',
- anime: true
- },
- {
- key: 'nyaasi',
- label: 'NyaaSi',
- anime: true
- },
- {
- key: 'tokyotosho',
- label: 'TokyoTosho',
- anime: true
- },
- {
- key: 'anidex',
- label: 'AniDex',
- anime: true
- },
- {
- key: 'rutor',
- label: 'Rutor',
- foreign: '🇷🇺'
- },
- {
- key: 'rutracker',
- label: 'Rutracker',
- foreign: '🇷🇺'
- },
- {
- key: 'comando',
- label: 'Comando',
- foreign: '🇵🇹'
- },
- {
- key: 'bludv',
- label: 'BluDV',
- foreign: '🇵🇹'
- },
- {
- key: 'torrent9',
- label: 'Torrent9',
- foreign: '🇫🇷'
- },
- {
- key: 'ilcorsaronero',
- label: 'ilCorSaRoNeRo',
- foreign: '🇮🇹'
- },
- {
- key: 'mejortorrent',
- label: 'MejorTorrent',
- foreign: '🇪🇸'
- },
- {
- key: 'wolfmax4k',
- label: 'Wolfmax4k',
- foreign: '🇪🇸'
- },
- {
- key: 'cinecalidad',
- label: 'Cinecalidad',
- foreign: '🇲🇽'
- },
- ]
-};
-export const QualityFilter = {
- key: 'qualityfilter',
- options: [
- {
- key: 'brremux',
- label: 'BluRay REMUX',
- test(quality, bingeGroup) {
- return bingeGroup?.includes(this.label);
- }
- },
- {
- key: 'hdrall',
- label: 'HDR/HDR10+/Dolby Vision',
- items: ['HDR', 'HDR10+', 'DV'],
- test(quality) {
- const hdrProfiles = quality?.split(' ')?.slice(1)?.join() || '';
- return this.items.some(hdrType => hdrProfiles.includes(hdrType));
- }
- },
- {
- key: 'dolbyvision',
- label: 'Dolby Vision',
- test(quality) {
- const hdrProfiles = quality?.split(' ')?.slice(1)?.join() || '';
- return hdrProfiles === 'DV';
- }
- },
- {
- key: 'dolbyvisionwithhdr',
- label: 'Dolby Vision + HDR',
- test(quality) {
- const hdrProfiles = quality?.split(' ')?.slice(1)?.join() || '';
- return hdrProfiles.includes('DV') && hdrProfiles.includes('HDR');
- }
- },
- {
- key: 'threed',
- label: '3D',
- test(quality) {
- const hdrProfiles = quality?.split(' ')?.slice(1)?.join() || '';
- return hdrProfiles.includes('3D');
- }
- },
- {
- key: 'nonthreed',
- label: 'Non 3D (DO NOT SELECT IF NOT SURE)',
- test(quality) {
- const hdrProfiles = quality?.split(' ')?.slice(1)?.join() || '';
- return !hdrProfiles.includes('3D');
- }
- },
- {
- key: '4k',
- label: '4k',
- items: ['4k'],
- test(quality) {
- return quality && this.items.includes(quality.split(' ')[0]);
- }
- },
- {
- key: '1080p',
- label: '1080p',
- items: ['1080p'],
- test(quality) {
- return this.items.includes(quality)
- }
- },
- {
- key: '720p',
- label: '720p',
- items: ['720p'],
- test(quality) {
- return this.items.includes(quality)
- }
- },
- {
- key: '480p',
- label: '480p',
- items: ['480p'],
- test(quality) {
- return this.items.includes(quality)
- }
- },
- {
- key: 'other',
- label: 'Other (DVDRip/HDRip/BDRip...)',
- // could be ['DVDRip', 'HDRip', 'BDRip', 'BRRip', 'BluRay', 'WEB-DL', 'WEBRip', 'HDTV', 'DivX', 'XviD']
- items: ['4k', '1080p', '720p', '480p', 'SCR', 'CAM', 'TeleSync', 'TeleCine'],
- test(quality) {
- return quality && !this.items.includes(quality.split(' ')[0]);
- }
- },
- {
- key: 'scr',
- label: 'Screener',
- items: ['SCR'],
- test(quality) {
- return this.items.includes(quality)
- }
- },
- {
- key: 'cam',
- label: 'Cam',
- items: ['CAM', 'TeleSync', 'TeleCine'],
- test(quality) {
- return this.items.includes(quality)
- }
- },
- {
- key: 'unknown',
- label: 'Unknown',
- test(quality) {
- return !quality
- }
- }
- ]
-};
-export const SizeFilter = {
- key: 'sizefilter'
-}
-const defaultProviderKeys = Providers.options.map(provider => provider.key);
-
-export default function applyFilters(streams, config) {
- return [
- filterByProvider,
- filterByQuality,
- filterBySize
- ].reduce((filteredStreams, filter) => filter(filteredStreams, config), streams);
-}
-
-function filterByProvider(streams, config) {
- const providers = config.providers || defaultProviderKeys;
- if (!providers?.length) {
- return streams;
- }
- return streams.filter(stream => {
- const provider = extractProvider(stream.title).toLowerCase();
- return providers.includes(provider);
- })
-}
-
-function filterByQuality(streams, config) {
- const filters = config[QualityFilter.key];
- if (!filters) {
- return streams;
- }
- const filterOptions = QualityFilter.options.filter(option => filters.includes(option.key));
- return streams.filter(stream => {
- const streamQuality = stream.name.split('\n')[1];
- const bingeGroup = stream.behaviorHints?.bingeGroup;
- return !filterOptions.some(option => option.test(streamQuality, bingeGroup));
- });
-}
-
-function filterBySize(streams, config) {
- const sizeFilters = config[SizeFilter.key];
- if (!sizeFilters?.length) {
- return streams;
- }
- const sizeLimit = parseSize(config.type === Type.MOVIE ? sizeFilters.shift() : sizeFilters.pop());
- return streams.filter(stream => {
- const size = extractSize(stream.title)
- return size <= sizeLimit;
- })
-}
diff --git a/addon/lib/landingTemplate.js b/addon/lib/landingTemplate.js
deleted file mode 100644
index 59206d7..0000000
--- a/addon/lib/landingTemplate.js
+++ /dev/null
@@ -1,506 +0,0 @@
-const STYLESHEET = `
-* {
- box-sizing: border-box;
-}
-
-body,
-html {
- margin: 0;
- padding: 0;
- width: 100%;
- height: 100%
-}
-
-html {
- background-size: auto 100%;
- background-size: cover;
- background-position: center center;
- background-repeat: repeat-y;
-}
-
-body {
- display: flex;
- background-color: transparent;
- font-family: 'Open Sans', Arial, sans-serif;
- color: white;
-}
-
-h1 {
- font-size: 4.5vh;
- font-weight: 700;
-}
-
-h2 {
- font-size: 2.2vh;
- font-weight: normal;
- font-style: italic;
- opacity: 0.8;
-}
-
-h3 {
- font-size: 2.2vh;
-}
-
-h1,
-h2,
-h3,
-p,
-label {
- margin: 0;
- text-shadow: 0 0 1vh rgba(0, 0, 0, 0.15);
-}
-
-p {
- font-size: 1.75vh;
-}
-
-ul {
- font-size: 1.75vh;
- margin: 0;
- margin-top: 1vh;
- padding-left: 3vh;
-}
-
-a {
- color: green
-}
-
-a.install-link {
- text-decoration: none
-}
-
-.install-button {
- border: 0;
- outline: 0;
- color: white;
- background: #8A5AAB;
- padding: 1.2vh 3.5vh;
- margin: auto;
- text-align: center;
- font-family: 'Open Sans', Arial, sans-serif;
- font-size: 2.2vh;
- font-weight: 600;
- cursor: pointer;
- display: block;
- box-shadow: 0 0.5vh 1vh rgba(0, 0, 0, 0.2);
- transition: box-shadow 0.1s ease-in-out;
-}
-
-.install-button:hover {
- box-shadow: none;
-}
-
-.install-button:active {
- box-shadow: 0 0 0 0.5vh white inset;
-}
-
-#addon {
- width: 90vh;
- margin: auto;
- padding-left: 10%;
- padding-right: 10%;
- background: rgba(0, 0, 0, 0.60);
-}
-
-.logo {
- height: 14vh;
- width: 14vh;
- margin: auto;
- margin-bottom: 3vh;
-}
-
-.logo img {
- width: 100%;
-}
-
-.name, .version {
- display: inline-block;
- vertical-align: top;
-}
-
-.name {
- line-height: 5vh;
-}
-
-.version {
- position: absolute;
- line-height: 5vh;
- margin-left: 1vh;
- opacity: 0.8;
-}
-
-.contact {
- left: 0;
- bottom: 4vh;
- width: 100%;
- margin-top: 1vh;
- text-align: center;
-}
-
-.contact a {
- font-size: 1.4vh;
- font-style: italic;
-}
-
-.separator {
- margin-bottom: 4vh;
-}
-
-.label {
- font-size: 2.2vh;
- font-weight: 600;
- padding: 0;
- line-height: inherit;
-}
-
-.btn-group, .multiselect-container {
- width: 100%;
-}
-
-.btn {
- text-align: left;
-}
-
-.multiselect-container {
- border: 0;
- border-radius: 0;
-}
-
-.input, .btn {
- width: 100%;
- margin: auto;
- margin-bottom: 10px;
- padding: 6px 12px;
- border: 0;
- border-radius: 0;
- outline: 0;
- color: #333;
- background-color: rgb(255, 255, 255);
- box-shadow: 0 0.5vh 1vh rgba(0, 0, 0, 0.2);
-}
-
-.input:focus, .btn:focus {
- outline: none;
- box-shadow: 0 0 0 2pt rgb(30, 144, 255, 0.7);
-}
-`;
-import { Providers, QualityFilter, SizeFilter } from './filter.js';
-import { SortOptions } from './sort.js';
-import { LanguageOptions } from './languages.js';
-import { DebridOptions } from '../moch/options.js';
-import { MochOptions } from '../moch/moch.js';
-import { PreConfigurations } from './configuration.js';
-
-export default function landingTemplate(manifest, config = {}) {
- const providers = config[Providers.key] || Providers.options.map(provider => provider.key);
- const sort = config[SortOptions.key] || SortOptions.options.qualitySeeders.key;
- const languages = config[LanguageOptions.key] || [];
- const qualityFilters = config[QualityFilter.key] || [];
- const sizeFilter = (config[SizeFilter.key] || []).join(',');
- const limit = config.limit || '';
-
- const debridProvider = Object.keys(MochOptions).find(mochKey => config[mochKey]);
- const debridOptions = config[DebridOptions.key] || [];
- const realDebridApiKey = config[MochOptions.realdebrid.key] || '';
- const premiumizeApiKey = config[MochOptions.premiumize.key] || '';
- const allDebridApiKey = config[MochOptions.alldebrid.key] || '';
- const debridLinkApiKey = config[MochOptions.debridlink.key] || '';
- const offcloudApiKey = config[MochOptions.offcloud.key] || '';
- const torboxApiKey = config[MochOptions.torbox.key] || '';
- const putioKey = config[MochOptions.putio.key] || '';
- const putioClientId = putioKey.replace(/@.*/, '');
- const putioToken = putioKey.replace(/.*@/, '');
-
- const background = manifest.background || 'https://dl.strem.io/addon-background.jpg';
- const logo = manifest.logo || 'https://dl.strem.io/addon-logo.png';
- const providersHTML = Providers.options
- .map(provider => ``)
- .join('\n');
- const sortOptionsHTML = Object.values(SortOptions.options)
- .map((option, i) => ``)
- .join('\n');
- const languagesOptionsHTML = LanguageOptions.options
- .map((option, i) => ``)
- .join('\n');
- const qualityFiltersHTML = Object.values(QualityFilter.options)
- .map(option => ``)
- .join('\n');
- const debridProvidersHTML = Object.values(MochOptions)
- .map(moch => ``)
- .join('\n');
- const debridOptionsHTML = Object.values(DebridOptions.options)
- .map(option => ``)
- .join('\n');
- const stylizedTypes = manifest.types
- .map(t => t[0].toUpperCase() + t.slice(1) + (t !== 'series' ? 's' : ''));
- const preConfigurationObject = Object.entries(PreConfigurations)
- .map(([key, config]) => `${key}: '${config.serialized}'`)
- .join(',');
-
- return `
-
-
-
-
-
- ${manifest.name} - Stremio Addon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

-
-
${manifest.name}
-
${manifest.version || '0.0.0'}
-
${manifest.description || ''}
-
-
-
-
This addon has more :
-
- ${stylizedTypes.map(t => `- ${t}
`).join('')}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- `
-}
diff --git a/addon/lib/languages.js b/addon/lib/languages.js
deleted file mode 100644
index 1b80ac4..0000000
--- a/addon/lib/languages.js
+++ /dev/null
@@ -1,76 +0,0 @@
-const languageMapping = {
- 'dubbed': 'Dubbed',
- 'multi audio': 'Multi Audio',
- 'multi subs': 'Multi Subs',
- 'dual audio': 'Dual Audio',
- 'english': '🇬🇧',
- 'japanese': '🇯🇵',
- 'russian': '🇷🇺',
- 'italian': '🇮🇹',
- 'portuguese': '🇵🇹',
- 'spanish': '🇪🇸',
- 'latino': '🇲🇽',
- 'korean': '🇰🇷',
- 'chinese': '🇨🇳',
- 'taiwanese': '🇹🇼',
- 'french': '🇫🇷',
- 'german': '🇩🇪',
- 'dutch': '🇳🇱',
- 'hindi': '🇮🇳',
- 'telugu': '🇮🇳',
- 'tamil': '🇮🇳',
- 'polish': '🇵🇱',
- 'lithuanian': '🇱🇹',
- 'latvian': '🇱🇻',
- 'estonian': '🇪🇪',
- 'czech': '🇨🇿',
- 'slovakian': '🇸🇰',
- 'slovenian': '🇸🇮',
- 'hungarian': '🇭🇺',
- 'romanian': '🇷🇴',
- 'bulgarian': '🇧🇬',
- 'serbian': '🇷🇸 ',
- 'croatian': '🇭🇷',
- 'ukrainian': '🇺🇦',
- 'greek': '🇬🇷',
- 'danish': '🇩🇰',
- 'finnish': '🇫🇮',
- 'swedish': '🇸🇪',
- 'norwegian': '🇳🇴',
- 'turkish': '🇹🇷',
- 'arabic': '🇸🇦',
- 'persian': '🇮🇷',
- 'hebrew': '🇮🇱',
- 'vietnamese': '🇻🇳',
- 'indonesian': '🇮🇩',
- 'malay': '🇲🇾',
- 'thai': '🇹🇭'
-}
-
-export const LanguageOptions = {
- key: 'language',
- options: Object.keys(languageMapping).slice(5).map(lang => ({
- key: lang,
- label: `${languageMapping[lang]} ${lang.charAt(0).toUpperCase()}${lang.slice(1)}`
- }))
-}
-
-export function mapLanguages(languages) {
- const mapped = languages
- .map(language => languageMapping[language])
- .filter(language => language)
- .sort((a, b) => Object.values(languageMapping).indexOf(a) - Object.values(languageMapping).indexOf(b));
- const unmapped = languages
- .filter(language => !languageMapping[language])
- .sort((a, b) => a.localeCompare(b))
- return [...new Set([].concat(mapped).concat(unmapped))];
-}
-
-export function containsLanguage(stream, languages) {
- return languages.map(lang => languageMapping[lang]).some(lang => stream.title.includes(lang));
-}
-
-export function languageFromCode(code) {
- const entry = Object.entries(languageMapping).find(entry => entry[1] === code);
- return entry?.[0];
-}
diff --git a/addon/lib/magnetHelper.js b/addon/lib/magnetHelper.js
deleted file mode 100644
index 4893692..0000000
--- a/addon/lib/magnetHelper.js
+++ /dev/null
@@ -1,93 +0,0 @@
-import axios from 'axios';
-import magnet from 'magnet-uri';
-import { getRandomUserAgent } from './requestHelper.js';
-import { getTorrent } from './repository.js';
-import { Type } from './types.js';
-import { extractProvider } from "./titleHelper.js";
-import { Providers } from "./filter.js";
-
-const TRACKERS_URL = 'https://raw.githubusercontent.com/ngosang/trackerslist/master/trackers_best.txt';
-const ANIME_TRACKERS = [
- "http://nyaa.tracker.wf:7777/announce",
- "http://anidex.moe:6969/announce",
- "http://tracker.anirena.com:80/announce",
- "udp://tracker.uw0.xyz:6969/announce",
- "http://share.camoe.cn:8080/announce",
- "http://t.nyaatracker.com:80/announce",
-];
-const RUSSIAN_TRACKERS = [
- "udp://opentor.net:6969",
- "http://bt.t-ru.org/ann?magnet",
- "http://bt2.t-ru.org/ann?magnet",
- "http://bt3.t-ru.org/ann?magnet",
- "http://bt4.t-ru.org/ann?magnet",
-];
-// Some trackers have limits on original torrent trackers,
-// where downloading ip has to seed the torrents for some amount of time,
-// thus it doesn't work on mochs.
-// So it's better to exclude them and try to download through DHT,
-// as the torrent won't start anyway.
-const RUSSIAN_PROVIDERS = Providers.options
- .filter(provider => provider.foreign === '🇷🇺')
- .map(provider => provider.label);
-const ANIME_PROVIDERS = Providers.options
- .filter(provider => provider.anime)
- .map(provider => provider.label);
-let BEST_TRACKERS = [];
-let ALL_ANIME_TRACKERS = [];
-let ALL_RUSSIAN_TRACKERS = [];
-
-export async function getMagnetLink(infoHash) {
- const torrent = await getTorrent(infoHash).catch(() => ({ infoHash }));
- const torrentTrackers = torrent?.trackers?.split(',') || [];
- const animeTrackers = torrent?.type === Type.ANIME ? ALL_ANIME_TRACKERS : [];
- const providerTrackers = RUSSIAN_PROVIDERS.includes(torrent?.provider) && ALL_RUSSIAN_TRACKERS || [];
- const trackers = unique([].concat(torrentTrackers).concat(animeTrackers).concat(providerTrackers));
-
- return magnet.encode({ infoHash: infoHash, name: torrent?.title, announce: trackers });
-}
-
-export async function initBestTrackers() {
- BEST_TRACKERS = await getBestTrackers();
- ALL_ANIME_TRACKERS = unique(BEST_TRACKERS.concat(ANIME_TRACKERS));
- ALL_RUSSIAN_TRACKERS = unique(BEST_TRACKERS.concat(RUSSIAN_TRACKERS));
- console.log('Retrieved best trackers: ', BEST_TRACKERS);
-}
-
-async function getBestTrackers(retry = 2) {
- const options = { timeout: 30000, headers: { 'User-Agent': getRandomUserAgent() } };
- return axios.get(TRACKERS_URL, options)
- .then(response => response?.data?.trim()?.split('\n\n') || [])
- .catch(error => {
- if (retry === 0) {
- console.log(`Failed retrieving best trackers: ${error.message}`);
- throw error;
- }
- return getBestTrackers(retry - 1);
- });
-}
-
-export function getSources(trackersInput, infoHash) {
- if (!trackersInput) {
- return null;
- }
- const trackers = Array.isArray(trackersInput) ? trackersInput : trackersInput.split(',');
- return trackers.map(tracker => `tracker:${tracker}`).concat(`dht:${infoHash}`);
-}
-
-export function enrichStreamSources(stream) {
- const provider = extractProvider(stream.title);
- if (ANIME_PROVIDERS.includes(provider)) {
- const sources = getSources(ALL_ANIME_TRACKERS, stream.infoHash);
- return { ...stream, sources };
- }
- if (RUSSIAN_PROVIDERS.includes(provider)) {
- const sources = unique([].concat(stream.sources || []).concat(getSources(ALL_RUSSIAN_TRACKERS, stream.infoHash)));
- return { ...stream, sources };
- }
- return stream;
-}
-
-function unique(array) {
- return Array.from(new Set(array));
-}
diff --git a/addon/lib/manifest.js b/addon/lib/manifest.js
deleted file mode 100644
index 4141f4d..0000000
--- a/addon/lib/manifest.js
+++ /dev/null
@@ -1,89 +0,0 @@
-import { MochOptions } from '../moch/moch.js';
-import { Providers } from './filter.js';
-import { showDebridCatalog } from '../moch/options.js';
-import { getManifestOverride } from './configuration.js';
-import { Type } from './types.js';
-
-const DefaultProviders = Providers.options.map(provider => provider.key);
-const MochProviders = Object.values(MochOptions);
-
-export function manifest(config = {}) {
- const overrideManifest = getManifestOverride(config);
- const baseManifest = {
- id: 'com.stremio.torrentio.addon',
- version: '0.0.14',
- name: getName(overrideManifest, config),
- description: getDescription(config),
- catalogs: getCatalogs(config),
- resources: getResources(config),
- types: [Type.MOVIE, Type.SERIES, Type.ANIME, Type.OTHER],
- background: `https://i.ibb.co/VtSfFP9/t8wVwcg.jpg`,
- logo: `https://i.ibb.co/w4BnkC9/GwxAcDV.png`,
- behaviorHints: {
- configurable: true,
- configurationRequired: false
- }
- };
- return Object.assign(baseManifest, overrideManifest);
-}
-
-export function dummyManifest() {
- const manifestDefault = manifest();
- manifestDefault.catalogs = [{ id: 'dummy', type: Type.OTHER }];
- manifestDefault.resources = ['stream', 'meta'];
- return manifestDefault;
-}
-
-function getName(manifest, config) {
- const rootName = manifest?.name || 'Torrentio';
- const mochSuffix = MochProviders
- .filter(moch => config[moch.key])
- .map(moch => moch.shortName)
- .join('/');
- return [rootName, mochSuffix].filter(v => v).join(' ');
-}
-
-function getDescription(config) {
- const providersList = config[Providers.key] || DefaultProviders;
- const enabledProvidersDesc = Providers.options
- .map(provider => `${provider.label}${providersList.includes(provider.key) ? '(+)' : '(-)'}`)
- .join(', ')
- const enabledMochs = MochProviders
- .filter(moch => config[moch.key])
- .map(moch => moch.name)
- .join(' & ');
- const possibleMochs = MochProviders.map(moch => moch.name).join('/')
- const mochsDesc = enabledMochs ? ` and ${enabledMochs} enabled` : '';
- return 'Provides torrent streams from scraped torrent providers.'
- + ` Currently supports ${enabledProvidersDesc}${mochsDesc}.`
- + ` To configure providers, ${possibleMochs} support and other settings visit https://torrentio.strem.fun`
-}
-
-function getCatalogs(config) {
- return MochProviders
- .filter(moch => showDebridCatalog(config) && config[moch.key])
- .map(moch => moch.catalogs.map(catalogName => ({
- id: catalogName ? `torrentio-${moch.key}-${catalogName.toLowerCase()}` : `torrentio-${moch.key}`,
- name: catalogName ? `${moch.name} ${catalogName}` : `${moch.name}`,
- type: 'other',
- extra: [{ name: 'skip' }],
- })))
- .reduce((a, b) => a.concat(b), []);
-}
-
-function getResources(config) {
- const streamResource = {
- name: 'stream',
- types: [Type.MOVIE, Type.SERIES],
- idPrefixes: ['tt', 'kitsu']
- };
- const metaResource = {
- name: 'meta',
- types: [Type.OTHER],
- idPrefixes: MochProviders.filter(moch => config[moch.key]).map(moch => moch.key)
- };
- if (showDebridCatalog(config) && MochProviders.filter(moch => config[moch.key]).length) {
- return [streamResource, metaResource];
- }
- return [streamResource];
-}
diff --git a/addon/lib/namedQueue.js b/addon/lib/namedQueue.js
deleted file mode 100644
index 695ce05..0000000
--- a/addon/lib/namedQueue.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import namedQueue from "named-queue";
-
-export function createNamedQueue(concurrency) {
- const queue = new namedQueue((task, callback) => task.method()
- .then(result => callback(false, result))
- .catch((error => callback(error))), 200);
- queue.wrap = (id, method) => new Promise(((resolve, reject) => {
- queue.push({ id, method }, (error, result) => result ? resolve(result) : reject(error));
- }));
- return queue;
-}
\ No newline at end of file
diff --git a/addon/lib/promises.js b/addon/lib/promises.js
deleted file mode 100644
index 55094bb..0000000
--- a/addon/lib/promises.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Delay promise
- */
-export async function delay(duration) {
- return new Promise((resolve) => setTimeout(resolve, duration));
-}
-
-/**
- * Timeout promise after a set time in ms
- */
-export async function timeout(timeoutMs, promise, message = 'Timed out') {
- return Promise.race([
- promise,
- new Promise(function (resolve, reject) {
- setTimeout(function () {
- reject(message);
- }, timeoutMs);
- })
- ]);
-}
diff --git a/addon/lib/repository.js b/addon/lib/repository.js
deleted file mode 100644
index e1a6121..0000000
--- a/addon/lib/repository.js
+++ /dev/null
@@ -1,131 +0,0 @@
-import { Sequelize } from 'sequelize';
-const Op = Sequelize.Op;
-
-const DATABASE_URI = process.env.DATABASE_URI;
-
-const database = new Sequelize(DATABASE_URI, { logging: false, pool: { max: 30, min: 5, idle: 20 * 60 * 1000 } });
-
-const Torrent = database.define('torrent',
- {
- infoHash: { type: Sequelize.STRING(64), primaryKey: true },
- provider: { type: Sequelize.STRING(32), allowNull: false },
- torrentId: { type: Sequelize.STRING(128) },
- title: { type: Sequelize.STRING(256), allowNull: false },
- size: { type: Sequelize.BIGINT },
- type: { type: Sequelize.STRING(16), allowNull: false },
- uploadDate: { type: Sequelize.DATE, allowNull: false },
- seeders: { type: Sequelize.SMALLINT },
- trackers: { type: Sequelize.STRING(4096) },
- languages: { type: Sequelize.STRING(4096) },
- resolution: { type: Sequelize.STRING(16) }
- }
-);
-
-const File = database.define('file',
- {
- id: { type: Sequelize.BIGINT, autoIncrement: true, primaryKey: true },
- infoHash: {
- type: Sequelize.STRING(64),
- allowNull: false,
- references: { model: Torrent, key: 'infoHash' },
- onDelete: 'CASCADE'
- },
- fileIndex: { type: Sequelize.INTEGER },
- title: { type: Sequelize.STRING(256), allowNull: false },
- size: { type: Sequelize.BIGINT },
- imdbId: { type: Sequelize.STRING(32) },
- imdbSeason: { type: Sequelize.INTEGER },
- imdbEpisode: { type: Sequelize.INTEGER },
- kitsuId: { type: Sequelize.INTEGER },
- kitsuEpisode: { type: Sequelize.INTEGER }
- },
-);
-
-const Subtitle = database.define('subtitle',
- {
- infoHash: {
- type: Sequelize.STRING(64),
- allowNull: false,
- references: { model: Torrent, key: 'infoHash' },
- onDelete: 'CASCADE'
- },
- fileIndex: { type: Sequelize.INTEGER, allowNull: false },
- fileId: {
- type: Sequelize.BIGINT,
- allowNull: true,
- references: { model: File, key: 'id' },
- onDelete: 'SET NULL'
- },
- title: { type: Sequelize.STRING(512), allowNull: false },
- size: { type: Sequelize.BIGINT, allowNull: false },
- },
- { timestamps: false }
-);
-
-Torrent.hasMany(File, { foreignKey: 'infoHash', constraints: false });
-File.belongsTo(Torrent, { foreignKey: 'infoHash', constraints: false });
-File.hasMany(Subtitle, { foreignKey: 'fileId', constraints: false });
-Subtitle.belongsTo(File, { foreignKey: 'fileId', constraints: false });
-
-export function getTorrent(infoHash) {
- return Torrent.findOne({ where: { infoHash: infoHash } });
-}
-
-export function getFiles(infoHashes) {
- return File.findAll({ where: { infoHash: { [Op.in]: infoHashes} } });
-}
-
-export function getImdbIdMovieEntries(imdbId) {
- return File.findAll({
- where: {
- imdbId: { [Op.eq]: imdbId }
- },
- include: [Torrent],
- limit: 500,
- order: [
- [Torrent, 'seeders', 'DESC']
- ]
- });
-}
-
-export function getImdbIdSeriesEntries(imdbId, season, episode) {
- return File.findAll({
- where: {
- imdbId: { [Op.eq]: imdbId },
- imdbSeason: { [Op.eq]: season },
- imdbEpisode: { [Op.eq]: episode }
- },
- include: [Torrent],
- limit: 500,
- order: [
- [Torrent, 'seeders', 'DESC']
- ]
- });
-}
-
-export function getKitsuIdMovieEntries(kitsuId) {
- return File.findAll({
- where: {
- kitsuId: { [Op.eq]: kitsuId }
- },
- include: [Torrent],
- limit: 500,
- order: [
- [Torrent, 'seeders', 'DESC']
- ]
- });
-}
-
-export function getKitsuIdSeriesEntries(kitsuId, episode) {
- return File.findAll({
- where: {
- kitsuId: { [Op.eq]: kitsuId },
- kitsuEpisode: { [Op.eq]: episode }
- },
- include: [Torrent],
- limit: 500,
- order: [
- [Torrent, 'seeders', 'DESC']
- ]
- });
-}
diff --git a/addon/lib/requestHelper.js b/addon/lib/requestHelper.js
deleted file mode 100644
index 7053ac4..0000000
--- a/addon/lib/requestHelper.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import UserAgent from 'user-agents';
-const userAgent = new UserAgent();
-
-export function getRandomUserAgent() {
- return userAgent.random().toString();
-}
diff --git a/addon/lib/sort.js b/addon/lib/sort.js
deleted file mode 100644
index 2430284..0000000
--- a/addon/lib/sort.js
+++ /dev/null
@@ -1,130 +0,0 @@
-import { QualityFilter } from './filter.js';
-import { containsLanguage, LanguageOptions } from './languages.js';
-import { Type } from './types.js';
-import { hasMochConfigured } from '../moch/moch.js';
-import { extractSeeders, extractSize } from './titleHelper.js';
-
-const OTHER_QUALITIES = QualityFilter.options.find(option => option.key === 'other');
-const CAM_QUALITIES = QualityFilter.options.find(option => option.key === 'cam');
-const HEALTHY_SEEDERS = 5;
-const SEEDED_SEEDERS = 1;
-const MIN_HEALTHY_COUNT = 50;
-const MAX_UNHEALTHY_COUNT = 5;
-
-export const SortOptions = {
- key: 'sort',
- options: {
- qualitySeeders: {
- key: 'quality',
- description: 'By quality then seeders'
- },
- qualitySize: {
- key: 'qualitysize',
- description: 'By quality then size'
- },
- seeders: {
- key: 'seeders',
- description: 'By seeders'
- },
- size: {
- key: 'size',
- description: 'By size'
- },
- }
-}
-
-export default function sortStreams(streams, config, type) {
- const languages = config[LanguageOptions.key];
- if (languages?.length && languages[0] !== 'english') {
- // No need to filter english since it's hard to predict which entries are english
- const streamsWithLanguage = streams.filter(stream => containsLanguage(stream, languages));
- const streamsNoLanguage = streams.filter(stream => !streamsWithLanguage.includes(stream));
- return _sortStreams(streamsWithLanguage, config, type).concat(_sortStreams(streamsNoLanguage, config, type));
- }
- return _sortStreams(streams, config, type);
-}
-
-function _sortStreams(streams, config, type) {
- const sort = config?.sort?.toLowerCase() || undefined;
- const limit = /^[1-9][0-9]*$/.test(config.limit) && parseInt(config.limit) || undefined;
- const sortedStreams = sortBySeeders(streams, config, type);
- if (sort === SortOptions.options.seeders.key) {
- return sortedStreams.slice(0, limit);
- } else if (sort === SortOptions.options.size.key) {
- return sortBySize(sortedStreams, limit);
- }
- const nestedSort = sort === SortOptions.options.qualitySize.key ? sortBySize : noopSort;
- return sortByVideoQuality(sortedStreams, nestedSort, limit)
-}
-
-function noopSort(streams) {
- return streams;
-}
-
-function sortBySeeders(streams, config, type) {
- // streams are already presorted by seeders and upload date
- const healthy = streams.filter(stream => extractSeeders(stream.title) >= HEALTHY_SEEDERS);
- const seeded = streams.filter(stream => extractSeeders(stream.title) >= SEEDED_SEEDERS);
-
- if (type === Type.SERIES && hasMochConfigured(config)) {
- return streams;
- } else if (healthy.length >= MIN_HEALTHY_COUNT) {
- return healthy;
- } else if (seeded.length >= MAX_UNHEALTHY_COUNT) {
- return seeded.slice(0, MIN_HEALTHY_COUNT);
- }
- return streams.slice(0, MAX_UNHEALTHY_COUNT);
-}
-
-function sortBySize(streams, limit) {
- return streams
- .sort((a, b) => {
- const aSize = extractSize(a.title);
- const bSize = extractSize(b.title);
- return bSize - aSize;
- }).slice(0, limit);
-}
-
-function sortByVideoQuality(streams, nestedSort, limit) {
- const qualityMap = streams
- .reduce((map, stream) => {
- const quality = extractQuality(stream.name);
- map[quality] = (map[quality] || []).concat(stream);
- return map;
- }, {});
- const sortedQualities = Object.keys(qualityMap)
- .sort((a, b) => {
- const aResolution = a?.match(/\d+p/) && parseInt(a, 10);
- const bResolution = b?.match(/\d+p/) && parseInt(b, 10);
- if (aResolution && bResolution) {
- return bResolution - aResolution; // higher resolution first;
- } else if (aResolution) {
- return -1; // remain higher if resolution is there
- } else if (bResolution) {
- return 1; // move downward if other stream has resolution
- }
- return a < b ? -1 : b < a ? 1 : 0; // otherwise sort by alphabetic order
- });
- return sortedQualities
- .map(quality => nestedSort(qualityMap[quality]).slice(0, limit))
- .reduce((a, b) => a.concat(b), []);
-}
-
-function extractQuality(title) {
- const qualityDesc = title.split('\n')[1];
- const resolutionMatch = qualityDesc?.match(/\d+p/);
- const isHDR = qualityDesc?.match(/HDR|DV/);
- const withHDRScore = resolution => isHDR ? resolution.replace('0p', '1p') : resolution;
- if (resolutionMatch) {
- return withHDRScore(resolutionMatch[0]);
- } else if (/8k/i.test(qualityDesc)) {
- return withHDRScore('4320p');
- } else if (/4k|uhd/i.test(qualityDesc)) {
- return withHDRScore('2060p');
- } else if (CAM_QUALITIES.test(qualityDesc)) {
- return CAM_QUALITIES.label;
- } else if (OTHER_QUALITIES.test(qualityDesc)) {
- return OTHER_QUALITIES.label;
- }
- return qualityDesc;
-}
diff --git a/addon/lib/streamInfo.js b/addon/lib/streamInfo.js
deleted file mode 100644
index 4a4b743..0000000
--- a/addon/lib/streamInfo.js
+++ /dev/null
@@ -1,152 +0,0 @@
-import titleParser from 'parse-torrent-title';
-import { Type } from './types.js';
-import { mapLanguages } from './languages.js';
-import { enrichStreamSources, getSources } from './magnetHelper.js';
-import { getSubtitles } from './subtitles.js';
-
-const ADDON_NAME = 'Torrentio';
-const SIZE_DELTA = 0.05;
-const UNKNOWN_SIZE = 300000000;
-const CAM_SOURCES = ['CAM', 'TeleSync', 'TeleCine', 'SCR'];
-
-export function toStreamInfo(record) {
- const torrentInfo = titleParser.parse(record.torrent.title);
- const fileInfo = titleParser.parse(record.title);
- const sameInfo = !Number.isInteger(record.fileIndex)
- || Math.abs(record.size / record.torrent.size - 1) < SIZE_DELTA
- || record.title.includes(record.torrent.title);
- const quality = getQuality(record, torrentInfo, fileInfo);
- const three3Quality = fileInfo.threeD || torrentInfo.threeD;
- const hdrProfiles = torrentInfo.hdr || fileInfo.hdr || [];
- const title = joinDetailParts(
- [
- joinDetailParts([record.torrent.title.replace(/[, ]+/g, ' ')]),
- joinDetailParts([!sameInfo && record.title || undefined]),
- joinDetailParts([
- joinDetailParts([record.torrent.seeders], '👤 '),
- joinDetailParts([formatSize(record.size)], '💾 '),
- joinDetailParts([record.torrent.provider], '⚙️ ')
- ]),
- joinDetailParts(getLanguages(record, torrentInfo, fileInfo), '', ' / '),
- ],
- '',
- '\n'
- );
- const name = joinDetailParts(
- [
- joinDetailParts([ADDON_NAME]),
- joinDetailParts([quality, three3Quality, joinDetailParts(hdrProfiles, '', ' | ')])
- ],
- '',
- '\n'
- );
- const bingeGroupParts = getBingeGroupParts(record, sameInfo, quality, torrentInfo, fileInfo);
- const bingeGroup = joinDetailParts(bingeGroupParts, "torrentio|", "|")
- const filename = Number.isInteger(record.fileIndex) ? record.title.split('/').pop() : undefined;
- const behaviorHints = bingeGroup || filename ? cleanOutputObject({ bingeGroup, filename }) : undefined;
-
- return cleanOutputObject({
- name: name,
- title: title,
- infoHash: record.infoHash,
- fileIdx: record.fileIndex,
- behaviorHints: behaviorHints,
- sources: getSources(record.torrent.trackers, record.infoHash),
- subtitles: getSubtitles(record)
- });
-}
-
-function getQuality(record, torrentInfo, fileInfo) {
- if (CAM_SOURCES.includes(fileInfo.source)) {
- return fileInfo.source;
- }
- if (CAM_SOURCES.includes(torrentInfo.source)) {
- return torrentInfo.source;
- }
- const resolution = fileInfo.resolution || torrentInfo.resolution || record.torrent.resolution;
- const source = fileInfo.source || torrentInfo.source;
- return resolution || source;
-}
-
-function getLanguages(record, torrentInfo, fileInfo) {
- const providerLanguages = record.torrent.languages && titleParser.parse(record.torrent.languages + '.srt').languages || [];
- const torrentLanguages = torrentInfo.languages || [];
- const fileLanguages = fileInfo.languages || [];
- const dubbed = torrentInfo.dubbed || fileInfo.dubbed;
- let languages = Array.from(new Set([].concat(torrentLanguages).concat(fileLanguages).concat(providerLanguages)));
- if (record.kitsuId || record.torrent.type === Type.ANIME) {
- // no need to display japanese for anime
- languages = languages.concat(dubbed ? ['dubbed'] : [])
- .filter(lang => lang !== 'japanese');
- }
- if (languages.length === 1 && languages.includes('english')) {
- // no need to display languages if only english is present
- languages = [];
- }
- if (languages.length === 0 && dubbed) {
- // display dubbed only if there are no other languages defined for non anime
- languages = ['dubbed'];
- }
- return mapLanguages(languages);
-}
-
-function joinDetailParts(parts, prefix = '', delimiter = ' ') {
- const filtered = parts.filter((part) => part !== undefined && part !== null).join(delimiter);
-
- return filtered.length > 0 ? `${prefix}${filtered}` : undefined;
-}
-
-function formatSize(size) {
- if (!size) {
- return undefined;
- }
- if (size === UNKNOWN_SIZE) {
- return undefined;
- }
- const i = size === 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024));
- return Number((size / Math.pow(1024, i)).toFixed(2)) + ' ' + ['B', 'kB', 'MB', 'GB', 'TB'][i];
-}
-
-export function applyStaticInfo(streams) {
- return streams.map(stream => enrichStaticInfo(stream));
-}
-
-function enrichStaticInfo(stream) {
- return enrichSubtitles(enrichStreamSources({ ...stream }));
-}
-
-function enrichSubtitles(stream) {
- if (stream.subtitles?.length) {
- stream.subtitles = stream.subtitles.map(subtitle =>{
- if (subtitle.url) {
- return subtitle;
- }
- return {
- id: `${subtitle.fileIndex}`,
- lang: subtitle.lang,
- url: `http://localhost:11470/${subtitle.infoHash}/${subtitle.fileIndex}/${subtitle.title.split('/').pop()}`
- };
- });
- }
- return stream;
-}
-
-function getBingeGroupParts(record, sameInfo, quality, torrentInfo, fileInfo) {
- if (record.torrent.type === Type.MOVIE) {
- const source = torrentInfo.source || fileInfo.source
- return [quality]
- .concat(source !== quality ? source : [])
- .concat(torrentInfo.codec || fileInfo.codec)
- .concat(torrentInfo.bitDepth || fileInfo.bitDepth)
- .concat(torrentInfo.hdr || fileInfo.hdr);
- } else if (sameInfo) {
- return [quality]
- .concat(fileInfo.hdr)
- .concat(fileInfo.group);
- }
- return [record.infoHash];
-}
-
-function cleanOutputObject(object) {
- return Object.fromEntries(Object.entries(object).filter(([_, v]) => v != null));
-}
diff --git a/addon/lib/subtitles.js b/addon/lib/subtitles.js
deleted file mode 100644
index 10be676..0000000
--- a/addon/lib/subtitles.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import { parse } from 'parse-torrent-title';
-import { isExtension } from './extension.js';
-import { Providers } from './filter.js';
-import { languageFromCode } from './languages.js';
-
-const languageMapping = {
- 'english': 'eng',
- 'japanese': 'jpn',
- 'russian': 'rus',
- 'italian': 'ita',
- 'portuguese': 'por',
- 'spanish': 'spa',
- 'latino': 'lat',
- 'korean': 'kor',
- 'chinese': 'zho',
- 'taiwanese': 'zht',
- 'french': 'fre',
- 'german': 'ger',
- 'dutch': 'dut',
- 'hindi': 'hin ',
- 'telugu': 'tel',
- 'tamil': 'tam',
- 'polish': 'pol',
- 'lithuanian': 'lit',
- 'latvian': 'lav',
- 'estonian': 'est',
- 'czech': 'cze',
- 'slovakian': 'slo',
- 'slovenian': 'slv',
- 'hungarian': 'hun',
- 'romanian': 'rum',
- 'bulgarian': 'bul',
- 'serbian': 'scc',
- 'croatian': 'hrv',
- 'ukrainian': 'ukr',
- 'greek': 'ell',
- 'danish': 'dan',
- 'finnish': 'fin',
- 'swedish': 'swe',
- 'norwegian': 'nor',
- 'turkish': 'tur',
- 'arabic': 'ara',
- 'persian': 'per',
- 'hebrew': 'heb',
- 'vietnamese': 'vie',
- 'indonesian': 'ind',
- 'thai': 'tha'
-}
-
-const ignoreSet = new Set(['dubbed', 'multi audio', 'multi subs', 'dual audio']);
-const allowedExtensions = ['srt', 'vtt', 'ass', 'ssa'];
-
-export function getSubtitles(record) {
- if (!record?.subtitles?.length) {
- return null;
- }
- return record.subtitles
- .filter(subtitle => isExtension(subtitle.title, allowedExtensions))
- .sort((a, b) => b.size - a.size)
- .map(subtitle => ({
- infoHash: subtitle.infoHash,
- fileIndex: subtitle.fileIndex,
- title: subtitle.title,
- lang: parseLanguage(subtitle.title, record),
- }));
-}
-
-function parseLanguage(title, record) {
- const subtitlePathParts = title.split('/');
- const subtitleFileName = subtitlePathParts.pop();
- const subtitleTitleNoExt = title.replace(/\.\w{2,5}$/, '');
- const videoFileName = record.title.split('/').pop().replace(/\.\w{2,5}$/, '');
- const fileNameLanguage = getSingleLanguage(subtitleFileName.replace(videoFileName, ''));
- if (fileNameLanguage) {
- return fileNameLanguage;
- }
- const videoTitleNoExt = record.title.replace(/\.\w{2,5}$/, '');
- if (subtitleTitleNoExt === record.title || subtitleTitleNoExt === videoTitleNoExt) {
- const provider = Providers.options.find(provider => provider.label === record.torrent.provider);
- return provider?.foreign && languageFromCode(provider.foreign) || 'eng';
- }
- const folderName = subtitlePathParts.join('/');
- const folderNameLanguage = getSingleLanguage(folderName.replace(videoFileName, ''));
- if (folderNameLanguage) {
- return folderNameLanguage
- }
- return getFileNameLanguageCode(subtitleFileName) || 'Unknown';
-}
-
-function getSingleLanguage(title) {
- const parsedInfo = parse(title);
- const languages = (parsedInfo.languages || []).filter(language => !ignoreSet.has(language));
- return languages.length === 1 ? languageMapping[languages[0]] : undefined;
-}
-
-function getFileNameLanguageCode(fileName) {
- const match = fileName.match(/(?:(?:^|[._ ])([A-Za-z][a-z]{1,2})|\[([a-z]{2,3})])\.\w{3,4}$/);
- return match?.[1]?.toLowerCase();
-}
diff --git a/addon/lib/titleHelper.js b/addon/lib/titleHelper.js
deleted file mode 100644
index 7cb62b9..0000000
--- a/addon/lib/titleHelper.js
+++ /dev/null
@@ -1,31 +0,0 @@
-export function extractSeeders(title) {
- const seedersMatch = title.match(/👤 (\d+)/);
- return seedersMatch && parseInt(seedersMatch[1]) || 0;
-}
-
-export function extractSize(title) {
- const seedersMatch = title.match(/💾 ([\d.]+ \w+)/);
- return seedersMatch && parseSize(seedersMatch[1]) || 0;
-}
-
-export function extractProvider(title) {
- const match = title.match(/⚙.* ([^ \n]+)/);
- return match?.[1];
-}
-
-export function parseSize(sizeText) {
- if (!sizeText) {
- return 0;
- }
- let scale = 1;
- if (sizeText.includes('TB')) {
- scale = 1024 * 1024 * 1024 * 1024
- } else if (sizeText.includes('GB')) {
- scale = 1024 * 1024 * 1024
- } else if (sizeText.includes('MB')) {
- scale = 1024 * 1024;
- } else if (sizeText.includes('kB')) {
- scale = 1024;
- }
- return Math.floor(parseFloat(sizeText.replace(/,/g, '')) * scale);
-}
diff --git a/addon/lib/types.js b/addon/lib/types.js
deleted file mode 100644
index 5d9b2ea..0000000
--- a/addon/lib/types.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export const Type = {
- MOVIE: 'movie',
- SERIES: 'series',
- ANIME: 'anime',
- OTHER: 'other'
-};
\ No newline at end of file
diff --git a/addon/moch/alldebrid.js b/addon/moch/alldebrid.js
deleted file mode 100644
index f58c146..0000000
--- a/addon/moch/alldebrid.js
+++ /dev/null
@@ -1,199 +0,0 @@
-import AllDebridClient from 'all-debrid-api';
-import { Type } from '../lib/types.js';
-import { isVideo, isArchive } from '../lib/extension.js';
-import StaticResponse from './static.js';
-import { getMagnetLink } from '../lib/magnetHelper.js';
-import { BadTokenError, AccessDeniedError, sameFilename, streamFilename, AccessBlockedError } from './mochHelper.js';
-
-const KEY = 'alldebrid';
-const AGENT = 'torrentio';
-
-export async function getCachedStreams(streams, apiKey, ip) {
- return streams
- .reduce((mochStreams, stream) => {
- const filename = streamFilename(stream);
- mochStreams[`${stream.infoHash}@${stream.fileIdx}`] = {
- url: `${apiKey}/${stream.infoHash}/${filename}/${stream.fileIdx}`,
- cached: false
- }
- return mochStreams;
- }, {})
-}
-
-export async function getCatalog(apiKey, catalogId, config) {
- if (config.skip > 0) {
- return [];
- }
- const options = await getDefaultOptions(config.ip);
- const AD = new AllDebridClient(apiKey, options);
- return AD.magnet.status()
- .then(response => response.data.magnets)
- .then(torrents => (torrents || [])
- .filter(torrent => torrent && statusReady(torrent.statusCode))
- .map(torrent => ({
- id: `${KEY}:${torrent.id}`,
- type: Type.OTHER,
- name: torrent.filename
- })));
-}
-
-export async function getItemMeta(itemId, apiKey, ip) {
- const options = await getDefaultOptions(ip);
- const AD = new AllDebridClient(apiKey, options);
- return AD.magnet.status(itemId)
- .then(response => response.data.magnets)
- .then(torrent => ({
- id: `${KEY}:${torrent.id}`,
- type: Type.OTHER,
- name: torrent.filename,
- infoHash: torrent.hash.toLowerCase(),
- videos: torrent.links
- .filter(file => isVideo(file.filename))
- .map((file, index) => ({
- id: `${KEY}:${torrent.id}:${index}`,
- title: file.filename,
- released: new Date(torrent.uploadDate * 1000 - index).toISOString(),
- streams: [{ url: `${apiKey}/${torrent.hash.toLowerCase()}/${encodeURIComponent(file.filename)}/${index}` }]
- }))
- }))
-}
-
-export async function resolve({ ip, apiKey, infoHash, cachedEntryInfo, fileIndex }) {
- console.log(`Unrestricting AllDebrid ${infoHash} [${fileIndex}]`);
- const options = await getDefaultOptions(ip);
- const AD = new AllDebridClient(apiKey, options);
-
- return _resolve(AD, infoHash, cachedEntryInfo, fileIndex)
- .catch(error => {
- if (isExpiredSubscriptionError(error)) {
- console.log(`Access denied to AllDebrid ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_ACCESS;
- }
- if (isBlockedAccessError(error)) {
- console.log(`Access blocked to AllDebrid ${infoHash} [${fileIndex}]`);
- return StaticResponse.BLOCKED_ACCESS;
- }
- if (error.code === 'MAGNET_TOO_MANY') {
- console.log(`Deleting and retrying adding to AllDebrid ${infoHash} [${fileIndex}]...`);
- return _deleteAndRetry(AD, infoHash, cachedEntryInfo, fileIndex);
- }
- return Promise.reject(`Failed AllDebrid adding torrent ${JSON.stringify(error)}`);
- });
-}
-
-async function _resolve(AD, infoHash, cachedEntryInfo, fileIndex) {
- const torrent = await _createOrFindTorrent(AD, infoHash);
- if (statusReady(torrent?.statusCode)) {
- return _unrestrictLink(AD, torrent, cachedEntryInfo, fileIndex);
- } else if (statusDownloading(torrent?.statusCode)) {
- console.log(`Downloading to AllDebrid ${infoHash} [${fileIndex}]...`);
- return StaticResponse.DOWNLOADING;
- } else if (statusHandledError(torrent?.statusCode)) {
- console.log(`Retrying downloading to AllDebrid ${infoHash} [${fileIndex}]...`);
- return _retryCreateTorrent(AD, infoHash, cachedEntryInfo, fileIndex);
- } else if (statusTooBigEntry(torrent?.statusCode)) {
- console.log(`Torrent too big for AllDebrid ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_TOO_BIG;
- }
-
- return Promise.reject(`Failed AllDebrid adding torrent ${JSON.stringify(torrent)}`);
-}
-
-async function _createOrFindTorrent(AD, infoHash) {
- return _findTorrent(AD, infoHash)
- .catch(() => _createTorrent(AD, infoHash));
-}
-
-async function _retryCreateTorrent(AD, infoHash, encodedFileName, fileIndex) {
- const newTorrent = await _createTorrent(AD, infoHash);
- return newTorrent && statusReady(newTorrent.statusCode)
- ? _unrestrictLink(AD, newTorrent, encodedFileName, fileIndex)
- : StaticResponse.FAILED_DOWNLOAD;
-}
-
-async function _deleteAndRetry(AD, infoHash, encodedFileName, fileIndex) {
- const torrents = await AD.magnet.status().then(response => response.data.magnets);
- const lastTorrent = torrents[torrents.length - 1];
- return AD.magnet.delete(lastTorrent.id)
- .then(() => _retryCreateTorrent(AD, infoHash, encodedFileName, fileIndex));
-}
-
-async function _findTorrent(AD, infoHash) {
- const torrents = await AD.magnet.status().then(response => response.data.magnets);
- const foundTorrents = torrents.filter(torrent => torrent.hash.toLowerCase() === infoHash);
- const nonFailedTorrent = foundTorrents.find(torrent => !statusError(torrent.statusCode));
- const foundTorrent = nonFailedTorrent || foundTorrents[0];
- return foundTorrent || Promise.reject('No recent torrent found');
-}
-
-async function _createTorrent(AD, infoHash) {
- const magnetLink = await getMagnetLink(infoHash);
- const uploadResponse = await AD.magnet.upload(magnetLink);
- const torrentId = uploadResponse.data.magnets[0].id;
- return AD.magnet.status(torrentId).then(statusResponse => statusResponse.data.magnets);
-}
-
-async function _unrestrictLink(AD, torrent, encodedFileName, fileIndex) {
- const targetFileName = decodeURIComponent(encodedFileName);
- const videos = torrent.links.filter(link => isVideo(link.filename)).sort((a, b) => b.size - a.size);
- const targetVideo = Number.isInteger(fileIndex)
- && videos.find(video => sameFilename(targetFileName, video.filename))
- || videos[0];
-
- if (!targetVideo && torrent.links.every(link => isArchive(link.filename))) {
- console.log(`Only AllDebrid archive is available for [${torrent.hash}] ${encodedFileName}`)
- return StaticResponse.FAILED_RAR;
- }
- if (!targetVideo || !targetVideo.link || !targetVideo.link.length) {
- return Promise.reject(`No AllDebrid links found for [${torrent.hash}] ${encodedFileName}`);
- }
- const unrestrictedLink = await AD.link.unlock(targetVideo.link).then(response => response.data.link);
- console.log(`Unrestricted AllDebrid ${torrent.hash} [${fileIndex}] to ${unrestrictedLink}`);
- return unrestrictedLink;
-}
-
-async function getDefaultOptions(ip) {
- return { ip, base_agent: AGENT, timeout: 10000 };
-}
-
-export function toCommonError(error) {
- if (error && error.code === 'AUTH_BAD_APIKEY') {
- return BadTokenError;
- }
- if (error && error.code === 'AUTH_USER_BANNED') {
- return AccessDeniedError;
- }
- if (error && error.code === 'AUTH_BLOCKED') {
- return AccessBlockedError;
- }
- return undefined;
-}
-
-function statusError(statusCode) {
- return [5, 6, 7, 8, 9, 10, 11].includes(statusCode);
-}
-
-function statusHandledError(statusCode) {
- return [5, 7, 9, 10, 11].includes(statusCode);
-}
-
-function statusDownloading(statusCode) {
- return [0, 1, 2, 3].includes(statusCode);
-}
-
-function statusReady(statusCode) {
- return statusCode === 4;
-}
-
-function statusTooBigEntry(statusCode) {
- return statusCode === 8;
-}
-
-function isExpiredSubscriptionError(error) {
- return ['AUTH_BAD_APIKEY', 'MUST_BE_PREMIUM', 'MAGNET_MUST_BE_PREMIUM', 'FREE_TRIAL_LIMIT_REACHED', 'AUTH_USER_BANNED']
- .includes(error.code);
-}
-
-function isBlockedAccessError(error) {
- return ['AUTH_BLOCKED'].includes(error.code);
-}
diff --git a/addon/moch/debridlink.js b/addon/moch/debridlink.js
deleted file mode 100644
index e0d214e..0000000
--- a/addon/moch/debridlink.js
+++ /dev/null
@@ -1,156 +0,0 @@
-import DebridLinkClient from 'debrid-link-api';
-import { Type } from '../lib/types.js';
-import { isVideo, isArchive } from '../lib/extension.js';
-import StaticResponse from './static.js';
-import { getMagnetLink } from '../lib/magnetHelper.js';
-import { BadTokenError } from './mochHelper.js';
-
-const KEY = 'debridlink';
-
-export async function getCachedStreams(streams, apiKey) {
- return streams
- .reduce((mochStreams, stream) => {
- mochStreams[`${stream.infoHash}@${stream.fileIdx}`] = {
- url: `${apiKey}/${stream.infoHash}/null/${stream.fileIdx}`,
- cached: false
- };
- return mochStreams;
- }, {})
-}
-
-export async function getCatalog(apiKey, catalogId, config) {
- if (config.skip > 0) {
- return [];
- }
- const options = await getDefaultOptions();
- const DL = new DebridLinkClient(apiKey, options);
- return DL.seedbox.list()
- .then(response => response.value)
- .then(torrents => (torrents || [])
- .filter(torrent => torrent && statusReady(torrent))
- .map(torrent => ({
- id: `${KEY}:${torrent.id}`,
- type: Type.OTHER,
- name: torrent.name
- })));
-}
-
-export async function getItemMeta(itemId, apiKey, ip) {
- const options = await getDefaultOptions(ip);
- const DL = new DebridLinkClient(apiKey, options);
- return DL.seedbox.list(itemId)
- .then(response => response.value[0])
- .then(torrent => ({
- id: `${KEY}:${torrent.id}`,
- type: Type.OTHER,
- name: torrent.name,
- infoHash: torrent.hashString.toLowerCase(),
- videos: torrent.files
- .filter(file => isVideo(file.name))
- .map((file, index) => ({
- id: `${KEY}:${torrent.id}:${index}`,
- title: file.name,
- released: new Date(torrent.created * 1000 - index).toISOString(),
- streams: [{ url: file.downloadUrl }]
- }))
- }))
-}
-
-export async function resolve({ ip, apiKey, infoHash, fileIndex }) {
- console.log(`Unrestricting DebridLink ${infoHash} [${fileIndex}]`);
- const options = await getDefaultOptions(ip);
- const DL = new DebridLinkClient(apiKey, options);
-
- return _resolve(DL, infoHash, fileIndex)
- .catch(error => {
- if (isAccessDeniedError(error)) {
- console.log(`Access denied to DebridLink ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_ACCESS;
- }
- if (isLimitsExceededError(error)) {
- console.log(`Limits exceeded in DebridLink ${infoHash} [${fileIndex}]`);
- return StaticResponse.LIMITS_EXCEEDED;
- }
- if (isTorrentTooBigError(error)) {
- console.log(`Torrent too big for DebridLink ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_TOO_BIG;
- }
- return Promise.reject(`Failed DebridLink adding torrent ${JSON.stringify(error)}`);
- });
-}
-
-async function _resolve(DL, infoHash, fileIndex) {
- const torrent = await _createOrFindTorrent(DL, infoHash);
- if (torrent && statusReady(torrent)) {
- return _unrestrictLink(DL, torrent, fileIndex);
- } else if (torrent && statusDownloading(torrent)) {
- console.log(`Downloading to DebridLink ${infoHash} [${fileIndex}]...`);
- return StaticResponse.DOWNLOADING;
- }
-
- return Promise.reject(`Failed DebridLink adding torrent ${JSON.stringify(torrent)}`);
-}
-
-async function _createOrFindTorrent(DL, infoHash) {
- return _findTorrent(DL, infoHash)
- .catch(() => _createTorrent(DL, infoHash));
-}
-
-async function _findTorrent(DL, infoHash) {
- const torrents = await DL.seedbox.list().then(response => response.value);
- const foundTorrents = torrents.filter(torrent => torrent.hashString.toLowerCase() === infoHash);
- return foundTorrents[0] || Promise.reject('No recent torrent found');
-}
-
-async function _createTorrent(DL, infoHash) {
- const magnetLink = await getMagnetLink(infoHash);
- const uploadResponse = await DL.seedbox.add(magnetLink, null, true);
- return uploadResponse.value;
-}
-
-async function _unrestrictLink(DL, torrent, fileIndex) {
- const targetFile = Number.isInteger(fileIndex)
- ? torrent.files[fileIndex]
- : torrent.files.filter(file => file.downloadPercent === 100).sort((a, b) => b.size - a.size)[0];
-
- if (!targetFile && torrent.files.every(file => isArchive(file.downloadUrl))) {
- console.log(`Only DebridLink archive is available for [${torrent.hashString}] ${fileIndex}`)
- return StaticResponse.FAILED_RAR;
- }
- if (!targetFile || !targetFile.downloadUrl) {
- return Promise.reject(`No DebridLink links found for index ${fileIndex} in: ${JSON.stringify(torrent)}`);
- }
- console.log(`Unrestricted DebridLink ${torrent.hashString} [${fileIndex}] to ${targetFile.downloadUrl}`);
- return targetFile.downloadUrl;
-}
-
-async function getDefaultOptions(ip) {
- return { ip, timeout: 10000 };
-}
-
-export function toCommonError(error) {
- if (error === 'badToken') {
- return BadTokenError;
- }
- return undefined;
-}
-
-function statusDownloading(torrent) {
- return torrent.downloadPercent < 100
-}
-
-function statusReady(torrent) {
- return torrent.downloadPercent === 100;
-}
-
-function isAccessDeniedError(error) {
- return ['badToken', 'accountLocked'].includes(error);
-}
-
-function isLimitsExceededError(error) {
- return ['freeServerOverload', 'maxTorrent', 'maxLink', 'maxLinkHost', 'maxData', 'maxDataHost', 'floodDetected'].includes(error);
-}
-
-function isTorrentTooBigError(error) {
- return ['torrentTooBig'].includes(error);
-}
diff --git a/addon/moch/moch.js b/addon/moch/moch.js
deleted file mode 100644
index f826843..0000000
--- a/addon/moch/moch.js
+++ /dev/null
@@ -1,249 +0,0 @@
-import * as options from './options.js';
-import * as realdebrid from './realdebrid.js';
-import * as premiumize from './premiumize.js';
-import * as alldebrid from './alldebrid.js';
-import * as debridlink from './debridlink.js';
-import * as offcloud from './offcloud.js';
-import * as torbox from './torbox.js';
-import * as putio from './putio.js';
-import StaticResponse, { isStaticUrl } from './static.js';
-import { cacheWrapResolvedUrl } from '../lib/cache.js';
-import { timeout } from '../lib/promises.js';
-import { BadTokenError, streamFilename, AccessDeniedError, enrichMeta, AccessBlockedError } from './mochHelper.js';
-import { createNamedQueue } from "../lib/namedQueue.js";
-
-const RESOLVE_TIMEOUT = 2 * 60 * 1000; // 2 minutes
-const MIN_API_KEY_SYMBOLS = 15;
-const TOKEN_BLACKLIST = [];
-export const MochOptions = {
- realdebrid: {
- key: 'realdebrid',
- instance: realdebrid,
- name: "RealDebrid",
- shortName: 'RD',
- catalogs: ['']
- },
- premiumize: {
- key: 'premiumize',
- instance: premiumize,
- name: 'Premiumize',
- shortName: 'PM',
- catalogs: ['']
- },
- alldebrid: {
- key: 'alldebrid',
- instance: alldebrid,
- name: 'AllDebrid',
- shortName: 'AD',
- catalogs: ['']
- },
- debridlink: {
- key: 'debridlink',
- instance: debridlink,
- name: 'DebridLink',
- shortName: 'DL',
- catalogs: ['']
- },
- offcloud: {
- key: 'offcloud',
- instance: offcloud,
- name: 'Offcloud',
- shortName: 'OC',
- catalogs: ['']
- },
- torbox: {
- key: 'torbox',
- instance: torbox,
- name: 'TorBox',
- shortName: 'TB',
- catalogs: [`Torrents`, `Usenet`, `WebDL`]
- },
- putio: {
- key: 'putio',
- instance: putio,
- name: 'Put.io',
- shortName: 'Putio',
- catalogs: ['']
- }
-};
-
-const unrestrictQueues = {}
-Object.values(MochOptions)
- .map(moch => moch.key)
- .forEach(mochKey => unrestrictQueues[mochKey] = createNamedQueue(50));
-
-export function hasMochConfigured(config) {
- return Object.keys(MochOptions).find(moch => config?.[moch])
-}
-
-export async function applyMochs(streams, config) {
- if (!streams?.length || !hasMochConfigured(config)) {
- return streams;
- }
- return Promise.all(Object.keys(config)
- .filter(configKey => MochOptions[configKey])
- .map(configKey => MochOptions[configKey])
- .map(moch => {
- if (isInvalidToken(config[moch.key], moch.key)) {
- return { moch, error: BadTokenError };
- }
- return moch.instance.getCachedStreams(streams, config[moch.key], config.ip)
- .then(mochStreams => ({ moch, mochStreams }))
- .catch(rawError => {
- const error = moch.instance.toCommonError(rawError) || rawError;
- if (error === BadTokenError) {
- blackListToken(config[moch.key], moch.key);
- }
- return { moch, error };
- })
- }))
- .then(results => processMochResults(streams, config, results));
-}
-
-export async function resolve(parameters) {
- const moch = MochOptions[parameters.mochKey];
- if (!moch) {
- return Promise.reject(new Error(`Not a valid moch provider: ${parameters.mochKey}`));
- }
-
- if (!parameters.apiKey || !parameters.infoHash || !parameters.cachedEntryInfo) {
- return Promise.reject(new Error("No valid parameters passed"));
- }
- const id = `${parameters.ip}_${parameters.mochKey}_${parameters.apiKey}_${parameters.infoHash}_${parameters.fileIndex}`;
- const method = () => timeout(RESOLVE_TIMEOUT, cacheWrapResolvedUrl(id, () => moch.instance.resolve(parameters)))
- .catch(error => {
- console.warn(error);
- return StaticResponse.FAILED_UNEXPECTED;
- })
- .then(url => isStaticUrl(url) ? `${parameters.host}/${url}` : url);
- return unrestrictQueues[moch.key].wrap(id, method);
-}
-
-export async function getMochCatalog(mochKey, catalogId, config, ) {
- const moch = MochOptions[mochKey];
- if (!moch) {
- return Promise.reject(new Error(`Not a valid moch provider: ${mochKey}`));
- }
- if (isInvalidToken(config[mochKey], mochKey)) {
- return Promise.reject(new Error(`Invalid API key for moch provider: ${mochKey}`));
- }
- return moch.instance.getCatalog(config[moch.key], catalogId, config)
- .catch(rawError => {
- const commonError = moch.instance.toCommonError(rawError);
- if (commonError === BadTokenError) {
- blackListToken(config[moch.key], moch.key);
- }
- return commonError ? [] : Promise.reject(rawError);
- });
-}
-
-export async function getMochItemMeta(mochKey, itemId, config) {
- const moch = MochOptions[mochKey];
- if (!moch) {
- return Promise.reject(new Error(`Not a valid moch provider: ${mochKey}`));
- }
-
- return moch.instance.getItemMeta(itemId, config[moch.key], config.ip)
- .then(meta => enrichMeta(meta))
- .then(meta => {
- meta.videos.forEach(video => video.streams.forEach(stream => {
- if (!stream.url.startsWith('http')) {
- stream.url = `${config.host}/${moch.key}/${stream.url}/${streamFilename(video)}`
- }
- stream.behaviorHints = { bingeGroup: itemId }
- }))
- return meta;
- });
-}
-
-function processMochResults(streams, config, results) {
- const errorResults = results
- .map(result => errorStreamResponse(result.moch.key, result.error, config))
- .filter(errorResponse => errorResponse);
- if (errorResults.length) {
- return errorResults;
- }
-
- const excludeDownloadLinks = options.excludeDownloadLinks(config);
- const mochResults = results.filter(result => result?.mochStreams);
-
- const cachedStreams = mochResults
- .reduce((resultStreams, mochResult) => populateCachedLinks(resultStreams, mochResult, config), streams);
- const resultStreams = excludeDownloadLinks ? cachedStreams : populateDownloadLinks(cachedStreams, mochResults, config);
- return resultStreams.filter(stream => stream.url);
-}
-
-function populateCachedLinks(streams, mochResult, config) {
- return streams.map(stream => {
- const cachedEntry = stream.infoHash && mochResult.mochStreams[`${stream.infoHash}@${stream.fileIdx}`];
- if (cachedEntry?.cached) {
- return {
- name: `[${mochResult.moch.shortName}+] ${stream.name}`,
- title: stream.title,
- url: `${config.host}/${mochResult.moch.key}/${cachedEntry.url}/${streamFilename(stream)}`,
- behaviorHints: stream.behaviorHints
- };
- }
- return stream;
- });
-}
-
-function populateDownloadLinks(streams, mochResults, config) {
- const torrentStreams = streams.filter(stream => stream.infoHash);
- const seededStreams = streams.filter(stream => !stream.title.includes('👤 0'));
- torrentStreams.forEach(stream => mochResults.forEach(mochResult => {
- const cachedEntry = mochResult.mochStreams[`${stream.infoHash}@${stream.fileIdx}`];
- const isCached = cachedEntry?.cached;
- if (!isCached && isHealthyStreamForDebrid(seededStreams, stream)) {
- streams.push({
- name: `[${mochResult.moch.shortName} download] ${stream.name}`,
- title: stream.title,
- url: `${config.host}/${mochResult.moch.key}/${cachedEntry.url}/${streamFilename(stream)}`,
- behaviorHints: stream.behaviorHints
- })
- }
- }));
- return streams;
-}
-
-function isHealthyStreamForDebrid(streams, stream) {
- const isZeroSeeders = stream.title.includes('👤 0');
- const is4kStream = stream.name.includes('4k');
- const isNotEnoughOptions = streams.length <= 5;
- return !isZeroSeeders || is4kStream || isNotEnoughOptions;
-}
-
-function isInvalidToken(token, mochKey) {
- return token.length < MIN_API_KEY_SYMBOLS || TOKEN_BLACKLIST.includes(`${mochKey}|${token}`);
-}
-
-function blackListToken(token, mochKey) {
- const tokenKey = `${mochKey}|${token}`;
- console.log(`Blacklisting invalid token: ${tokenKey}`)
- TOKEN_BLACKLIST.push(tokenKey);
-}
-
-function errorStreamResponse(mochKey, error, config) {
- if (error === BadTokenError) {
- return {
- name: `Torrentio\n${MochOptions[mochKey].shortName} error`,
- title: `Invalid ${MochOptions[mochKey].name} ApiKey/Token!`,
- url: `${config.host}/${StaticResponse.FAILED_ACCESS}`
- };
- }
- if (error === AccessDeniedError) {
- return {
- name: `Torrentio\n${MochOptions[mochKey].shortName} error`,
- title: `Expired/invalid ${MochOptions[mochKey].name} subscription!`,
- url: `${config.host}/${StaticResponse.FAILED_ACCESS}`
- };
- }
- if (error === AccessBlockedError) {
- return {
- name: `Torrentio\n${MochOptions[mochKey].shortName} error`,
- title: `Access to ${MochOptions[mochKey].name} is blocked!\nCheck your account or email.`,
- url: `${config.host}/${StaticResponse.FAILED_ACCESS}`
- };
- }
- return undefined;
-}
diff --git a/addon/moch/mochHelper.js b/addon/moch/mochHelper.js
deleted file mode 100644
index 3d86766..0000000
--- a/addon/moch/mochHelper.js
+++ /dev/null
@@ -1,64 +0,0 @@
-import * as repository from '../lib/repository.js';
-
-const METAHUB_URL = 'https://images.metahub.space'
-export const BadTokenError = { code: 'BAD_TOKEN' }
-export const AccessDeniedError = { code: 'ACCESS_DENIED' }
-export const AccessBlockedError = { code: 'ACCESS_BLOCKED' }
-
-export function chunkArray(arr, size) {
- return arr.length > size
- ? [arr.slice(0, size), ...chunkArray(arr.slice(size), size)]
- : [arr];
-}
-
-export function streamFilename(stream) {
- const filename = stream?.behaviorHints?.filename
- || stream.title.replace(/\n👤.*/s, '').split('\n').pop().split('/').pop();
- return encodeURIComponent(filename)
-}
-
-export async function enrichMeta(itemMeta) {
- const infoHashes = [...new Set([itemMeta.infoHash]
- .concat(itemMeta.videos.map(video => video.infoHash))
- .filter(infoHash => infoHash))];
- const files = infoHashes.length ? await repository.getFiles(infoHashes).catch(() => []) : [];
- const commonImdbId = itemMeta.infoHash && mostCommonValue(files.map(file => file.imdbId));
- if (files.length) {
- return {
- ...itemMeta,
- logo: commonImdbId && `${METAHUB_URL}/logo/medium/${commonImdbId}/img`,
- poster: commonImdbId && `${METAHUB_URL}/poster/medium/${commonImdbId}/img`,
- background: commonImdbId && `${METAHUB_URL}/background/medium/${commonImdbId}/img`,
- videos: itemMeta.videos.map(video => {
- const file = files.find(file => sameFilename(video.title, file.title));
- if (file?.imdbId) {
- if (file.imdbSeason && file.imdbEpisode) {
- video.id = `${file.imdbId}:${file.imdbSeason}:${file.imdbEpisode}`;
- video.season = file.imdbSeason;
- video.episode = file.imdbEpisode;
- video.thumbnail = `https://episodes.metahub.space/${file.imdbId}/${video.season}/${video.episode}/w780.jpg`
- } else {
- video.id = file.imdbId;
- video.thumbnail = `${METAHUB_URL}/background/small/${file.imdbId}/img`;
- }
- }
- return video;
- })
- }
- }
- return itemMeta
-}
-
-export function sameFilename(filename, expectedFilename) {
- const offset = filename.length - expectedFilename.length;
- for (let i = 0; i < expectedFilename.length; i++) {
- if (filename[offset + i] !== expectedFilename[i] && expectedFilename[i] !== '�') {
- return false;
- }
- }
- return true;
-}
-
-function mostCommonValue(array) {
- return array.sort((a, b) => array.filter(v => v === a).length - array.filter(v => v === b).length).pop();
-}
diff --git a/addon/moch/offcloud.js b/addon/moch/offcloud.js
deleted file mode 100644
index f928d71..0000000
--- a/addon/moch/offcloud.js
+++ /dev/null
@@ -1,184 +0,0 @@
-import OffcloudClient from 'offcloud-api';
-import magnet from 'magnet-uri';
-import { Type } from '../lib/types.js';
-import { isVideo } from '../lib/extension.js';
-import StaticResponse from './static.js';
-import { getMagnetLink } from '../lib/magnetHelper.js';
-import { chunkArray, BadTokenError, sameFilename, streamFilename } from './mochHelper.js';
-
-const KEY = 'offcloud';
-
-export async function getCachedStreams(streams, apiKey) {
- const options = await getDefaultOptions();
- const OC = new OffcloudClient(apiKey, options);
- const hashBatches = chunkArray(streams.map(stream => stream.infoHash), 100);
- const available = await Promise.all(hashBatches.map(hashes => OC.instant.cache(hashes)))
- .then(results => results.map(result => result.cachedItems))
- .then(results => results.reduce((all, result) => all.concat(result), []))
- .catch(error => {
- if (toCommonError(error)) {
- return Promise.reject(error);
- }
- console.warn('Failed Offcloud cached torrent availability request:', error);
- return undefined;
- });
- return available && streams
- .reduce((mochStreams, stream) => {
- const isCached = available.includes(stream.infoHash);
- const fileName = streamFilename(stream);
- mochStreams[`${stream.infoHash}@${stream.fileIdx}`] = {
- url: `${apiKey}/${stream.infoHash}/${fileName}/${stream.fileIdx}`,
- cached: isCached
- };
- return mochStreams;
- }, {})
-}
-
-export async function getCatalog(apiKey, catalogId, config) {
- if (config.skip > 0) {
- return [];
- }
- const options = await getDefaultOptions();
- const OC = new OffcloudClient(apiKey, options);
- return OC.cloud.history()
- .then(torrents => torrents)
- .then(torrents => (torrents || [])
- .map(torrent => ({
- id: `${KEY}:${torrent.requestId}`,
- type: Type.OTHER,
- name: torrent.fileName
- })));
-}
-
-export async function getItemMeta(itemId, apiKey, ip) {
- const options = await getDefaultOptions(ip);
- const OC = new OffcloudClient(apiKey, options);
- const torrents = await OC.cloud.history();
- const torrent = torrents.find(torrent => torrent.requestId === itemId)
- const infoHash = torrent && magnet.decode(torrent.originalLink).infoHash
- const createDate = torrent ? new Date(torrent.createdOn) : new Date();
- return _getFileUrls(OC, torrent)
- .then(files => ({
- id: `${KEY}:${itemId}`,
- type: Type.OTHER,
- name: torrent.name,
- infoHash: infoHash,
- videos: files
- .filter(file => isVideo(file))
- .map((file, index) => ({
- id: `${KEY}:${itemId}:${index}`,
- title: file.split('/').pop(),
- released: new Date(createDate.getTime() - index).toISOString(),
- streams: [{ url: file }]
- }))
- }))
-}
-
-export async function resolve({ ip, apiKey, infoHash, cachedEntryInfo, fileIndex }) {
- console.log(`Unrestricting Offcloud ${infoHash} [${fileIndex}]`);
- const options = await getDefaultOptions(ip);
- const OC = new OffcloudClient(apiKey, options);
-
- return _resolve(OC, infoHash, cachedEntryInfo, fileIndex)
- .catch(error => {
- if (errorExpiredSubscriptionError(error)) {
- console.log(`Access denied to Offcloud ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_ACCESS;
- }
- return Promise.reject(`Failed Offcloud adding torrent ${JSON.stringify(error)}`);
- });
-}
-
-async function _resolve(OC, infoHash, cachedEntryInfo, fileIndex) {
- const torrent = await _createOrFindTorrent(OC, infoHash)
- .then(info => info.requestId ? OC.cloud.status(info.requestId) : Promise.resolve(info))
- .then(info => info.status || info);
- if (torrent && statusReady(torrent)) {
- return _unrestrictLink(OC, infoHash, torrent, cachedEntryInfo, fileIndex);
- } else if (torrent && statusDownloading(torrent)) {
- console.log(`Downloading to Offcloud ${infoHash} [${fileIndex}]...`);
- return StaticResponse.DOWNLOADING;
- } else if (torrent && statusError(torrent)) {
- console.log(`Retry failed download in Offcloud ${infoHash} [${fileIndex}]...`);
- return _retryCreateTorrent(OC, infoHash, cachedEntryInfo, fileIndex);
- }
-
- return Promise.reject(`Failed Offcloud adding torrent ${JSON.stringify(torrent)}`);
-}
-
-async function _createOrFindTorrent(OC, infoHash) {
- return _findTorrent(OC, infoHash)
- .catch(() => _createTorrent(OC, infoHash));
-}
-
-async function _findTorrent(OC, infoHash) {
- const torrents = await OC.cloud.history();
- const foundTorrents = torrents.filter(torrent => torrent.originalLink.toLowerCase().includes(infoHash));
- const nonFailedTorrent = foundTorrents.find(torrent => !statusError(torrent));
- const foundTorrent = nonFailedTorrent || foundTorrents[0];
- return foundTorrent || Promise.reject('No recent torrent found');
-}
-
-async function _createTorrent(OC, infoHash) {
- const magnetLink = await getMagnetLink(infoHash);
- return OC.cloud.download(magnetLink)
-}
-
-async function _retryCreateTorrent(OC, infoHash, cachedEntryInfo, fileIndex) {
- const newTorrent = await _createTorrent(OC, infoHash);
- return newTorrent && statusReady(newTorrent.status)
- ? _unrestrictLink(OC, infoHash, newTorrent, cachedEntryInfo, fileIndex)
- : StaticResponse.FAILED_DOWNLOAD;
-}
-
-async function _unrestrictLink(OC, infoHash, torrent, cachedEntryInfo, fileIndex) {
- const targetFileName = decodeURIComponent(cachedEntryInfo);
- const files = await _getFileUrls(OC, torrent)
- const targetFile = files.find(file => sameFilename(targetFileName, file.split('/').pop()))
- || files.find(file => file.includes(`/${torrent.requestId}/${fileIndex + 1}/`) && isVideo(file))
- || files.find(file => isVideo(file))
- || files.pop();
-
- if (!targetFile) {
- return Promise.reject(`No Offcloud links found for index ${fileIndex} in: ${JSON.stringify(torrent)}`);
- }
- console.log(`Unrestricted Offcloud ${infoHash} [${fileIndex}] to ${targetFile}`);
- return targetFile;
-}
-
-async function _getFileUrls(OC, torrent) {
- return OC.cloud.explore(torrent.requestId)
- .catch(error => {
- if (error === 'Bad archive') {
- return [`https://${torrent.server}.offcloud.com/cloud/download/${torrent.requestId}/${torrent.fileName}`];
- }
- throw error;
- })
-}
-
-async function getDefaultOptions(ip) {
- return { ip, timeout: 10000 };
-}
-
-export function toCommonError(error) {
- if (error?.error === 'NOAUTH' || error?.message?.startsWith('Cannot read property')) {
- return BadTokenError;
- }
- return undefined;
-}
-
-function statusDownloading(torrent) {
- return ['downloading', 'created', 'queued'].includes(torrent.status);
-}
-
-function statusError(torrent) {
- return ['error', 'canceled'].includes(torrent.status);
-}
-
-function statusReady(torrent) {
- return torrent.status === 'downloaded';
-}
-
-function errorExpiredSubscriptionError(error) {
- return error?.includes && (error.includes('not_available') || error.includes('NOAUTH') || error.includes('premium membership'));
-}
diff --git a/addon/moch/options.js b/addon/moch/options.js
deleted file mode 100644
index 31567bf..0000000
--- a/addon/moch/options.js
+++ /dev/null
@@ -1,21 +0,0 @@
-export const DebridOptions = {
- key: 'debridoptions',
- options: {
- noDownloadLinks: {
- key: 'nodownloadlinks',
- description: 'Don\'t show download to debrid links'
- },
- noCatalog: {
- key: 'nocatalog',
- description: 'Don\'t show debrid catalog'
- },
- }
-}
-
-export function excludeDownloadLinks(config) {
- return config[DebridOptions.key]?.includes(DebridOptions.options.noDownloadLinks.key);
-}
-
-export function showDebridCatalog(config) {
- return !config[DebridOptions.key]?.includes(DebridOptions.options.noCatalog.key);
-}
diff --git a/addon/moch/premiumize.js b/addon/moch/premiumize.js
deleted file mode 100644
index 943c784..0000000
--- a/addon/moch/premiumize.js
+++ /dev/null
@@ -1,208 +0,0 @@
-import PremiumizeClient from 'premiumize-api';
-import magnet from 'magnet-uri';
-import { Type } from '../lib/types.js';
-import { isVideo, isArchive } from '../lib/extension.js';
-import StaticResponse from './static.js';
-import { getMagnetLink } from '../lib/magnetHelper.js';
-import { BadTokenError, chunkArray, sameFilename, streamFilename } from './mochHelper.js';
-
-const KEY = 'premiumize';
-
-export async function getCachedStreams(streams, apiKey) {
- const options = await getDefaultOptions();
- const PM = new PremiumizeClient(apiKey, options);
- return Promise.all(chunkArray(streams, 100)
- .map(chunkedStreams => _getCachedStreams(PM, apiKey, chunkedStreams)))
- .then(results => results.reduce((all, result) => Object.assign(all, result), {}));
-}
-
-async function _getCachedStreams(PM, apiKey, streams) {
- const hashes = streams.map(stream => stream.infoHash);
- return PM.cache.check(hashes)
- .catch(error => {
- if (toCommonError(error)) {
- return Promise.reject(error);
- }
- console.warn('Failed Premiumize cached torrent availability request:', error);
- return undefined;
- })
- .then(available => streams
- .reduce((mochStreams, stream, index) => {
- const filename = streamFilename(stream);
- mochStreams[`${stream.infoHash}@${stream.fileIdx}`] = {
- url: `${apiKey}/${stream.infoHash}/${filename}/${stream.fileIdx}`,
- cached: available?.response[index]
- };
- return mochStreams;
- }, {}));
-}
-
-export async function getCatalog(apiKey, catalogId, config) {
- if (config.skip > 0) {
- return [];
- }
- const options = await getDefaultOptions();
- const PM = new PremiumizeClient(apiKey, options);
- return PM.folder.list()
- .then(response => response.content)
- .then(torrents => (torrents || [])
- .filter(torrent => torrent && torrent.type === 'folder')
- .map(torrent => ({
- id: `${KEY}:${torrent.id}`,
- type: Type.OTHER,
- name: torrent.name
- })));
-}
-
-export async function getItemMeta(itemId, apiKey, ip) {
- const options = await getDefaultOptions();
- const PM = new PremiumizeClient(apiKey, options);
- const rootFolder = await PM.folder.list(itemId, null);
- const infoHash = await _findInfoHash(PM, itemId);
- return getFolderContents(PM, itemId, ip)
- .then(contents => ({
- id: `${KEY}:${itemId}`,
- type: Type.OTHER,
- name: rootFolder.name,
- infoHash: infoHash,
- videos: contents
- .map((file, index) => ({
- id: `${KEY}:${file.id}:${index}`,
- title: file.name,
- released: new Date(file.created_at * 1000 - index).toISOString(),
- streams: [{ url: file.link || file.stream_link }]
- }))
- }))
-}
-
-async function getFolderContents(PM, itemId, ip, folderPrefix = '') {
- return PM.folder.list(itemId, null, ip)
- .then(response => response.content)
- .then(contents => Promise.all(contents
- .filter(content => content.type === 'folder')
- .map(content => getFolderContents(PM, content.id, ip, [folderPrefix, content.name].join('/'))))
- .then(otherContents => otherContents.reduce((a, b) => a.concat(b), []))
- .then(otherContents => contents
- .filter(content => content.type === 'file' && isVideo(content.name))
- .map(content => ({ ...content, name: [folderPrefix, content.name].join('/') }))
- .concat(otherContents)));
-}
-
-export async function resolve({ ip, isBrowser, apiKey, infoHash, cachedEntryInfo, fileIndex }) {
- console.log(`Unrestricting Premiumize ${infoHash} [${fileIndex}] for IP ${ip} from browser=${isBrowser}`);
- const options = await getDefaultOptions();
- const PM = new PremiumizeClient(apiKey, options);
- return _getCachedLink(PM, infoHash, cachedEntryInfo, fileIndex, ip, isBrowser)
- .catch(() => _resolve(PM, infoHash, cachedEntryInfo, fileIndex, ip, isBrowser))
- .catch(error => {
- if (isAccessDeniedError(error)) {
- console.log(`Access denied to Premiumize ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_ACCESS;
- }
- if (isLimitExceededError(error)) {
- console.log(`Limits exceeded in Premiumize ${infoHash} [${fileIndex}]`);
- return StaticResponse.LIMITS_EXCEEDED;
- }
- return Promise.reject(`Failed Premiumize adding torrent ${JSON.stringify(error)}`);
- });
-}
-
-async function _resolve(PM, infoHash, cachedEntryInfo, fileIndex, ip, isBrowser) {
- const torrent = await _createOrFindTorrent(PM, infoHash);
- if (torrent && statusReady(torrent.status)) {
- return _getCachedLink(PM, infoHash, cachedEntryInfo, fileIndex, ip, isBrowser);
- } else if (torrent && statusDownloading(torrent.status)) {
- console.log(`Downloading to Premiumize ${infoHash} [${fileIndex}]...`);
- return StaticResponse.DOWNLOADING;
- } else if (torrent && statusError(torrent.status)) {
- console.log(`Retrying downloading to Premiumize ${infoHash} [${fileIndex}]...`);
- return _retryCreateTorrent(PM, infoHash, cachedEntryInfo, fileIndex);
- }
- return Promise.reject(`Failed Premiumize adding torrent ${JSON.stringify(torrent)}`);
-}
-
-async function _getCachedLink(PM, infoHash, encodedFileName, fileIndex, ip, isBrowser) {
- const cachedTorrent = await PM.transfer.directDownload(magnet.encode({ infoHash }), ip);
- if (cachedTorrent?.content?.length) {
- const targetFileName = decodeURIComponent(encodedFileName);
- const videos = cachedTorrent.content.filter(file => isVideo(file.path)).sort((a, b) => b.size - a.size);
- const targetVideo = Number.isInteger(fileIndex)
- && videos.find(video => sameFilename(video.path, targetFileName))
- || videos[0];
- if (!targetVideo && videos.every(video => isArchive(video.path))) {
- console.log(`Only Premiumize archive is available for [${infoHash}] ${fileIndex}`)
- return StaticResponse.FAILED_RAR;
- }
- const streamLink = isBrowser && targetVideo.transcode_status === 'finished' && targetVideo.stream_link;
- const unrestrictedLink = streamLink || targetVideo.link;
- console.log(`Unrestricted Premiumize ${infoHash} [${fileIndex}] to ${unrestrictedLink}`);
- return unrestrictedLink;
- }
- return Promise.reject('No cached entry found');
-}
-
-async function _createOrFindTorrent(PM, infoHash) {
- return _findTorrent(PM, infoHash)
- .catch(() => _createTorrent(PM, infoHash));
-}
-
-async function _findTorrent(PM, infoHash) {
- const torrents = await PM.transfer.list().then(response => response.transfers);
- const foundTorrents = torrents.filter(torrent => torrent.src.toLowerCase().includes(infoHash));
- const nonFailedTorrent = foundTorrents.find(torrent => !statusError(torrent.statusCode));
- const foundTorrent = nonFailedTorrent || foundTorrents[0];
- return foundTorrent || Promise.reject('No recent torrent found');
-}
-
-async function _findInfoHash(PM, itemId) {
- const torrents = await PM.transfer.list().then(response => response.transfers);
- const foundTorrent = torrents.find(torrent => `${torrent.file_id}` === itemId || `${torrent.folder_id}` === itemId);
- return foundTorrent?.src ? magnet.decode(foundTorrent.src).infoHash : undefined;
-}
-
-async function _createTorrent(PM, infoHash) {
- const magnetLink = await getMagnetLink(infoHash);
- return PM.transfer.create(magnetLink).then(() => _findTorrent(PM, infoHash));
-}
-
-async function _retryCreateTorrent(PM, infoHash, encodedFileName, fileIndex) {
- const newTorrent = await _createTorrent(PM, infoHash).then(() => _findTorrent(PM, infoHash));
- return newTorrent && statusReady(newTorrent.status)
- ? _getCachedLink(PM, infoHash, encodedFileName, fileIndex)
- : StaticResponse.FAILED_DOWNLOAD;
-}
-
-export function toCommonError(error) {
- if (error && error.message === 'Not logged in.') {
- return BadTokenError;
- }
- return undefined;
-}
-
-function statusError(status) {
- return ['deleted', 'error', 'timeout'].includes(status);
-}
-
-function statusDownloading(status) {
- return ['waiting', 'queued', 'running'].includes(status);
-}
-
-function statusReady(status) {
- return ['finished', 'seeding'].includes(status);
-}
-
-function isAccessDeniedError(error) {
- return ['Account not premium.'].some(value => error?.message?.includes(value));
-}
-
-function isLimitExceededError(error) {
- return [
- 'Fair use limit reached!',
- 'You already have a maximum of 25 active downloads in progress!',
- 'Your space is full! Please delete old files first!'
- ].some(value => error?.message?.includes(value));
-}
-
-async function getDefaultOptions(ip) {
- return { timeout: 5000 };
-}
diff --git a/addon/moch/putio.js b/addon/moch/putio.js
deleted file mode 100644
index 4dc42dd..0000000
--- a/addon/moch/putio.js
+++ /dev/null
@@ -1,216 +0,0 @@
-import PutioClient from '@putdotio/api-client'
-import { isVideo } from '../lib/extension.js';
-import { delay } from '../lib/promises.js';
-import StaticResponse from './static.js';
-import { getMagnetLink } from '../lib/magnetHelper.js';
-import { Type } from "../lib/types.js";
-import { decode } from "magnet-uri";
-import { sameFilename, streamFilename } from "./mochHelper.js";
-const PutioAPI = PutioClient.default;
-
-const KEY = 'putio';
-
-export async function getCachedStreams(streams, apiKey) {
- return streams
- .reduce((mochStreams, stream) => {
- const filename = streamFilename(stream);
- mochStreams[`${stream.infoHash}@${stream.fileIdx}`] = {
- url: `${apiKey}/${stream.infoHash}/${filename}/${stream.fileIdx}`,
- cached: false
- };
- return mochStreams;
- }, {});
-}
-
-export async function getCatalog(apiKey, catalogId, config) {
- if (config.skip > 0) {
- return [];
- }
- const Putio = createPutioAPI(apiKey)
- return Putio.Files.Query(0)
- .then(response => response?.body?.files)
- .then(files => (files || [])
- .map(file => ({
- id: `${KEY}:${file.id}`,
- type: Type.OTHER,
- name: file.name
- })));
-}
-
-export async function getItemMeta(itemId, apiKey) {
- const Putio = createPutioAPI(apiKey)
- const infoHash = await _findInfoHash(Putio, itemId)
- return getFolderContents(Putio, itemId)
- .then(contents => ({
- id: `${KEY}:${itemId}`,
- type: Type.OTHER,
- name: contents.name,
- infoHash: infoHash,
- videos: contents
- .map((file, index) => ({
- id: `${KEY}:${file.id}:${index}`,
- title: file.name,
- released: new Date(file.created_at).toISOString(),
- streams: [{ url: `${apiKey}/null/null/${file.id}` }]
- }))
- }))
-}
-
-async function getFolderContents(Putio, itemId, folderPrefix = '') {
- return await Putio.Files.Query(itemId)
- .then(response => response?.body)
- .then(body => body?.files?.length ? body.files : [body?.parent].filter(x => x))
- .then(contents => Promise.all(contents
- .filter(content => content.file_type === 'FOLDER')
- .map(content => getFolderContents(Putio, content.id, [folderPrefix, content.name].join('/'))))
- .then(otherContents => otherContents.reduce((a, b) => a.concat(b), []))
- .then(otherContents => contents
- .filter(content => content.file_type === 'VIDEO')
- .map(content => ({ ...content, name: [folderPrefix, content.name].join('/') }))
- .concat(otherContents)));
-}
-
-export async function resolve({ ip, apiKey, infoHash, cachedEntryInfo, fileIndex }) {
- console.log(`Unrestricting Putio ${infoHash} [${fileIndex}]`);
- const Putio = createPutioAPI(apiKey)
-
- return _resolve(Putio, infoHash, cachedEntryInfo, fileIndex)
- .catch(error => {
- if (error?.data?.status_code === 401) {
- console.log(`Access denied to Putio ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_ACCESS;
- }
- return Promise.reject(`Failed Putio adding torrent ${JSON.stringify(error.data || error)}`);
- });
-}
-
-async function _resolve(Putio, infoHash, cachedEntryInfo, fileIndex) {
- if (infoHash === 'null') {
- return _unrestrictVideo(Putio, fileIndex);
- }
- const torrent = await _createOrFindTorrent(Putio, infoHash);
- if (torrent && statusReady(torrent.status)) {
- return _unrestrictLink(Putio, torrent, cachedEntryInfo, fileIndex);
- } else if (torrent && statusDownloading(torrent.status)) {
- console.log(`Downloading to Putio ${infoHash} [${fileIndex}]...`);
- return StaticResponse.DOWNLOADING;
- } else if (torrent && statusError(torrent.status)) {
- console.log(`Retrying downloading to Putio ${infoHash} [${fileIndex}]...`);
- return _retryCreateTorrent(Putio, infoHash, cachedEntryInfo, fileIndex);
- }
- return Promise.reject("Failed Putio adding torrent");
-}
-
-async function _createOrFindTorrent(Putio, infoHash) {
- return _findTorrent(Putio, infoHash)
- .catch(() => _createTorrent(Putio, infoHash));
-}
-
-async function _retryCreateTorrent(Putio, infoHash, encodedFileName, fileIndex) {
- const newTorrent = await _createTorrent(Putio, infoHash);
- return newTorrent && statusReady(newTorrent.status)
- ? _unrestrictLink(Putio, newTorrent, encodedFileName, fileIndex)
- : StaticResponse.FAILED_DOWNLOAD;
-}
-
-async function _findTorrent(Putio, infoHash) {
- const torrents = await Putio.Transfers.Query().then(response => response.data.transfers);
- const foundTorrents = torrents.filter(torrent => torrent.source.toLowerCase().includes(infoHash));
- const nonFailedTorrent = foundTorrents.find(torrent => !statusError(torrent.status));
- const foundTorrent = nonFailedTorrent || foundTorrents[0];
- if (foundTorrents && !foundTorrents.userfile_exists) {
- return await Putio.Transfers.Cancel(foundTorrents.id).then(() => Promise.reject())
- }
- return foundTorrent || Promise.reject('No recent torrent found in Putio');
-}
-
-async function _findInfoHash(Putio, fileId) {
- const torrents = await Putio.Transfers.Query().then(response => response?.data?.transfers);
- const foundTorrent = torrents.find(torrent => `${torrent.file_id}` === fileId);
- return foundTorrent?.source ? decode(foundTorrent.source).infoHash : undefined;
-}
-
-async function _createTorrent(Putio, infoHash) {
- const magnetLink = await getMagnetLink(infoHash);
- // Add the torrent and then delay for 3 secs for putio to process it and then check it's status.
- return Putio.Transfers.Add({ url: magnetLink })
- .then(response => _getNewTorrent(Putio, response.data.transfer.id));
-}
-
-async function _getNewTorrent(Putio, torrentId, pollCounter = 0, pollRate = 2000, maxPollNumber = 15) {
- return Putio.Transfers.Get(torrentId)
- .then(response => response.data.transfer)
- .then(torrent => statusProcessing(torrent.status) && pollCounter < maxPollNumber
- ? delay(pollRate).then(() => _getNewTorrent(Putio, torrentId, pollCounter + 1))
- : torrent);
-}
-
-async function _unrestrictLink(Putio, torrent, encodedFileName, fileIndex) {
- const targetVideo = await _getTargetFile(Putio, torrent, encodedFileName, fileIndex);
- return _unrestrictVideo(Putio, targetVideo.id);
-}
-
-async function _unrestrictVideo(Putio, videoId) {
- const response = await Putio.File.GetStorageURL(videoId);
- const downloadUrl = response.data.url
- console.log(`Unrestricted Putio [${videoId}] to ${downloadUrl}`);
- return downloadUrl;
-}
-
-async function _getTargetFile(Putio, torrent, encodedFileName, fileIndex) {
- const targetFileName = decodeURIComponent(encodedFileName);
- let targetFile;
- let files = await _getFiles(Putio, torrent.file_id);
- let videos = [];
-
- while (!targetFile && files.length) {
- const folders = files.filter(file => file.file_type === 'FOLDER');
- videos = videos.concat(files.filter(file => isVideo(file.name))).sort((a, b) => b.size - a.size);
- // when specific file index is defined search by filename
- // when it's not defined find all videos and take the largest one
- targetFile = Number.isInteger(fileIndex)
- && videos.find(video => sameFilename(targetFileName, video.name))
- || !folders.length && videos[0];
- files = !targetFile
- ? await Promise.all(folders.map(folder => _getFiles(Putio, folder.id)))
- .then(results => results.reduce((a, b) => a.concat(b), []))
- : [];
- }
- return targetFile || Promise.reject(`No target file found for Putio [${torrent.hash}] ${targetFileName}`);
-}
-
-async function _getFiles(Putio, fileId) {
- const response = await Putio.Files.Query(fileId)
- .catch(error => Promise.reject({ ...error.data, path: error.request.path }));
- return response.data.files.length
- ? response.data.files
- : [response.data.parent];
-}
-
-function createPutioAPI(apiKey) {
- const clientId = apiKey.replace(/@.*/, '');
- const token = apiKey.replace(/.*@/, '');
- const Putio = new PutioAPI({ clientID: clientId });
- Putio.setToken(token);
- return Putio;
-}
-
-export function toCommonError(error) {
- return undefined;
-}
-
-function statusError(status) {
- return ['ERROR'].includes(status);
-}
-
-function statusDownloading(status) {
- return ['WAITING', 'IN_QUEUE', 'DOWNLOADING'].includes(status);
-}
-
-function statusProcessing(status) {
- return ['WAITING', 'IN_QUEUE', 'COMPLETING'].includes(status);
-}
-
-function statusReady(status) {
- return ['COMPLETED', 'SEEDING'].includes(status);
-}
diff --git a/addon/moch/realdebrid.js b/addon/moch/realdebrid.js
deleted file mode 100644
index 4e16b9b..0000000
--- a/addon/moch/realdebrid.js
+++ /dev/null
@@ -1,366 +0,0 @@
-import RealDebridClient from 'real-debrid-api';
-import { Type } from '../lib/types.js';
-import { isVideo, isArchive } from '../lib/extension.js';
-import { delay } from '../lib/promises.js';
-import { cacheAvailabilityResults, getCachedAvailabilityResults, removeAvailabilityResults } from '../lib/cache.js';
-import StaticResponse from './static.js';
-import { getMagnetLink } from '../lib/magnetHelper.js';
-import { BadTokenError, AccessDeniedError } from './mochHelper.js';
-
-const MIN_SIZE = 5 * 1024 * 1024; // 5 MB
-const CATALOG_MAX_PAGE = 1;
-const CATALOG_PAGE_SIZE = 100;
-const KEY = 'realdebrid';
-const DEBRID_DOWNLOADS = 'Downloads';
-
-export async function getCachedStreams(streams, apiKey) {
- const hashes = streams.map(stream => stream.infoHash);
- const available = await getCachedAvailabilityResults(hashes);
- return available && streams
- .reduce((mochStreams, stream) => {
- const cachedEntry = available[stream.infoHash];
- const cachedIds = _getCachedFileIds(stream.fileIdx, cachedEntry);
- mochStreams[`${stream.infoHash}@${stream.fileIdx}`] = {
- url: `${apiKey}/${stream.infoHash}/null/${stream.fileIdx}`,
- cached: !!cachedIds.length
- };
- return mochStreams;
- }, {})
-}
-
-function _getCachedFileIds(fileIndex, cachedResults) {
- if (!cachedResults || !Array.isArray(cachedResults)) {
- return [];
- }
-
- const cachedIds = Number.isInteger(fileIndex)
- ? cachedResults.find(ids => Array.isArray(ids) && ids.includes(fileIndex + 1))
- : cachedResults[0];
- return cachedIds || [];
-}
-
-export async function getCatalog(apiKey, catalogId, config) {
- const options = await getDefaultOptions(config.ip);
- const RD = new RealDebridClient(apiKey, options);
- const page = Math.floor((config.skip || 0) / 100) + 1;
- const downloadsMeta = page === 1 ? [{
- id: `${KEY}:${DEBRID_DOWNLOADS}`,
- type: Type.OTHER,
- name: DEBRID_DOWNLOADS
- }] : [];
- const torrentMetas = await _getAllTorrents(RD, page)
- .then(torrents => Array.isArray(torrents) ? torrents : [])
- .then(torrents => torrents
- .filter(torrent => torrent && statusReady(torrent.status))
- .map(torrent => ({
- id: `${KEY}:${torrent.id}`,
- type: Type.OTHER,
- name: torrent.filename
- })));
- return downloadsMeta.concat(torrentMetas)
-}
-
-export async function getItemMeta(itemId, apiKey, ip) {
- const options = await getDefaultOptions(ip);
- const RD = new RealDebridClient(apiKey, options);
- if (itemId === DEBRID_DOWNLOADS) {
- const videos = await _getAllDownloads(RD)
- .then(downloads => downloads
- .map(download => ({
- id: `${KEY}:${DEBRID_DOWNLOADS}:${download.id}`,
- // infoHash: allTorrents
- // .filter(torrent => (torrent.links || []).find(link => link === download.link))
- // .map(torrent => torrent.hash.toLowerCase())[0],
- title: download.filename,
- released: new Date(download.generated).toISOString(),
- streams: [{ url: download.download }]
- })));
- return {
- id: `${KEY}:${DEBRID_DOWNLOADS}`,
- type: Type.OTHER,
- name: DEBRID_DOWNLOADS,
- videos: videos
- };
- }
- return _getTorrentInfo(RD, itemId)
- .then(torrent => ({
- id: `${KEY}:${torrent.id}`,
- type: Type.OTHER,
- name: torrent.filename,
- infoHash: torrent.hash.toLowerCase(),
- videos: torrent.files
- .filter(file => file.selected)
- .filter(file => isVideo(file.path))
- .map((file, index) => ({
- id: `${KEY}:${torrent.id}:${file.id}`,
- title: file.path,
- released: new Date(new Date(torrent.added).getTime() - index).toISOString(),
- streams: [{ url: `${apiKey}/${torrent.hash.toLowerCase()}/null/${file.id - 1}` }]
- }))
- }))
-}
-
-async function _getAllTorrents(RD, page = 1) {
- return RD.torrents.get(page - 1, page, CATALOG_PAGE_SIZE)
- .then(torrents => torrents && torrents.length === CATALOG_PAGE_SIZE && page < CATALOG_MAX_PAGE
- ? _getAllTorrents(RD, page + 1)
- .then(nextTorrents => torrents.concat(nextTorrents))
- .catch(() => torrents)
- : torrents)
-}
-
-async function _getAllDownloads(RD, page = 1) {
- return RD.downloads.get(page - 1, page, CATALOG_PAGE_SIZE);
-}
-
-export async function resolve({ ip, isBrowser, apiKey, infoHash, fileIndex }) {
- console.log(`Unrestricting RealDebrid ${infoHash} [${fileIndex}]`);
- const options = await getDefaultOptions(ip);
- const RD = new RealDebridClient(apiKey, options);
-
- return _resolve(RD, infoHash, fileIndex, isBrowser)
- .catch(error => {
- if (isAccessDeniedError(error)) {
- console.log(`Access denied to RealDebrid ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_ACCESS;
- }
- if (isInfringingFileError(error)) {
- console.log(`Infringing file removed from RealDebrid ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_INFRINGEMENT;
- }
- if (isLimitExceededError(error)) {
- console.log(`Limits exceeded in RealDebrid ${infoHash} [${fileIndex}]`);
- return StaticResponse.LIMITS_EXCEEDED;
- }
- if (isTorrentTooBigError(error)) {
- console.log(`Torrent too big for RealDebrid ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_TOO_BIG;
- }
- return Promise.reject(`Failed RealDebrid adding torrent ${JSON.stringify(error)}`);
- });
-}
-
-async function _resolveCachedFileIds(infoHash, fileIndex) {
- const available = await getCachedAvailabilityResults([infoHash]);
- const cachedEntry = available?.[infoHash];
- const cachedIds = _getCachedFileIds(fileIndex, cachedEntry);
- return cachedIds?.join(',');
-}
-
-async function _resolve(RD, infoHash, fileIndex, isBrowser) {
- const torrentId = await _createOrFindTorrentId(RD, infoHash, fileIndex);
- const torrent = await _getTorrentInfo(RD, torrentId);
- if (torrent && statusReady(torrent.status)) {
- return _unrestrictLink(RD, torrent, fileIndex, isBrowser);
- } else if (torrent && statusDownloading(torrent.status)) {
- console.log(`Downloading to RealDebrid ${infoHash} [${fileIndex}]...`);
- const cachedFileIds = torrent.files.filter(file => file.selected).map(file => file.id);
- removeAvailabilityResults(infoHash, cachedFileIds);
- return StaticResponse.DOWNLOADING;
- } else if (torrent && statusMagnetError(torrent.status)) {
- console.log(`Failed RealDebrid opening torrent ${infoHash} [${fileIndex}] due to magnet error`);
- return StaticResponse.FAILED_OPENING;
- } else if (torrent && statusError(torrent.status)) {
- return _retryCreateTorrent(RD, infoHash, fileIndex);
- } else if (torrent && (statusWaitingSelection(torrent.status) || statusOpening(torrent.status))) {
- console.log(`Trying to select files on RealDebrid ${infoHash} [${fileIndex}]...`);
- return _selectTorrentFiles(RD, torrent)
- .then(() => {
- console.log(`Downloading to RealDebrid ${infoHash} [${fileIndex}]...`);
- return StaticResponse.DOWNLOADING
- })
- .catch(error => {
- console.log(`Failed RealDebrid opening torrent ${infoHash} [${fileIndex}]:`, error);
- return StaticResponse.FAILED_OPENING;
- });
- }
- return Promise.reject(`Failed RealDebrid adding torrent ${JSON.stringify(torrent)}`);
-}
-
-async function _createOrFindTorrentId(RD, infoHash, fileIndex) {
- return _findTorrent(RD, infoHash, fileIndex)
- .catch(() => _createTorrentId(RD, infoHash, fileIndex));
-}
-
-async function _findTorrent(RD, infoHash, fileIndex) {
- const torrents = await RD.torrents.get(0, 1) || [];
- const foundTorrents = torrents
- .filter(torrent => torrent.hash.toLowerCase() === infoHash)
- .filter(torrent => !statusError(torrent.status));
- const foundTorrent = await _findBestFitTorrent(RD, foundTorrents, fileIndex);
- return foundTorrent?.id || Promise.reject('No recent torrent found');
-}
-
-async function _findBestFitTorrent(RD, torrents, fileIndex) {
- if (torrents.length === 1) {
- return torrents[0];
- }
- const torrentInfos = await Promise.all(torrents.map(torrent => _getTorrentInfo(RD, torrent.id)));
- const bestFitTorrents = torrentInfos
- .filter(torrent => torrent.files.find(f => f.id === fileIndex + 1 && f.selected))
- .sort((a, b) => b.links.length - a.links.length);
- return bestFitTorrents[0] || torrents[0];
-}
-
-async function _getTorrentInfo(RD, torrentId) {
- if (!torrentId || typeof torrentId === 'object') {
- return torrentId || Promise.reject('No RealDebrid torrentId provided')
- }
- return RD.torrents.info(torrentId);
-}
-
-async function _createTorrentId(RD, infoHash, fileIndex, force = false) {
- const magnetLink = await getMagnetLink(infoHash);
- const addedMagnet = await RD.torrents.addMagnet(magnetLink);
- const cachedFileIds = !force && await _resolveCachedFileIds(infoHash, fileIndex);
- if (cachedFileIds && !['null', 'undefined'].includes(cachedFileIds)) {
- await RD.torrents.selectFiles(addedMagnet.id, cachedFileIds);
- } else if (!force) {
- await _selectTorrentFiles(RD, { id: addedMagnet.id });
- }
- return addedMagnet.id;
-}
-
-async function _recreateTorrentId(RD, infoHash, fileIndex, force = false) {
- const newTorrentId = await _createTorrentId(RD, infoHash, fileIndex, force);
- await _selectTorrentFiles(RD, { id: newTorrentId }, fileIndex);
- return newTorrentId;
-}
-
-async function _retryCreateTorrent(RD, infoHash, fileIndex, shouldRetry = false) {
- console.log(`Retry failed download in RealDebrid ${infoHash} [${fileIndex}]...`);
- const newTorrentId = await _recreateTorrentId(RD, infoHash, fileIndex, true);
- const newTorrent = await _getTorrentInfo(RD, newTorrentId);
- return newTorrent && statusReady(newTorrent.status)
- ? _unrestrictLink(RD, newTorrent, fileIndex, false, shouldRetry)
- : StaticResponse.FAILED_DOWNLOAD;
-}
-
-async function _selectTorrentFiles(RD, torrent, fileIndex) {
- torrent = statusWaitingSelection(torrent.status) ? torrent : await _openTorrent(RD, torrent.id);
- if (torrent?.files && statusWaitingSelection(torrent.status)) {
- const videoFileIds = Number.isInteger(fileIndex) ? `${fileIndex + 1}` : torrent.files
- .filter(file => isVideo(file.path))
- .filter(file => file.bytes > MIN_SIZE)
- .map(file => file.id)
- .join(',');
- return RD.torrents.selectFiles(torrent.id, videoFileIds);
- } else if (statusReady(torrent.status) || statusDownloading(torrent.status)) {
- return torrent;
- }
- return Promise.reject('Failed RealDebrid torrent file selection')
-}
-
-async function _openTorrent(RD, torrentId, pollCounter = 0, pollRate = 2000, maxPollNumber = 15) {
- return _getTorrentInfo(RD, torrentId)
- .then(torrent => torrent && statusOpening(torrent.status) && pollCounter < maxPollNumber
- ? delay(pollRate).then(() => _openTorrent(RD, torrentId, pollCounter + 1))
- : torrent);
-}
-
-async function _unrestrictLink(RD, torrent, fileIndex, isBrowser, shouldRetry = true) {
- const targetFile = torrent.files.find(file => file.id === fileIndex + 1)
- || torrent.files.filter(file => file.selected).sort((a, b) => b.bytes - a.bytes)[0];
- if (!targetFile.selected) {
- console.log(`Target RealDebrid file is not downloaded: ${JSON.stringify(targetFile)}`);
- await _recreateTorrentId(RD, torrent.hash.toLowerCase(), fileIndex);
- return StaticResponse.DOWNLOADING;
- }
-
- const selectedFiles = torrent.files.filter(file => file.selected);
- const fileLink = torrent.links.length === 1
- ? torrent.links[0]
- : torrent.links[selectedFiles.indexOf(targetFile)];
-
- if (shouldRetry && !fileLink?.length) {
- console.log(`No RealDebrid links found for ${torrent.hash} [${fileIndex}]`);
- return _retryCreateTorrent(RD, torrent.hash, fileIndex)
- }
-
- return _unrestrictFileLink(RD, fileLink, torrent, fileIndex, isBrowser, shouldRetry);
-}
-
-async function _unrestrictFileLink(RD, fileLink, torrent, fileIndex, isBrowser, shouldRetry) {
- return RD.unrestrict.link(fileLink)
- .then(response => {
- if (isArchive(response.download)) {
- if (shouldRetry && Number.isInteger(fileIndex) && torrent.files.filter(file => file.selected).length > 1) {
- console.log(`Only archive is available, try to download single file for ${torrent.hash} [${fileIndex}]`);
- return _retryCreateTorrent(RD, torrent.hash, fileIndex)
- }
- return StaticResponse.FAILED_RAR;
- }
- // if (isBrowser && response.streamable) {
- // return RD.streaming.transcode(response.id)
- // .then(streamResponse => streamResponse.apple.full)
- // }
- return response.download;
- })
- .then(unrestrictedLink => {
- console.log(`Unrestricted RealDebrid ${torrent.hash} [${fileIndex}] to ${unrestrictedLink}`);
- const cachedFileIds = torrent.files.filter(file => file.selected).map(file => file.id);
- cacheAvailabilityResults(torrent.hash.toLowerCase(), cachedFileIds); // no need to await can happen async
- return unrestrictedLink;
- })
- .catch(error => {
- if (shouldRetry && error.code === 19) {
- console.log(`Retry download as hoster is unavailable for ${torrent.hash} [${fileIndex}]`);
- return _retryCreateTorrent(RD, torrent.hash.toLowerCase(), fileIndex);
- }
- return Promise.reject(error);
- });
-}
-
-export function toCommonError(error) {
- if (error && error.code === 8) {
- return BadTokenError;
- }
- if (error && isAccessDeniedError(error)) {
- return AccessDeniedError;
- }
- return undefined;
-}
-
-function statusError(status) {
- return ['error', 'magnet_error'].includes(status);
-}
-
-function statusMagnetError(status) {
- return status === 'magnet_error';
-}
-
-function statusOpening(status) {
- return status === 'magnet_conversion';
-}
-
-function statusWaitingSelection(status) {
- return status === 'waiting_files_selection';
-}
-
-function statusDownloading(status) {
- return ['downloading', 'uploading', 'queued'].includes(status);
-}
-
-function statusReady(status) {
- return ['downloaded', 'dead'].includes(status);
-}
-
-function isAccessDeniedError(error) {
- return [8, 9, 20].includes(error?.code);
-}
-
-function isInfringingFileError(error) {
- return [35].includes(error?.code);
-}
-
-function isLimitExceededError(error) {
- return [21, 23, 26, 36].includes(error?.code);
-}
-
-function isTorrentTooBigError(error) {
- return [29].includes(error?.code);
-}
-
-async function getDefaultOptions(ip) {
- return { ip, timeout: 15000 };
-}
diff --git a/addon/moch/static.js b/addon/moch/static.js
deleted file mode 100644
index 6e85015..0000000
--- a/addon/moch/static.js
+++ /dev/null
@@ -1,19 +0,0 @@
-const staticVideoUrls = {
- DOWNLOADING: `videos/downloading_v2.mp4`,
- FAILED_DOWNLOAD: `videos/download_failed_v2.mp4`,
- FAILED_ACCESS: `videos/failed_access_v2.mp4`,
- FAILED_RAR: `videos/failed_rar_v2.mp4`,
- FAILED_TOO_BIG: 'failed_too_big_v1.mp4',
- FAILED_OPENING: `videos/failed_opening_v2.mp4`,
- FAILED_UNEXPECTED: `videos/failed_unexpected_v2.mp4`,
- FAILED_INFRINGEMENT: `videos/failed_infringement_v2.mp4`,
- LIMITS_EXCEEDED: `videos/limits_exceeded_v1.mp4`,
- BLOCKED_ACCESS: `videos/blocked_access_v1.mp4`,
-}
-
-
-export function isStaticUrl(url) {
- return Object.values(staticVideoUrls).some(videoUrl => url?.endsWith(videoUrl));
-}
-
-export default staticVideoUrls
\ No newline at end of file
diff --git a/addon/moch/torbox.js b/addon/moch/torbox.js
deleted file mode 100644
index e4976fe..0000000
--- a/addon/moch/torbox.js
+++ /dev/null
@@ -1,298 +0,0 @@
-import axios from 'axios';
-import { Type } from '../lib/types.js';
-import { isVideo } from '../lib/extension.js';
-import StaticResponse from './static.js';
-import { getMagnetLink } from '../lib/magnetHelper.js';
-import { chunkArray, BadTokenError, sameFilename, streamFilename } from './mochHelper.js';
-
-const KEY = 'torbox';
-const timeout = 30000;
-const baseUrl = 'https://api.torbox.app/v1'
-
-export async function getCachedStreams(streams, apiKey, ip) {
- const hashBatches = chunkArray(streams.map(stream => stream.infoHash), 150)
- .map(hashes => getAvailabilityResponse(apiKey, hashes));
- const available = await Promise.all(hashBatches)
- .then(results => results
- .map(data => data.map(entry => entry.hash))
- .reduce((all, result) => all.concat(result), []))
- .catch(error => {
- if (toCommonError(error)) {
- return Promise.reject(error);
- }
- const message = error.message || error;
- console.warn('Failed TorBox cached torrent availability request:', message);
- return undefined;
- });
- return available && streams
- .reduce((mochStreams, stream) => {
- const isCached = available.includes(stream.infoHash);
- const fileName = streamFilename(stream);
- mochStreams[`${stream.infoHash}@${stream.fileIdx}`] = {
- url: `${apiKey}/${stream.infoHash}/${fileName}/${stream.fileIdx}`,
- cached: isCached
- };
- return mochStreams;
- }, {})
-}
-
-export async function getCatalog(apiKey, type, config) {
- return getItemList(apiKey, type, null, config.skip)
- .then(items => (items || [])
- .filter(item => statusReady(item))
- .map(item => ({
- id: `${KEY}:${type}-${item.id}`,
- type: Type.OTHER,
- name: item.name
- })));
-}
-
-export async function getItemMeta(itemId, apiKey) {
- const [type, id] = itemId.split('-');
- const item = await getItemList(apiKey, type, id);
- const createDate = item ? new Date(item.created_at) : new Date();
- return {
- id: `${KEY}:${itemId}`,
- type: Type.OTHER,
- name: item.name,
- infoHash: item.hash,
- videos: item.files
- .filter(file => isVideo(file.short_name))
- .map((file, index) => ({
- id: `${KEY}:${itemId}:${file.id}`,
- title: file.name,
- released: new Date(createDate.getTime() - index).toISOString(),
- streams: [{ url: `${apiKey}/${itemId}-${file.id}/null/null` }]
- }))
- }
-}
-
-export async function resolve({ ip, apiKey, infoHash, cachedEntryInfo, fileIndex }) {
- console.log(`Unrestricting TorBox ${infoHash} [${fileIndex}]`);
- return _resolve(apiKey, infoHash, cachedEntryInfo, fileIndex, ip)
- .catch(error => {
- if (isAccessDeniedError(error)) {
- console.log(`Access denied to TorBox ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_ACCESS;
- }
- if (isLimitExceededError(error)) {
- console.log(`Limits exceeded to TorBox ${infoHash} [${fileIndex}]`);
- return StaticResponse.LIMITS_EXCEEDED;
- }
- if (isTorrentTooBigError(error)) {
- console.log(`Torrent too big for TorBox ${infoHash} [${fileIndex}]`);
- return StaticResponse.FAILED_TOO_BIG;
- }
- return Promise.reject(`Failed TorBox adding torrent: ${JSON.stringify(error.message || error)}`);
- });
-}
-
-async function _resolve(apiKey, infoHash, cachedEntryInfo, fileIndex, ip) {
- if (infoHash?.includes('-')) {
- const [type, rootId, fileId] = infoHash.split('-');
- return getDownloadLink(apiKey, type, rootId, fileId, ip);
- }
- const torrent = await _createOrFindTorrent(apiKey, infoHash);
- if (torrent && statusReady(torrent)) {
- return _unrestrictLink(apiKey, infoHash, torrent, cachedEntryInfo, fileIndex, ip);
- } else if (torrent && statusDownloading(torrent)) {
- console.log(`Downloading to TorBox ${infoHash} [${fileIndex}]...`);
- return StaticResponse.DOWNLOADING;
- } else if (torrent && statusError(torrent)) {
- console.log(`Retry failed download in TorBox ${infoHash} [${fileIndex}]...`);
- return controlTorrent(apiKey, torrent.id, 'delete')
- .then(() => _retryCreateTorrent(apiKey, infoHash, cachedEntryInfo, fileIndex));
- }
-
- return Promise.reject(`Failed TorBox adding torrent ${JSON.stringify(torrent)}`);
-}
-
-async function _createOrFindTorrent(apiKey, infoHash) {
- return _findTorrent(apiKey, infoHash)
- .catch(() => _createTorrent(apiKey, infoHash));
-}
-
-async function _findTorrent(apiKey, infoHash) {
- const torrents = await getTorrentList(apiKey);
- const foundTorrents = torrents.filter(torrent => torrent.hash === infoHash);
- const nonFailedTorrent = foundTorrents.find(torrent => !statusError(torrent));
- const foundTorrent = nonFailedTorrent || foundTorrents[0];
- return foundTorrent || Promise.reject('No recent torrent found');
-}
-
-async function _createTorrent(apiKey, infoHash, attempts = 1) {
- const magnetLink = await getMagnetLink(infoHash);
- return createTorrent(apiKey, magnetLink)
- .then(data => {
- if (data.torrent_id) {
- return getTorrentList(apiKey, data.torrent_id);
- }
- if (data.queued_id) {
- return Promise.resolve({ ...data, download_state: 'metaDL' })
- }
- if (data?.error === 'ACTIVE_LIMIT' && attempts > 0) {
- return freeLastActiveTorrent(apiKey)
- .then(() => _createTorrent(apiKey, infoHash, attempts - 1));
- }
- return Promise.reject(`Unexpected create data: ${JSON.stringify(data)}`);
- });
-}
-
-async function _retryCreateTorrent(apiKey, infoHash, cachedEntryInfo, fileIndex) {
- const newTorrent = await _createTorrent(apiKey, infoHash);
- return newTorrent && statusReady(newTorrent)
- ? _unrestrictLink(apiKey, infoHash, newTorrent, cachedEntryInfo, fileIndex)
- : StaticResponse.FAILED_DOWNLOAD;
-}
-
-async function freeLastActiveTorrent(apiKey) {
- const torrents = await getTorrentList(apiKey);
- const seedingTorrent = torrents.filter(statusSeeding).pop();
- if (seedingTorrent) {
- console.log(`Stopping seeded item in TorBox to make space...`);
- return controlTorrent(apiKey, seedingTorrent.id, 'stop_seeding');
- }
- const downloadingTorrent = torrents.filter(statusDownloading).pop();
- if (downloadingTorrent) {
- console.log(`Deleting downloading item in TorBox to make space...`);
- return controlTorrent(apiKey, downloadingTorrent.id, 'delete');
- }
- return Promise.reject({ detail: 'No torrent to pause found' });
-}
-
-async function _unrestrictLink(apiKey, infoHash, torrent, cachedEntryInfo, fileIndex, ip) {
- const targetFileName = decodeURIComponent(cachedEntryInfo);
- const videos = torrent.files
- .filter(file => isVideo(file.short_name))
- .sort((a, b) => b.size - a.size);
- const targetVideo = Number.isInteger(fileIndex)
- && videos.find(video => sameFilename(video.name, targetFileName))
- || videos[0];
-
- if (!targetVideo) {
- if (torrent.files.every(file => file.zipped)) {
- return StaticResponse.FAILED_RAR;
- }
- return Promise.reject(`No TorBox file found for index ${fileIndex} in: ${JSON.stringify(torrent)}`);
- }
- return getDownloadLink(apiKey, 'torrents', torrent.id, targetVideo.id, ip);
-}
-
-async function getAvailabilityResponse(apiKey, hashes) {
- const url = `${baseUrl}/api/torrents/checkcached`;
- const headers = getHeaders(apiKey);
- const params = { hash: hashes.join(','), format: 'list' };
- return axios.get(url, { params, headers, timeout })
- .then(response => {
- if (response.data?.success) {
- return Promise.resolve(response.data.data || []);
- }
- return Promise.reject(response.data);
- })
- .catch(error => Promise.reject(error.response?.data || error));
-}
-
-async function createTorrent(apiKey, magnetLink){
- const url = `${baseUrl}/api/torrents/createtorrent`
- const headers = getHeaders(apiKey);
- const data = new URLSearchParams();
- data.append('magnet', magnetLink);
- data.append('allow_zip', 'false');
- return axios.post(url, data, { headers, timeout })
- .then(response => {
- if (response.data?.success) {
- return Promise.resolve(response.data.data);
- }
- return Promise.reject(response.data);
- })
- .catch(error => Promise.reject(error.response?.data || error));
-}
-
-async function controlTorrent(apiKey, torrent_id, operation){
- const url = `${baseUrl}/api/torrents/controltorrent`
- const headers = getHeaders(apiKey);
- const data = { torrent_id, operation}
- return axios.post(url, data, { headers, timeout })
- .then(response => {
- if (response.data?.success) {
- return Promise.resolve(response.data.data);
- }
- return Promise.reject(response.data);
- })
- .catch(error => Promise.reject(error.response?.data || error));
-}
-
-async function getTorrentList(apiKey, id = undefined, offset = 0) {
- return getItemList(apiKey, 'torrents', id, offset);
-}
-
-async function getItemList(apiKey, type, id = undefined, offset = 0) {
- const url = `${baseUrl}/api/${type}/mylist`;
- const headers = getHeaders(apiKey);
- const params = { id, offset };
- return axios.get(url, { params, headers, timeout })
- .then(response => {
- if (response.data?.success) {
- if (Array.isArray(response.data.data)) {
- response.data.data.sort((a, b) => b.id - a.id);
- }
- return Promise.resolve(response.data.data);
- }
- return Promise.reject(response.data);
- })
- .catch(error => Promise.reject(error.response?.data || error));
-}
-
-async function getDownloadLink(token, type, rootId, file_id, user_ip) {
- const url = `${baseUrl}/api/${type}/requestdl`;
- const params = { token, torrent_id: rootId, usenet_id: rootId, web_id: rootId, file_id, user_ip };
- return axios.get(url, { params, timeout })
- .then(response => {
- if (response.data?.success) {
- console.log(`Unrestricted TorBox ${type} [${rootId}] to ${response.data.data}`);
- return Promise.resolve(response.data.data);
- }
- return Promise.reject(response.data);
- })
- .catch(error => Promise.reject(error.response?.data || error));
-}
-
-function getHeaders(apiKey) {
- return { Authorization: `Bearer ${apiKey}` };
-}
-
-export function toCommonError(data) {
- const error = data?.response?.data || data;
- if (['AUTH_ERROR', 'BAD_TOKEN'].includes(error?.error)) {
- return BadTokenError;
- }
- return undefined;
-}
-
-function statusDownloading(torrent) {
- return !statusReady(torrent) && !statusError(torrent);
-}
-
-function statusError(torrent) {
- return (!torrent?.active && !torrent?.download_finished) || torrent?.download_state === 'error';
-}
-
-function statusReady(torrent) {
- return torrent?.download_present;
-}
-
-function statusSeeding(torrent) {
- return ['seeding', 'uploading', 'uploading (no peers)'].includes(torrent?.download_state);
-}
-
-function isAccessDeniedError(error) {
- return ['AUTH_ERROR', 'BAD_TOKEN', 'PLAN_RESTRICTED_FEATURE'].includes(error?.error);
-}
-
-function isLimitExceededError(error) {
- return ['MONTHLY_LIMIT', 'COOLDOWN_LIMIT', 'ACTIVE_LIMIT'].includes(error?.error);
-}
-
-function isTorrentTooBigError(error) {
- return ['DOWNLOAD_TOO_LARGE'].includes(error?.error);
-}
diff --git a/addon/package-lock.json b/addon/package-lock.json
deleted file mode 100644
index edd2b5f..0000000
--- a/addon/package-lock.json
+++ /dev/null
@@ -1,2574 +0,0 @@
-{
- "name": "stremio-torrentio",
- "version": "1.0.14",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "stremio-torrentio",
- "version": "1.0.14",
- "license": "MIT",
- "dependencies": {
- "@keyv/mongo": "^3.0.1",
- "@putdotio/api-client": "^8.42.0",
- "all-debrid-api": "^1.2.0",
- "axios": "^1.7.7",
- "cacheable": "^1.8.4",
- "cors": "^2.8.5",
- "debrid-link-api": "^1.0.1",
- "express-rate-limit": "^6.7.0",
- "magnet-uri": "^6.2.0",
- "name-to-imdb": "^3.0.4",
- "named-queue": "^2.2.1",
- "offcloud-api": "^1.0.2",
- "p-limit": "^5.0.0",
- "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#1bc3539e0d7c6686655ede649e6be8da53e4c217",
- "pg": "^8.8.0",
- "premiumize-api": "^1.0.3",
- "prom-client": "^14.2.0",
- "real-debrid-api": "git://github.com/TheBeastLT/node-real-debrid.git#d1f7eaa8593b947edbfbc8a92a176448b48ef445",
- "request-ip": "^3.3.0",
- "router": "^1.3.8",
- "sequelize": "^6.29.0",
- "stremio-addon-sdk": "^1.6.10",
- "swagger-stats": "^0.99.7",
- "ua-parser-js": "^1.0.36",
- "user-agents": "^1.0.1444"
- }
- },
- "node_modules/@keyv/mongo": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@keyv/mongo/-/mongo-3.0.1.tgz",
- "integrity": "sha512-dNVIhm68mh/CAySN6q7o1vyBRdBRt41nrJXIDlqLhnXOo4l8IAY1Vj5BlTkUfw1BDLuZ9zjb+g1lr/BMRdzNdg==",
- "license": "MIT",
- "dependencies": {
- "mongodb": "^6.8.0"
- }
- },
- "node_modules/@keyv/mongo/node_modules/bson": {
- "version": "6.9.0",
- "resolved": "https://registry.npmjs.org/bson/-/bson-6.9.0.tgz",
- "integrity": "sha512-X9hJeyeM0//Fus+0pc5dSUMhhrrmWwQUtdavaQeF3Ta6m69matZkGWV/MrBcnwUeLC8W9kwwc2hfkZgUuCX3Ig==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=16.20.1"
- }
- },
- "node_modules/@keyv/mongo/node_modules/mongodb": {
- "version": "6.10.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.10.0.tgz",
- "integrity": "sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@mongodb-js/saslprep": "^1.1.5",
- "bson": "^6.7.0",
- "mongodb-connection-string-url": "^3.0.0"
- },
- "engines": {
- "node": ">=16.20.1"
- },
- "peerDependencies": {
- "@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
- "gcp-metadata": "^5.2.0",
- "kerberos": "^2.0.1",
- "mongodb-client-encryption": ">=6.0.0 <7",
- "snappy": "^7.2.2",
- "socks": "^2.7.1"
- },
- "peerDependenciesMeta": {
- "@aws-sdk/credential-providers": {
- "optional": true
- },
- "@mongodb-js/zstd": {
- "optional": true
- },
- "gcp-metadata": {
- "optional": true
- },
- "kerberos": {
- "optional": true
- },
- "mongodb-client-encryption": {
- "optional": true
- },
- "snappy": {
- "optional": true
- },
- "socks": {
- "optional": true
- }
- }
- },
- "node_modules/@keyv/serialize": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.1.tgz",
- "integrity": "sha512-kKXeynfORDGPUEEl2PvTExM2zs+IldC6ZD8jPcfvI351MDNtfMlw9V9s4XZXuJNDK2qR5gbEKxRyoYx3quHUVQ==",
- "license": "MIT",
- "dependencies": {
- "buffer": "^6.0.3"
- }
- },
- "node_modules/@mongodb-js/saslprep": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz",
- "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==",
- "license": "MIT",
- "dependencies": {
- "sparse-bitfield": "^3.0.3"
- }
- },
- "node_modules/@putdotio/api-client": {
- "version": "8.42.0",
- "resolved": "https://registry.npmjs.org/@putdotio/api-client/-/api-client-8.42.0.tgz",
- "integrity": "sha512-LaFaPMOO8WbvwzUlvuzBcBH9aSpqZIkA6MuoKJPNZ293kFSMZPyXkE/VddVXPNq0f5sp7HzdueCMIPOxcom9hg==",
- "dependencies": {
- "axios": "^0.21.1",
- "event-emitter": "^0.3.5",
- "js-base64": "2.6.3",
- "qs": "^6.10.3",
- "urijs": "^1.19.7"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@putdotio/api-client/node_modules/axios": {
- "version": "0.21.4",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
- "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
- "dependencies": {
- "follow-redirects": "^1.14.0"
- }
- },
- "node_modules/@types/debug": {
- "version": "4.1.12",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
- "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
- "license": "MIT",
- "dependencies": {
- "@types/ms": "*"
- }
- },
- "node_modules/@types/ms": {
- "version": "0.7.34",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
- "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==",
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "18.0.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz",
- "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA=="
- },
- "node_modules/@types/validator": {
- "version": "13.12.2",
- "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz",
- "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==",
- "license": "MIT"
- },
- "node_modules/@types/webidl-conversions": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
- "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
- "license": "MIT"
- },
- "node_modules/@types/whatwg-url": {
- "version": "11.0.5",
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
- "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
- "license": "MIT",
- "dependencies": {
- "@types/webidl-conversions": "*"
- }
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ajv": {
- "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"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/all-debrid-api": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/all-debrid-api/-/all-debrid-api-1.2.0.tgz",
- "integrity": "sha512-aT6w166Hy2/HadNgBiOQxAjBn20z82CYZxYd7f70wAzzzScoJYjt4j93+TvKyRvCilKTrZIljVqbT4/9gi8U2Q==",
- "dependencies": {
- "request": "^2.83.0"
- }
- },
- "node_modules/ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ansi-regex": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
- "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "node_modules/asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
- "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
- },
- "node_modules/axios": {
- "version": "1.7.7",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
- "license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
- "node_modules/axios/node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/basic-auth": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
- "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
- "dependencies": {
- "safe-buffer": "5.1.2"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/basic-auth/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
- "node_modules/bep53-range": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/bep53-range/-/bep53-range-1.1.1.tgz",
- "integrity": "sha512-ct6s33iiwRCUPp9KXnJ4QMWDgHIgaw36caK/5XEQ9L8dCzSQlJt1Vk6VmHh1VD4AlGCAI4C2zmtfItifBBPrhQ=="
- },
- "node_modules/bintrees": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz",
- "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw=="
- },
- "node_modules/body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.11.0",
- "raw-body": "2.5.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/cacheable": {
- "version": "1.8.4",
- "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.8.4.tgz",
- "integrity": "sha512-eqcPwJIM8hcx2mQIZtgrBQ7BmOf2pkL+1URswJaKRikCDw5of/lGpBTxODL1z1VuVVuxZHTuTejAMd9vyAUpLg==",
- "license": "MIT",
- "dependencies": {
- "hookified": "^1.5.0",
- "keyv": "^5.2.1"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
- },
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
- },
- "node_modules/cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "dependencies": {
- "restore-cursor": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "node_modules/cookies": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz",
- "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==",
- "dependencies": {
- "depd": "~2.0.0",
- "keygrip": "~1.1.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "node_modules/cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "dependencies": {
- "object-assign": "^4",
- "vary": "^1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/d": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
- "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
- "dependencies": {
- "es5-ext": "^0.10.50",
- "type": "^1.0.1"
- }
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/debrid-link-api": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/debrid-link-api/-/debrid-link-api-1.0.1.tgz",
- "integrity": "sha512-8b15xUosQ64v1wcN1cGSvt4YXm4dw7gi5hOvqPDOtvsEtlaH2pp/BdjS9/oUh866bPirFVzXrjnIwVK4dRsm3g==",
- "dependencies": {
- "request": "^2.83.0"
- }
- },
- "node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/diacritics": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz",
- "integrity": "sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA=="
- },
- "node_modules/dottie": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
- "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA=="
- },
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
- },
- "node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/es5-ext": {
- "version": "0.10.53",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
- "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
- "dependencies": {
- "es6-iterator": "~2.0.3",
- "es6-symbol": "~3.1.3",
- "next-tick": "~1.0.0"
- }
- },
- "node_modules/es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
- "dependencies": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "node_modules/es6-symbol": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
- "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
- "dependencies": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/event-emitter": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
- "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
- "dependencies": {
- "d": "1",
- "es5-ext": "~0.10.14"
- }
- },
- "node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/express-rate-limit": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz",
- "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==",
- "engines": {
- "node": ">= 12.9.0"
- },
- "peerDependencies": {
- "express": "^4 || ^5"
- }
- },
- "node_modules/ext": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
- "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
- "dependencies": {
- "type": "^2.0.0"
- }
- },
- "node_modules/ext/node_modules/type": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
- "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw=="
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "node_modules/external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "dependencies": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "engines": [
- "node >=0.6.0"
- ]
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
- "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
- },
- "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/figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "dependencies": {
- "escape-string-regexp": "^1.0.5"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "node_modules/get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dependencies": {
- "assert-plus": "^1.0.0"
- }
- },
- "node_modules/har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
- "deprecated": "this library is no longer supported",
- "dependencies": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hookified": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.5.0.tgz",
- "integrity": "sha512-4U0zw2ibOws7kfGdNCIL6oRg+t6ITxkgi9kUaJ71IDp0ZATHjvY6o7l90RBa/R8H2qOKl47SZISA5a3hNnei1g==",
- "license": "MIT"
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- },
- "engines": {
- "node": ">=0.8",
- "npm": ">=1.3.7"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "BSD-3-Clause"
- },
- "node_modules/inflection": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
- "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==",
- "engines": [
- "node >= 0.4.0"
- ],
- "license": "MIT"
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/inquirer": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
- "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
- "dependencies": {
- "ansi-escapes": "^3.2.0",
- "chalk": "^2.4.2",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^2.0.0",
- "lodash": "^4.17.12",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rxjs": "^6.4.0",
- "string-width": "^2.1.0",
- "strip-ansi": "^5.1.0",
- "through": "^2.3.6"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
- },
- "node_modules/is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
- },
- "node_modules/js-base64": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.3.tgz",
- "integrity": "sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg=="
- },
- "node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
- },
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
- },
- "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=="
- },
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
- },
- "node_modules/jsprim": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
- "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
- "dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/keygrip": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
- "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
- "dependencies": {
- "tsscmp": "1.0.6"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/keyv": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.2.1.tgz",
- "integrity": "sha512-tpIgCaY02VCW2Pz0zAn4guyct+IeH6Mb5wZdOvpe4oqXeQOJO0C3Wo8fTnf7P3ZD83Vr9kghbkNmzG3lTOhy/A==",
- "license": "MIT",
- "dependencies": {
- "@keyv/serialize": "*"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lodash.clonedeep": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/magnet-uri": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/magnet-uri/-/magnet-uri-6.2.0.tgz",
- "integrity": "sha512-O9AgdDwT771fnUj0giPYu/rACpz8173y8UXCSOdLITjOVfBenZ9H9q3FqQmveK+ORUMuD+BkKNSZP8C3+IMAKQ==",
- "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": {
- "bep53-range": "^1.1.0",
- "thirty-two": "^1.0.2"
- }
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/memory-pager": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
- "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
- },
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/moment": {
- "version": "2.29.4",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
- "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/moment-timezone": {
- "version": "0.5.46",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz",
- "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==",
- "license": "MIT",
- "dependencies": {
- "moment": "^2.29.4"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/mongodb-connection-string-url": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
- "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@types/whatwg-url": "^11.0.2",
- "whatwg-url": "^13.0.0"
- }
- },
- "node_modules/mongodb-connection-string-url/node_modules/tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "license": "MIT",
- "dependencies": {
- "punycode": "^2.3.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
- "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
- "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
- "license": "MIT",
- "dependencies": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "node_modules/mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
- },
- "node_modules/name-to-imdb": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/name-to-imdb/-/name-to-imdb-3.0.4.tgz",
- "integrity": "sha512-OVmDvWoAZso2eHxK51UK7TMIpUpM4LnI3KhvvZe+JkDatEda9WS3/YXZVQnand5skI38shoniOFcyrw08QsNeA==",
- "dependencies": {
- "diacritics": "~1.3.0",
- "named-queue": "^2.1.0",
- "needle": "^1.1.2",
- "node-fetch": "^2.2.0"
- }
- },
- "node_modules/named-queue": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/named-queue/-/named-queue-2.2.1.tgz",
- "integrity": "sha1-GBRURVNZnVqeQD0N+pN6TODR5qc="
- },
- "node_modules/needle": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/needle/-/needle-1.6.0.tgz",
- "integrity": "sha512-ogVK1D/Cgemw2vM1KJN6B83DwcKbDepdkMNtVJcXIe+xoaCOdC+aJHzhEov7xjsY9S7rBIuHP59W1fLsbGqDhA==",
- "dependencies": {
- "debug": "^2.1.2",
- "iconv-lite": "^0.4.4"
- },
- "bin": {
- "needle": "bin/needle"
- },
- "engines": {
- "node": ">= 0.10.x"
- }
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/next-tick": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
- "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
- },
- "node_modules/node-fetch": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
- "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
- "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/offcloud-api": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/offcloud-api/-/offcloud-api-1.0.2.tgz",
- "integrity": "sha512-KOxDX+QIUcI/JEwoXoRGK7P+RygSsmCOta/6bEtKeBMc9CDEnb9xgGNDjDFYCxm6U8rvaOhF9NA02i3EisH9Pw==",
- "dependencies": {
- "request": "^2.83.0"
- }
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "dependencies": {
- "mimic-fn": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/opn": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
- "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
- "dependencies": {
- "is-wsl": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/p-limit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
- "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==",
- "dependencies": {
- "yocto-queue": "^1.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parse-torrent-title": {
- "version": "1.3.0",
- "resolved": "git+ssh://git@github.com/TheBeastLT/parse-torrent-title.git#1bc3539e0d7c6686655ede649e6be8da53e4c217",
- "integrity": "sha512-9hs1yc4KzTv9BCbd+vunygRWggpUptyPJjL9Jo0VPxqg/jKlgd6Ku6HTsz1JeZQLobwYa0iNfoMgHk/f5gzdyg==",
- "license": "MIT",
- "dependencies": {
- "moment": "^2.24.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
- },
- "node_modules/pg": {
- "version": "8.13.1",
- "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz",
- "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==",
- "license": "MIT",
- "dependencies": {
- "pg-connection-string": "^2.7.0",
- "pg-pool": "^3.7.0",
- "pg-protocol": "^1.7.0",
- "pg-types": "^2.1.0",
- "pgpass": "1.x"
- },
- "engines": {
- "node": ">= 8.0.0"
- },
- "optionalDependencies": {
- "pg-cloudflare": "^1.1.1"
- },
- "peerDependencies": {
- "pg-native": ">=3.0.1"
- },
- "peerDependenciesMeta": {
- "pg-native": {
- "optional": true
- }
- }
- },
- "node_modules/pg-cloudflare": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz",
- "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/pg-connection-string": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz",
- "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==",
- "license": "MIT"
- },
- "node_modules/pg-int8": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
- "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/pg-pool": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz",
- "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==",
- "license": "MIT",
- "peerDependencies": {
- "pg": ">=8.0"
- }
- },
- "node_modules/pg-protocol": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz",
- "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==",
- "license": "MIT"
- },
- "node_modules/pg-types": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
- "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
- "dependencies": {
- "pg-int8": "1.0.1",
- "postgres-array": "~2.0.0",
- "postgres-bytea": "~1.0.0",
- "postgres-date": "~1.0.4",
- "postgres-interval": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pgpass": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz",
- "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==",
- "dependencies": {
- "split2": "^3.1.1"
- }
- },
- "node_modules/postgres-array": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
- "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postgres-bytea": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
- "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/postgres-date": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
- "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/postgres-interval": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
- "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
- "dependencies": {
- "xtend": "^4.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/premiumize-api": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/premiumize-api/-/premiumize-api-1.0.3.tgz",
- "integrity": "sha512-WwJhgmwrKrFFtfjU2EMAaYv602xbe52oaGEwVJXO3z0LZQZ8Cogk9MBADcT0hrFf8MuI7zn5cPMxcJRJPr9cMQ==",
- "dependencies": {
- "request": "^2.83.0"
- }
- },
- "node_modules/prom-client": {
- "version": "14.2.0",
- "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz",
- "integrity": "sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==",
- "license": "Apache-2.0",
- "dependencies": {
- "tdigest": "^0.1.1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- },
- "node_modules/psl": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/real-debrid-api": {
- "version": "1.0.1",
- "resolved": "git+ssh://git@github.com/TheBeastLT/node-real-debrid.git#d1f7eaa8593b947edbfbc8a92a176448b48ef445",
- "integrity": "sha512-P4eoA7/wvDM6/l06OZYX4CBnIzsTNwebdS6fZ4u6LZ3fcJqTzWz3D63xBDZmfcOca/OeUN4ncFld+KxvrNr0oA==",
- "license": "MIT",
- "dependencies": {
- "request": "^2.83.0"
- }
- },
- "node_modules/request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/request-ip": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz",
- "integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA=="
- },
- "node_modules/request/node_modules/qs": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
- "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "dependencies": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/retry-as-promised": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz",
- "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA=="
- },
- "node_modules/router": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/router/-/router-1.3.8.tgz",
- "integrity": "sha512-461UFH44NtSfIlS83PUg2N7OZo86BC/kB3dY77gJdsODsBhhw7+2uE0tzTINxrY9CahCUVk1VhpWCA5i1yoIEg==",
- "dependencies": {
- "array-flatten": "3.0.0",
- "debug": "2.6.9",
- "methods": "~1.1.2",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "setprototypeof": "1.2.0",
- "utils-merge": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/router/node_modules/array-flatten": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz",
- "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA=="
- },
- "node_modules/run-async": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz",
- "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==",
- "dependencies": {
- "is-promise": "^2.1.0"
- },
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/rxjs": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
- "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
- "dependencies": {
- "tslib": "^1.9.0"
- },
- "engines": {
- "npm": ">=2.0.0"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "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/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "node_modules/sequelize": {
- "version": "6.37.5",
- "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.5.tgz",
- "integrity": "sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/sequelize"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@types/debug": "^4.1.8",
- "@types/validator": "^13.7.17",
- "debug": "^4.3.4",
- "dottie": "^2.0.6",
- "inflection": "^1.13.4",
- "lodash": "^4.17.21",
- "moment": "^2.29.4",
- "moment-timezone": "^0.5.43",
- "pg-connection-string": "^2.6.1",
- "retry-as-promised": "^7.0.4",
- "semver": "^7.5.4",
- "sequelize-pool": "^7.1.0",
- "toposort-class": "^1.0.1",
- "uuid": "^8.3.2",
- "validator": "^13.9.0",
- "wkx": "^0.5.0"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependenciesMeta": {
- "ibm_db": {
- "optional": true
- },
- "mariadb": {
- "optional": true
- },
- "mysql2": {
- "optional": true
- },
- "oracledb": {
- "optional": true
- },
- "pg": {
- "optional": true
- },
- "pg-hstore": {
- "optional": true
- },
- "snowflake-sdk": {
- "optional": true
- },
- "sqlite3": {
- "optional": true
- },
- "tedious": {
- "optional": true
- }
- }
- },
- "node_modules/sequelize-pool": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
- "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/sequelize/node_modules/debug": {
- "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"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/sequelize/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=="
- },
- "node_modules/sequelize/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==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/sequelize/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
- "dependencies": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "node_modules/sparse-bitfield": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
- "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
- "dependencies": {
- "memory-pager": "^1.0.2"
- }
- },
- "node_modules/split2": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
- "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
- "dependencies": {
- "readable-stream": "^3.0.0"
- }
- },
- "node_modules/split2/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/stremio-addon-linter": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/stremio-addon-linter/-/stremio-addon-linter-1.7.0.tgz",
- "integrity": "sha512-ck1L1Wp2qvAhvXLj+4Lq1XRn8K3r2gx1i/f+e1W6K0+Et/oIYYDmaIVoh3SvExiNbCBcbJjH9WWEeDYKoqaMqQ==",
- "dependencies": {
- "semver": "^5.5.0"
- }
- },
- "node_modules/stremio-addon-sdk": {
- "version": "1.6.10",
- "resolved": "https://registry.npmjs.org/stremio-addon-sdk/-/stremio-addon-sdk-1.6.10.tgz",
- "integrity": "sha512-+U/lDGv73JPZa7OOy8eMb+SkUFhnHuZGBRXuKNeXcz706oDdwC/sQe9r8Wxw2A7Cw05+f/CQIJSl4zIcmKBkGg==",
- "dependencies": {
- "chalk": "^2.4.2",
- "cors": "^2.8.4",
- "express": "^4.16.3",
- "inquirer": "^6.2.2",
- "mkdirp": "^0.5.1",
- "node-fetch": "^2.3.0",
- "opn": "^5.4.0",
- "router": "^1.3.3",
- "stremio-addon-linter": "^1.7.0"
- },
- "bin": {
- "addon-bootstrap": "cli/bootstrap.js"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/string_decoder/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dependencies": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/string-width/node_modules/strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dependencies": {
- "ansi-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dependencies": {
- "ansi-regex": "^4.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/strip-ansi/node_modules/ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/swagger-stats": {
- "version": "0.99.7",
- "resolved": "https://registry.npmjs.org/swagger-stats/-/swagger-stats-0.99.7.tgz",
- "integrity": "sha512-niP70m99Cwpz/Fyfk8ydul1jM0pOKD6UofSaDzW2Op6o6WYFsuAl/BhVbmLkZWOAZ7IloDVvFj6vaU5zA0xydg==",
- "dependencies": {
- "axios": "^1.4.0",
- "basic-auth": "^2.0.1",
- "cookies": "^0.8.0",
- "debug": "^4.3.4",
- "moment": "^2.29.4",
- "path-to-regexp": "^6.2.1",
- "qs": "^6.11.2",
- "send": "^0.18.0",
- "uuid": "^9.0.0"
- },
- "peerDependencies": {
- "prom-client": ">= 10 <= 14"
- }
- },
- "node_modules/swagger-stats/node_modules/debug": {
- "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"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/swagger-stats/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=="
- },
- "node_modules/swagger-stats/node_modules/path-to-regexp": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
- "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw=="
- },
- "node_modules/swagger-stats/node_modules/qs": {
- "version": "6.11.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
- "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/swagger-stats/node_modules/uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
- "funding": [
- "https://github.com/sponsors/broofa",
- "https://github.com/sponsors/ctavan"
- ],
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/tdigest": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz",
- "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==",
- "dependencies": {
- "bintrees": "1.0.2"
- }
- },
- "node_modules/thirty-two": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz",
- "integrity": "sha1-TKL//AKlEpDSdEueP1V2k8prYno=",
- "engines": {
- "node": ">=0.2.6"
- }
- },
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "node_modules/tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "dependencies": {
- "os-tmpdir": "~1.0.2"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/toposort-class": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
- "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg="
- },
- "node_modules/tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "dependencies": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
- },
- "node_modules/tslib": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
- "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA=="
- },
- "node_modules/tsscmp": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
- "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
- "engines": {
- "node": ">=0.6.x"
- }
- },
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "dependencies": {
- "safe-buffer": "^5.0.1"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
- },
- "node_modules/type": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
- "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ua-parser-js": {
- "version": "1.0.36",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.36.tgz",
- "integrity": "sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/ua-parser-js"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/faisalman"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/faisalman"
- }
- ],
- "engines": {
- "node": "*"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/urijs": {
- "version": "1.19.11",
- "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz",
- "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ=="
- },
- "node_modules/user-agents": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/user-agents/-/user-agents-1.1.9.tgz",
- "integrity": "sha512-XxKEWX2bHJzPjvUPRAtw+oPQchReLaR1s59iO/RhBA2TfLLgLUsFvz5MupsejqFfuhXZmZRH8t3kHBvS0ctzGg==",
- "dependencies": {
- "lodash.clonedeep": "^4.5.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
- "bin": {
- "uuid": "bin/uuid"
- }
- },
- "node_modules/validator": {
- "version": "13.12.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz",
- "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "engines": [
- "node >=0.6.0"
- ],
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "node_modules/wkx": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
- "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "node_modules/yocto-queue": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
- "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- }
- }
-}
diff --git a/addon/package.json b/addon/package.json
deleted file mode 100644
index 90ea4ab..0000000
--- a/addon/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "name": "stremio-torrentio",
- "version": "1.0.14",
- "exports": "./index.js",
- "type": "module",
- "scripts": {
- "start": "node index.js"
- },
- "author": "TheBeastLT ",
- "license": "MIT",
- "dependencies": {
- "@keyv/mongo": "^3.0.1",
- "@putdotio/api-client": "^8.42.0",
- "all-debrid-api": "^1.2.0",
- "axios": "^1.7.7",
- "cacheable": "^1.8.4",
- "cors": "^2.8.5",
- "debrid-link-api": "^1.0.1",
- "express-rate-limit": "^6.7.0",
- "magnet-uri": "^6.2.0",
- "name-to-imdb": "^3.0.4",
- "named-queue": "^2.2.1",
- "offcloud-api": "^1.0.2",
- "p-limit": "^5.0.0",
- "parse-torrent-title": "git://github.com/TheBeastLT/parse-torrent-title.git#1bc3539e0d7c6686655ede649e6be8da53e4c217",
- "pg": "^8.8.0",
- "premiumize-api": "^1.0.3",
- "prom-client": "^14.2.0",
- "real-debrid-api": "git://github.com/TheBeastLT/node-real-debrid.git#d1f7eaa8593b947edbfbc8a92a176448b48ef445",
- "request-ip": "^3.3.0",
- "router": "^1.3.8",
- "sequelize": "^6.29.0",
- "stremio-addon-sdk": "^1.6.10",
- "swagger-stats": "^0.99.7",
- "ua-parser-js": "^1.0.36",
- "user-agents": "^1.0.1444"
- }
-}
diff --git a/addon/serverless.js b/addon/serverless.js
deleted file mode 100644
index 7455a21..0000000
--- a/addon/serverless.js
+++ /dev/null
@@ -1,112 +0,0 @@
-import Router from 'router';
-import cors from 'cors';
-import rateLimit from "express-rate-limit";
-import requestIp from 'request-ip';
-import userAgentParser from 'ua-parser-js';
-import addonInterface from './addon.js';
-import qs from 'querystring';
-import { manifest } from './lib/manifest.js';
-import { parseConfiguration, PreConfigurations } from './lib/configuration.js';
-import landingTemplate from './lib/landingTemplate.js';
-import * as moch from './moch/moch.js';
-
-const router = new Router();
-const limiter = rateLimit({
- windowMs: 60 * 60 * 1000, // 1 hour
- max: 300, // limit each IP to 300 requests per windowMs
- headers: false,
- keyGenerator: (req) => requestIp.getClientIp(req)
-})
-
-router.use(cors())
-router.get('/', (_, res) => {
- res.redirect('/configure')
- res.end();
-});
-
-router.get(`/:preconfiguration(${Object.keys(PreConfigurations).join('|')})`, (req, res) => {
- res.redirect(`/${req.params.preconfiguration}/configure`)
- res.end();
-});
-
-router.get('/:configuration?/configure', (req, res) => {
- const configValues = parseConfiguration(req.params.configuration || '');
- const landingHTML = landingTemplate(manifest(configValues), configValues);
- res.setHeader('content-type', 'text/html');
- res.end(landingHTML);
-});
-
-router.get('/:configuration?/manifest.json', (req, res) => {
- const configValues = parseConfiguration(req.params.configuration || '');
- const manifestBuf = JSON.stringify(manifest(configValues));
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
- res.end(manifestBuf)
-});
-
-router.get('/:configuration?/:resource/:type/:id/:extra?.json', limiter, (req, res, next) => {
- const { configuration, resource, type, id } = req.params;
- const extra = req.params.extra ? qs.parse(req.url.split('/').pop().slice(0, -5)) : {}
- const ip = requestIp.getClientIp(req);
- const host = `${req.protocol}://${req.headers.host}`;
- const configValues = { ...extra, ...parseConfiguration(configuration), id, type, ip, host };
- addonInterface.get(resource, type, id, configValues)
- .then(resp => {
- const cacheHeaders = {
- cacheMaxAge: 'max-age',
- staleRevalidate: 'stale-while-revalidate',
- staleError: 'stale-if-error'
- };
- const cacheControl = Object.keys(cacheHeaders)
- .map(prop => Number.isInteger(resp[prop]) && cacheHeaders[prop] + '=' + resp[prop])
- .filter(val => !!val).join(', ');
-
- res.setHeader('Cache-Control', `${cacheControl}, public`);
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
- res.end(JSON.stringify(resp));
- })
- .catch(err => {
- if (err.noHandler) {
- if (next) {
- next()
- } else {
- res.writeHead(404);
- res.end(JSON.stringify({ err: 'not found' }));
- }
- } else {
- console.error(err);
- res.writeHead(500);
- res.end(JSON.stringify({ err: 'handler error' }));
- }
- });
-});
-
-router.get('/:moch/:apiKey/:infoHash/:cachedEntryInfo/:fileIndex/:filename?', (req, res) => {
- const userAgent = req.headers['user-agent'] || '';
- const parameters = {
- mochKey: req.params.moch,
- apiKey: req.params.apiKey,
- infoHash: req.params.infoHash.toLowerCase(),
- fileIndex: isNaN(req.params.fileIndex) ? undefined : parseInt(req.params.fileIndex),
- cachedEntryInfo: req.params.cachedEntryInfo,
- ip: requestIp.getClientIp(req),
- host: `${req.protocol}://${req.headers.host}`,
- isBrowser: !userAgent.includes('Stremio') && !!userAgentParser(userAgent).browser.name
- }
- moch.resolve(parameters)
- .then(url => {
- res.writeHead(302, { Location: url });
- res.end();
- })
- .catch(error => {
- console.log(error);
- res.statusCode = 404;
- res.end();
- });
-});
-
-export default function (req, res) {
- router(req, res, function () {
- res.statusCode = 404;
- res.end();
- });
-};
diff --git a/addon/static/videos/blocked_access_v1.mp4 b/addon/static/videos/blocked_access_v1.mp4
deleted file mode 100644
index ed72c9a..0000000
Binary files a/addon/static/videos/blocked_access_v1.mp4 and /dev/null differ
diff --git a/addon/static/videos/download_failed_v2.mp4 b/addon/static/videos/download_failed_v2.mp4
deleted file mode 100644
index 0240e64..0000000
Binary files a/addon/static/videos/download_failed_v2.mp4 and /dev/null differ
diff --git a/addon/static/videos/downloading_v2.mp4 b/addon/static/videos/downloading_v2.mp4
deleted file mode 100644
index c0e29e8..0000000
Binary files a/addon/static/videos/downloading_v2.mp4 and /dev/null differ
diff --git a/addon/static/videos/failed_access_v2.mp4 b/addon/static/videos/failed_access_v2.mp4
deleted file mode 100644
index f5b3c28..0000000
Binary files a/addon/static/videos/failed_access_v2.mp4 and /dev/null differ
diff --git a/addon/static/videos/failed_infringement_v2.mp4 b/addon/static/videos/failed_infringement_v2.mp4
deleted file mode 100644
index c538fc0..0000000
Binary files a/addon/static/videos/failed_infringement_v2.mp4 and /dev/null differ
diff --git a/addon/static/videos/failed_opening_v2.mp4 b/addon/static/videos/failed_opening_v2.mp4
deleted file mode 100644
index d12247e..0000000
Binary files a/addon/static/videos/failed_opening_v2.mp4 and /dev/null differ
diff --git a/addon/static/videos/failed_rar_v2.mp4 b/addon/static/videos/failed_rar_v2.mp4
deleted file mode 100644
index 8bd04cb..0000000
Binary files a/addon/static/videos/failed_rar_v2.mp4 and /dev/null differ
diff --git a/addon/static/videos/failed_too_big_v1.mp4 b/addon/static/videos/failed_too_big_v1.mp4
deleted file mode 100644
index a479712..0000000
Binary files a/addon/static/videos/failed_too_big_v1.mp4 and /dev/null differ
diff --git a/addon/static/videos/failed_unexpected_v2.mp4 b/addon/static/videos/failed_unexpected_v2.mp4
deleted file mode 100644
index 3ca2b3a..0000000
Binary files a/addon/static/videos/failed_unexpected_v2.mp4 and /dev/null differ
diff --git a/addon/static/videos/limits_exceeded_v1.mp4 b/addon/static/videos/limits_exceeded_v1.mp4
deleted file mode 100644
index 3e80a1e..0000000
Binary files a/addon/static/videos/limits_exceeded_v1.mp4 and /dev/null differ
diff --git a/catalogs/.dockerignore b/catalogs/.dockerignore
deleted file mode 100644
index 5538a38..0000000
--- a/catalogs/.dockerignore
+++ /dev/null
@@ -1,3 +0,0 @@
-**/node_modules
-**/npm-debug.log
-**/.env
\ No newline at end of file
diff --git a/catalogs/Dockerfile b/catalogs/Dockerfile
deleted file mode 100644
index d51871f..0000000
--- a/catalogs/Dockerfile
+++ /dev/null
@@ -1,12 +0,0 @@
-FROM node:16-alpine
-
-RUN apk update && apk upgrade && \
- apk add --no-cache git
-
-WORKDIR /home/node/app
-
-COPY ./catalogs .
-COPY ./addon ../addon
-RUN npm ci --only-production
-
-CMD [ "node", "index.js" ]
\ No newline at end of file
diff --git a/catalogs/addon.js b/catalogs/addon.js
deleted file mode 100644
index 8ab1b2c..0000000
--- a/catalogs/addon.js
+++ /dev/null
@@ -1,99 +0,0 @@
-import Bottleneck from 'bottleneck';
-import moment from 'moment';
-import { addonBuilder } from 'stremio-addon-sdk';
-import { Providers } from '../addon/lib/filter.js';
-import { createManifest, genres } from './lib/manifest.js';
-import { getMetas } from './lib/metadata.js';
-import { cacheWrapCatalog, cacheWrapIds } from './lib/cache.js';
-import * as repository from './lib/repository.js';
-
-const CACHE_MAX_AGE = parseInt(process.env.CACHE_MAX_AGE) || 4 * 60 * 60; // 4 hours in seconds
-const STALE_REVALIDATE_AGE = 4 * 60 * 60; // 4 hours
-const STALE_ERROR_AGE = 7 * 24 * 60 * 60; // 7 days
-
-const manifest = createManifest();
-const builder = new addonBuilder(manifest);
-const limiter = new Bottleneck({
- maxConcurrent: process.env.LIMIT_MAX_CONCURRENT || 20,
- highWater: process.env.LIMIT_QUEUE_SIZE || 50,
- strategy: Bottleneck.strategy.OVERFLOW
-});
-const defaultProviders = Providers.options
- .filter(provider => !provider.foreign)
- .map(provider => provider.label)
- .sort();
-
-builder.defineCatalogHandler((args) => {
- const offset = parseInt(args.extra.skip || '0', 10);
- const genre = args.extra.genre || 'default';
- const catalog = manifest.catalogs.find(c => c.id === args.id);
- const providers = defaultProviders;
- console.log(`Incoming catalog ${args.id} request with genre=${genre} and skip=${offset}`);
- if (!catalog) {
- return Promise.reject(`No catalog found for with id: ${args.id}`);
- }
-
- const cacheKey = createCacheKey(catalog.id, providers, genre, offset);
- return limiter.schedule(() => cacheWrapCatalog(cacheKey, () => getCatalog(catalog, providers, genre, offset)))
- .then(metas => ({
- metas: metas,
- cacheMaxAge: CACHE_MAX_AGE,
- staleRevalidate: STALE_REVALIDATE_AGE,
- staleError: STALE_ERROR_AGE
- }))
- .catch(error => Promise.reject(`Failed retrieving catalog ${args.id}: ${error.message || error}`));
-})
-
-async function getCursor(catalog, providers, genre, offset) {
- if (offset === 0) {
- return undefined;
- }
- const previousOffset = offset - catalog.pageSize;
- const previousCacheKey = createCacheKey(catalog.id, providers, genre, previousOffset);
- return cacheWrapCatalog(previousCacheKey, () => Promise.reject("cursor not found"))
- .then(metas => metas[metas.length - 1])
- .then(meta => meta.id.replace('kitsu:', ''))
-}
-
-async function getCatalog(catalog, providers, genre, offset) {
- const cursor = await getCursor(catalog, providers, genre, offset)
- const startDate = getStartDate(genre)?.toISOString();
- const endDate = getEndDate(genre)?.toISOString();
- const cacheKey = createCacheKey(catalog.id, providers, genre);
-
- return cacheWrapIds(cacheKey, () => repository.getIds(providers, catalog.type, startDate, endDate))
- .then(ids => ids.slice(ids.indexOf(cursor) + 1))
- .then(ids => getMetas(ids, catalog.type))
- .then(metas => metas.slice(0, catalog.pageSize));
-}
-
-function getStartDate(genre) {
- switch (genre) {
- case genres[0]: return moment().utc().subtract(1, 'day').startOf('day');
- case genres[1]: return moment().utc().startOf('isoWeek');
- case genres[2]: return moment().utc().subtract(7, 'day').startOf('isoWeek');
- case genres[3]: return moment().utc().startOf('month');
- case genres[4]: return moment().utc().subtract(30, 'day').startOf('month');
- case genres[5]: return undefined;
- default: return moment().utc().subtract(30, 'day').startOf('day');
- }
-}
-
-function getEndDate(genre) {
- switch (genre) {
- case genres[0]: return moment().utc().subtract(1, 'day').endOf('day');
- case genres[1]: return moment().utc().endOf('isoWeek');
- case genres[2]: return moment().utc().subtract(7, 'day').endOf('isoWeek');
- case genres[3]: return moment().utc().endOf('month');
- case genres[4]: return moment().utc().subtract(30, 'day').endOf('month');
- case genres[5]: return undefined;
- default: return moment().utc().subtract(1, 'day').endOf('day');
- }
-}
-
-function createCacheKey(catalogId, providers, genre, offset) {
- const dateKey = moment().format('YYYY-MM-DD');
- return [catalogId, providers.join(','), genre, dateKey, offset].filter(x => x !== undefined).join('|');
-}
-
-export default builder.getInterface();
diff --git a/catalogs/index.js b/catalogs/index.js
deleted file mode 100644
index 3d55fa9..0000000
--- a/catalogs/index.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import express from 'express';
-import serverless from './serverless.js';
-
-const app = express();
-
-app.use((req, res, next) => serverless(req, res, next));
-app.listen(process.env.PORT || 7000, () => {
- console.log(`Started addon at: http://localhost:${process.env.PORT || 7000}`);
-});
diff --git a/catalogs/lib/cache.js b/catalogs/lib/cache.js
deleted file mode 100644
index 9551490..0000000
--- a/catalogs/lib/cache.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import KeyvMongo from "@keyv/mongo";
-
-const CATALOG_TTL = 24 * 60 * 60 * 1000; // 24 hours
-
-const MONGO_URI = process.env.MONGODB_URI;
-
-const remoteCache = MONGO_URI && new KeyvMongo(MONGO_URI, { collection: 'torrentio_catalog_collection' });
-
-async function cacheWrap(cache, key, method, ttl) {
- if (!cache) {
- return method();
- }
- const value = await cache.get(key);
- if (value !== undefined) {
- return value;
- }
- const result = await method();
- await cache.set(key, result, ttl);
- return result;
-}
-
-export function cacheWrapCatalog(key, method) {
- return cacheWrap(remoteCache, key, method, CATALOG_TTL);
-}
-
-export function cacheWrapIds(key, method) {
- return cacheWrap(remoteCache, `ids|${key}`, method, CATALOG_TTL);
-}
diff --git a/catalogs/lib/landingTemplate.js b/catalogs/lib/landingTemplate.js
deleted file mode 100644
index 68f6090..0000000
--- a/catalogs/lib/landingTemplate.js
+++ /dev/null
@@ -1,274 +0,0 @@
-const STYLESHEET = `
-* {
- box-sizing: border-box;
-}
-
-body,
-html {
- margin: 0;
- padding: 0;
- width: 100%;
- height: 100%
-}
-
-html {
- background-size: auto 100%;
- background-size: cover;
- background-position: center center;
- background-repeat: repeat-y;
-}
-
-body {
- display: flex;
- background-color: transparent;
- font-family: 'Open Sans', Arial, sans-serif;
- color: white;
-}
-
-h1 {
- font-size: 4.5vh;
- font-weight: 700;
-}
-
-h2 {
- font-size: 2.2vh;
- font-weight: normal;
- font-style: italic;
- opacity: 0.8;
-}
-
-h3 {
- font-size: 2.2vh;
-}
-
-h1,
-h2,
-h3,
-p,
-label {
- margin: 0;
- text-shadow: 0 0 1vh rgba(0, 0, 0, 0.15);
-}
-
-p {
- font-size: 1.75vh;
-}
-
-ul {
- font-size: 1.75vh;
- margin: 0;
- margin-top: 1vh;
- padding-left: 3vh;
-}
-
-a {
- color: green
-}
-
-a.install-link {
- text-decoration: none
-}
-
-button {
- border: 0;
- outline: 0;
- color: white;
- background: #8A5AAB;
- padding: 1.2vh 3.5vh;
- margin: auto;
- text-align: center;
- font-family: 'Open Sans', Arial, sans-serif;
- font-size: 2.2vh;
- font-weight: 600;
- cursor: pointer;
- display: block;
- box-shadow: 0 0.5vh 1vh rgba(0, 0, 0, 0.2);
- transition: box-shadow 0.1s ease-in-out;
-}
-
-button:hover {
- box-shadow: none;
-}
-
-button:active {
- box-shadow: 0 0 0 0.5vh white inset;
-}
-
-#addon {
- width: 90vh;
- margin: auto;
- padding-left: 10%;
- padding-right: 10%;
- background: rgba(0, 0, 0, 0.60);
-}
-
-.logo {
- height: 14vh;
- width: 14vh;
- margin: auto;
- margin-bottom: 3vh;
-}
-
-.logo img {
- width: 100%;
-}
-
-.name, .version {
- display: inline-block;
- vertical-align: top;
-}
-
-.name {
- line-height: 5vh;
-}
-
-.version {
- position: absolute;
- line-height: 5vh;
- margin-left: 1vh;
- opacity: 0.8;
-}
-
-.contact {
- position: absolute;
- left: 0;
- bottom: 4vh;
- width: 100%;
- text-align: center;
-}
-
-.contact a {
- font-size: 1.4vh;
- font-style: italic;
-}
-
-.separator {
- margin-bottom: 4vh;
-}
-
-.label {
- font-size: 2.2vh;
- font-weight: 600;
- padding: 0;
- line-height: inherit;
-}
-
-.btn-group, .multiselect-container {
- width: 100%;
-}
-
-.btn {
- text-align: left;
-}
-
-.multiselect-container {
- border: 0;
- border-radius: 0;
-}
-
-.input, .btn {
- height: 3.8vh;
- width: 100%;
- margin: auto;
- margin-bottom: 10px;
- padding: 6px 12px;
- border: 0;
- border-radius: 0;
- outline: 0;
- color: #333;
- background-color: rgb(255, 255, 255);
- box-shadow: 0 0.5vh 1vh rgba(0, 0, 0, 0.2);
-}
-`;
-import { Providers } from '../../addon/lib/filter.js';
-
-export default function landingTemplate(manifest, config = {}) {
- const providers = config.providers || [];
-
- const background = manifest.background || 'https://dl.strem.io/addon-background.jpg';
- const logo = manifest.logo || 'https://dl.strem.io/addon-logo.png';
- const contactHTML = manifest.contactEmail ?
- `` : '';
- const providersHTML = Providers.options
- .map(provider => ``)
- .join('\n');
- const stylizedTypes = manifest.types
- .map(t => t[0].toUpperCase() + t.slice(1) + (t !== 'series' ? 's' : ''));
-
- return `
-
-
-
-
-
- ${manifest.name} - Stremio Addon
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

-
-
${manifest.name}
-
${manifest.version || '0.0.0'}
-
${manifest.description || ''}
-
-
-
-
This addon has more :
-
- ${stylizedTypes.map(t => `- ${t}
`).join('')}
-
-
-
-
-
-
-
-
-
-
-
-
- ${contactHTML}
-
-
-
-
- `
-}
diff --git a/catalogs/lib/manifest.js b/catalogs/lib/manifest.js
deleted file mode 100644
index 37cbb99..0000000
--- a/catalogs/lib/manifest.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import { Type } from '../../addon/lib/types.js';
-
-export const genres = [
- 'Yesterday',
- 'This Week',
- 'Last Week',
- 'This Month',
- 'Last Month',
- 'All Time'
-]
-
-export function createManifest() {
- return {
- id: 'com.stremio.torrentio.catalog.addon',
- version: '1.0.2',
- name: 'Torrent Catalogs',
- description: 'Provides catalogs for movies/series/anime based on top seeded torrents. Requires Kitsu addon for anime.',
- logo: `https://i.ibb.co/w4BnkC9/GwxAcDV.png`,
- background: `https://i.ibb.co/VtSfFP9/t8wVwcg.jpg`,
- types: [Type.MOVIE, Type.SERIES, Type.ANIME],
- resources: ['catalog'],
- catalogs: [
- {
- id: 'top-movies',
- type: Type.MOVIE,
- name: "Top seeded",
- pageSize: 20,
- extra: [{ name: 'genre', options: genres }, { name: 'skip' }],
- genres: genres
- },
- {
- id: 'top-series',
- type: Type.SERIES,
- name: "Top seeded",
- pageSize: 20,
- extra: [{ name: 'genre', options: genres }, { name: 'skip' }],
- genres: genres
- },
- {
- id: 'top-anime',
- type: Type.ANIME,
- name: "Top seeded",
- pageSize: 20,
- extra: [{ name: 'genre', options: genres }, { name: 'skip' }],
- genres: genres
- }
- ],
- behaviorHints: {
- // @TODO might enable configuration to configure providers
- configurable: false,
- configurationRequired: false
- }
- };
-}
diff --git a/catalogs/lib/metadata.js b/catalogs/lib/metadata.js
deleted file mode 100644
index e397946..0000000
--- a/catalogs/lib/metadata.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import axios from 'axios';
-import { Type } from '../../addon/lib/types.js';
-
-const CINEMETA_URL = 'https://v3-cinemeta.strem.io';
-const KITSU_URL = 'https://anime-kitsu.strem.fun';
-const TIMEOUT = 30000;
-const MAX_SIZE = 40;
-
-export async function getMetas(ids, type) {
- if (!ids.length || !type) {
- return [];
- }
-
- return _requestMetadata(ids, type)
- .catch((error) => {
- throw new Error(`failed metadata ${type} query due: ${error.message}`);
- });
-}
-
-function _requestMetadata(ids, type) {
- const url = _getUrl(ids, type);
- return axios.get(url, { timeout: TIMEOUT })
- .then(response => response?.data?.metas || response?.data?.metasDetailed || [])
- .then(metas => metas.filter(meta => meta))
- .then(metas => metas.map(meta => _sanitizeMeta(meta)));
-}
-
-function _getUrl(ids, type) {
- const joinedIds = ids.slice(0, MAX_SIZE).join(',');
- if (type === Type.ANIME) {
- return `${KITSU_URL}/catalog/${type}/kitsu-anime-list/lastVideosIds=${joinedIds}.json`;
- }
- return `${CINEMETA_URL}/catalog/${type}/last-videos/lastVideosIds=${joinedIds}.json`;
-}
-
-function _sanitizeMeta(meta) {
- delete meta.videos;
- delete meta.credits_cast;
- delete meta.credits_crew;
- return meta;
-}
diff --git a/catalogs/lib/repository.js b/catalogs/lib/repository.js
deleted file mode 100644
index c32dd9e..0000000
--- a/catalogs/lib/repository.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import { Sequelize, QueryTypes } from 'sequelize';
-import { Type } from '../../addon/lib/types.js';
-
-const DATABASE_URI = process.env.DATABASE_URI;
-
-const database = new Sequelize(DATABASE_URI, { logging: false });
-
-export async function getIds(providers, type, startDate, endDate) {
- const idName = type === Type.ANIME ? 'kitsuId' : 'imdbId';
- const episodeCondition = type === Type.SERIES
- ? 'AND files."imdbSeason" IS NOT NULL AND files."imdbEpisode" IS NOT NULL'
- : '';
- const dateCondition = startDate && endDate
- ? `AND "uploadDate" BETWEEN '${startDate}' AND '${endDate}'`
- : '';
- const providersCondition = providers && providers.length
- ? `AND provider in (${providers.map(it => `'${it}'`).join(',')})`
- : '';
- const titleCondition = type === Type.MOVIE
- ? 'AND torrents.title NOT LIKE \'%[Erotic]%\''
- : '';
- const sortCondition = type === Type.MOVIE ? 'sum(torrents.seeders)' : 'max(torrents.seeders)';
- const query = `SELECT files."${idName}"
- FROM (SELECT torrents."infoHash", torrents.seeders FROM torrents
- WHERE seeders > 0 AND type = '${type}' ${providersCondition} ${dateCondition} ${titleCondition}
- ) as torrents
- JOIN files ON torrents."infoHash" = files."infoHash"
- WHERE files."${idName}" IS NOT NULL ${episodeCondition}
- GROUP BY files."${idName}"
- ORDER BY ${sortCondition} DESC
- LIMIT 5000`
- const results = await database.query(query, { type: QueryTypes.SELECT });
- return results.map(result => `${result.imdbId || result.kitsuId}`);
-}
diff --git a/catalogs/package-lock.json b/catalogs/package-lock.json
deleted file mode 100644
index fc8f210..0000000
--- a/catalogs/package-lock.json
+++ /dev/null
@@ -1,3145 +0,0 @@
-{
- "name": "stremio-torrentio-catalogs",
- "version": "1.0.3",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "stremio-torrentio-catalogs",
- "version": "1.0.3",
- "license": "MIT",
- "dependencies": {
- "@keyv/mongo": "^3.0.1",
- "axios": "^1.7.7",
- "bottleneck": "^2.19.5",
- "moment": "^2.30.1",
- "pg": "^8.8.0",
- "pg-hstore": "^2.3.4",
- "request-ip": "^3.3.0",
- "sequelize": "^6.29.0",
- "stremio-addon-sdk": "^1.6.10"
- },
- "engines": {
- "node": ">=16.x"
- }
- },
- "node_modules/@keyv/mongo": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@keyv/mongo/-/mongo-3.0.1.tgz",
- "integrity": "sha512-dNVIhm68mh/CAySN6q7o1vyBRdBRt41nrJXIDlqLhnXOo4l8IAY1Vj5BlTkUfw1BDLuZ9zjb+g1lr/BMRdzNdg==",
- "license": "MIT",
- "dependencies": {
- "mongodb": "^6.8.0"
- }
- },
- "node_modules/@keyv/mongo/node_modules/bson": {
- "version": "6.9.0",
- "resolved": "https://registry.npmjs.org/bson/-/bson-6.9.0.tgz",
- "integrity": "sha512-X9hJeyeM0//Fus+0pc5dSUMhhrrmWwQUtdavaQeF3Ta6m69matZkGWV/MrBcnwUeLC8W9kwwc2hfkZgUuCX3Ig==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">=16.20.1"
- }
- },
- "node_modules/@keyv/mongo/node_modules/mongodb": {
- "version": "6.10.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.10.0.tgz",
- "integrity": "sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@mongodb-js/saslprep": "^1.1.5",
- "bson": "^6.7.0",
- "mongodb-connection-string-url": "^3.0.0"
- },
- "engines": {
- "node": ">=16.20.1"
- },
- "peerDependencies": {
- "@aws-sdk/credential-providers": "^3.188.0",
- "@mongodb-js/zstd": "^1.1.0",
- "gcp-metadata": "^5.2.0",
- "kerberos": "^2.0.1",
- "mongodb-client-encryption": ">=6.0.0 <7",
- "snappy": "^7.2.2",
- "socks": "^2.7.1"
- },
- "peerDependenciesMeta": {
- "@aws-sdk/credential-providers": {
- "optional": true
- },
- "@mongodb-js/zstd": {
- "optional": true
- },
- "gcp-metadata": {
- "optional": true
- },
- "kerberos": {
- "optional": true
- },
- "mongodb-client-encryption": {
- "optional": true
- },
- "snappy": {
- "optional": true
- },
- "socks": {
- "optional": true
- }
- }
- },
- "node_modules/@mongodb-js/saslprep": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz",
- "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==",
- "license": "MIT",
- "dependencies": {
- "sparse-bitfield": "^3.0.3"
- }
- },
- "node_modules/@types/debug": {
- "version": "4.1.12",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
- "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
- "license": "MIT",
- "dependencies": {
- "@types/ms": "*"
- }
- },
- "node_modules/@types/ms": {
- "version": "0.7.34",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
- "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==",
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "18.0.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz",
- "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA=="
- },
- "node_modules/@types/validator": {
- "version": "13.12.2",
- "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz",
- "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==",
- "license": "MIT"
- },
- "node_modules/@types/webidl-conversions": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
- "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
- "license": "MIT"
- },
- "node_modules/@types/whatwg-url": {
- "version": "11.0.5",
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
- "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
- "license": "MIT",
- "dependencies": {
- "@types/webidl-conversions": "*"
- }
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ansi-regex": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
- "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "node_modules/axios": {
- "version": "1.7.7",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
- "license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
- "node_modules/body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/bottleneck": {
- "version": "2.19.5",
- "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz",
- "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
- },
- "node_modules/cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "dependencies": {
- "restore-cursor": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
- "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "node_modules/cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "dependencies": {
- "object-assign": "^4",
- "vary": "^1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/dottie": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
- "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA=="
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "license": "MIT"
- },
- "node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "license": "MIT",
- "dependencies": {
- "get-intrinsic": "^1.2.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "license": "MIT"
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/express": {
- "version": "4.21.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
- "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
- "license": "MIT",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.7.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.3",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.10",
- "proxy-addr": "~2.0.7",
- "qs": "6.13.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/express/node_modules/path-to-regexp": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
- "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
- "license": "MIT"
- },
- "node_modules/external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "dependencies": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "dependencies": {
- "escape-string-regexp": "^1.0.5"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "license": "MIT",
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "license": "MIT",
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/inflection": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
- "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==",
- "engines": [
- "node >= 0.4.0"
- ],
- "license": "MIT"
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/inquirer": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
- "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
- "dependencies": {
- "ansi-escapes": "^3.2.0",
- "chalk": "^2.4.2",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^2.0.0",
- "lodash": "^4.17.12",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rxjs": "^6.4.0",
- "string-width": "^2.1.0",
- "strip-ansi": "^5.1.0",
- "through": "^2.3.6"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
- "node_modules/is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/memory-pager": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
- "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "license": "MIT",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
- },
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/moment": {
- "version": "2.30.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
- "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/moment-timezone": {
- "version": "0.5.46",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz",
- "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==",
- "license": "MIT",
- "dependencies": {
- "moment": "^2.29.4"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/mongodb-connection-string-url": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
- "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@types/whatwg-url": "^11.0.2",
- "whatwg-url": "^13.0.0"
- }
- },
- "node_modules/mongodb-connection-string-url/node_modules/tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "license": "MIT",
- "dependencies": {
- "punycode": "^2.3.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
- "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
- "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
- "license": "MIT",
- "dependencies": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "node_modules/mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/node-fetch": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
- "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.3",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
- "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "license": "MIT",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "dependencies": {
- "mimic-fn": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/opn": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
- "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
- "dependencies": {
- "is-wsl": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
- "license": "MIT"
- },
- "node_modules/pg": {
- "version": "8.13.1",
- "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz",
- "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==",
- "license": "MIT",
- "dependencies": {
- "pg-connection-string": "^2.7.0",
- "pg-pool": "^3.7.0",
- "pg-protocol": "^1.7.0",
- "pg-types": "^2.1.0",
- "pgpass": "1.x"
- },
- "engines": {
- "node": ">= 8.0.0"
- },
- "optionalDependencies": {
- "pg-cloudflare": "^1.1.1"
- },
- "peerDependencies": {
- "pg-native": ">=3.0.1"
- },
- "peerDependenciesMeta": {
- "pg-native": {
- "optional": true
- }
- }
- },
- "node_modules/pg-cloudflare": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz",
- "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/pg-connection-string": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz",
- "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==",
- "license": "MIT"
- },
- "node_modules/pg-hstore": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.4.tgz",
- "integrity": "sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==",
- "dependencies": {
- "underscore": "^1.13.1"
- },
- "engines": {
- "node": ">= 0.8.x"
- }
- },
- "node_modules/pg-int8": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
- "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/pg-pool": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz",
- "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==",
- "license": "MIT",
- "peerDependencies": {
- "pg": ">=8.0"
- }
- },
- "node_modules/pg-protocol": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz",
- "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==",
- "license": "MIT"
- },
- "node_modules/pg-types": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
- "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
- "dependencies": {
- "pg-int8": "1.0.1",
- "postgres-array": "~2.0.0",
- "postgres-bytea": "~1.0.0",
- "postgres-date": "~1.0.4",
- "postgres-interval": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/pgpass": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz",
- "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==",
- "dependencies": {
- "split2": "^3.1.1"
- }
- },
- "node_modules/postgres-array": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
- "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postgres-bytea": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
- "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/postgres-date": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
- "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/postgres-interval": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
- "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
- "dependencies": {
- "xtend": "^4.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "side-channel": "^1.0.6"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
- "license": "MIT",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/request-ip": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz",
- "integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA=="
- },
- "node_modules/restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "dependencies": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/retry-as-promised": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz",
- "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA=="
- },
- "node_modules/router": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/router/-/router-1.3.8.tgz",
- "integrity": "sha512-461UFH44NtSfIlS83PUg2N7OZo86BC/kB3dY77gJdsODsBhhw7+2uE0tzTINxrY9CahCUVk1VhpWCA5i1yoIEg==",
- "license": "MIT",
- "dependencies": {
- "array-flatten": "3.0.0",
- "debug": "2.6.9",
- "methods": "~1.1.2",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "setprototypeof": "1.2.0",
- "utils-merge": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/router/node_modules/array-flatten": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz",
- "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA=="
- },
- "node_modules/run-async": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz",
- "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==",
- "dependencies": {
- "is-promise": "^2.1.0"
- },
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/rxjs": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
- "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
- "dependencies": {
- "tslib": "^1.9.0"
- },
- "engines": {
- "npm": ">=2.0.0"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "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/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/send": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "license": "MIT"
- },
- "node_modules/sequelize": {
- "version": "6.37.5",
- "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.5.tgz",
- "integrity": "sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/sequelize"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@types/debug": "^4.1.8",
- "@types/validator": "^13.7.17",
- "debug": "^4.3.4",
- "dottie": "^2.0.6",
- "inflection": "^1.13.4",
- "lodash": "^4.17.21",
- "moment": "^2.29.4",
- "moment-timezone": "^0.5.43",
- "pg-connection-string": "^2.6.1",
- "retry-as-promised": "^7.0.4",
- "semver": "^7.5.4",
- "sequelize-pool": "^7.1.0",
- "toposort-class": "^1.0.1",
- "uuid": "^8.3.2",
- "validator": "^13.9.0",
- "wkx": "^0.5.0"
- },
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependenciesMeta": {
- "ibm_db": {
- "optional": true
- },
- "mariadb": {
- "optional": true
- },
- "mysql2": {
- "optional": true
- },
- "oracledb": {
- "optional": true
- },
- "pg": {
- "optional": true
- },
- "pg-hstore": {
- "optional": true
- },
- "snowflake-sdk": {
- "optional": true
- },
- "sqlite3": {
- "optional": true
- },
- "tedious": {
- "optional": true
- }
- }
- },
- "node_modules/sequelize-pool": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
- "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/sequelize/node_modules/debug": {
- "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"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/sequelize/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=="
- },
- "node_modules/sequelize/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==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/serve-static": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
- "license": "MIT",
- "dependencies": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/set-function-length": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
- "license": "MIT",
- "dependencies": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "node_modules/sparse-bitfield": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
- "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
- "dependencies": {
- "memory-pager": "^1.0.2"
- }
- },
- "node_modules/split2": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
- "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
- "dependencies": {
- "readable-stream": "^3.0.0"
- }
- },
- "node_modules/split2/node_modules/readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/stremio-addon-linter": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/stremio-addon-linter/-/stremio-addon-linter-1.7.0.tgz",
- "integrity": "sha512-ck1L1Wp2qvAhvXLj+4Lq1XRn8K3r2gx1i/f+e1W6K0+Et/oIYYDmaIVoh3SvExiNbCBcbJjH9WWEeDYKoqaMqQ==",
- "dependencies": {
- "semver": "^5.5.0"
- }
- },
- "node_modules/stremio-addon-sdk": {
- "version": "1.6.10",
- "resolved": "https://registry.npmjs.org/stremio-addon-sdk/-/stremio-addon-sdk-1.6.10.tgz",
- "integrity": "sha512-+U/lDGv73JPZa7OOy8eMb+SkUFhnHuZGBRXuKNeXcz706oDdwC/sQe9r8Wxw2A7Cw05+f/CQIJSl4zIcmKBkGg==",
- "dependencies": {
- "chalk": "^2.4.2",
- "cors": "^2.8.4",
- "express": "^4.16.3",
- "inquirer": "^6.2.2",
- "mkdirp": "^0.5.1",
- "node-fetch": "^2.3.0",
- "opn": "^5.4.0",
- "router": "^1.3.3",
- "stremio-addon-linter": "^1.7.0"
- },
- "bin": {
- "addon-bootstrap": "cli/bootstrap.js"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/string_decoder/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dependencies": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/string-width/node_modules/strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dependencies": {
- "ansi-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dependencies": {
- "ansi-regex": "^4.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/strip-ansi/node_modules/ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "node_modules/tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "dependencies": {
- "os-tmpdir": "~1.0.2"
- },
- "engines": {
- "node": ">=0.6.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "license": "MIT",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/toposort-class": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
- "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg="
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
- },
- "node_modules/tslib": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
- "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA=="
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "license": "MIT",
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/underscore": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz",
- "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g=="
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/validator": {
- "version": "13.12.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz",
- "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "node_modules/wkx": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
- "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "engines": {
- "node": ">=0.4"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- },
- "dependencies": {
- "@keyv/mongo": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@keyv/mongo/-/mongo-3.0.1.tgz",
- "integrity": "sha512-dNVIhm68mh/CAySN6q7o1vyBRdBRt41nrJXIDlqLhnXOo4l8IAY1Vj5BlTkUfw1BDLuZ9zjb+g1lr/BMRdzNdg==",
- "requires": {
- "mongodb": "^6.8.0"
- },
- "dependencies": {
- "bson": {
- "version": "6.9.0",
- "resolved": "https://registry.npmjs.org/bson/-/bson-6.9.0.tgz",
- "integrity": "sha512-X9hJeyeM0//Fus+0pc5dSUMhhrrmWwQUtdavaQeF3Ta6m69matZkGWV/MrBcnwUeLC8W9kwwc2hfkZgUuCX3Ig=="
- },
- "mongodb": {
- "version": "6.10.0",
- "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.10.0.tgz",
- "integrity": "sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==",
- "requires": {
- "@mongodb-js/saslprep": "^1.1.5",
- "bson": "^6.7.0",
- "mongodb-connection-string-url": "^3.0.0"
- }
- }
- }
- },
- "@mongodb-js/saslprep": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz",
- "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==",
- "requires": {
- "sparse-bitfield": "^3.0.3"
- }
- },
- "@types/debug": {
- "version": "4.1.12",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
- "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
- "requires": {
- "@types/ms": "*"
- }
- },
- "@types/ms": {
- "version": "0.7.34",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
- "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
- },
- "@types/node": {
- "version": "18.0.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz",
- "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA=="
- },
- "@types/validator": {
- "version": "13.12.2",
- "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz",
- "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA=="
- },
- "@types/webidl-conversions": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
- "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="
- },
- "@types/whatwg-url": {
- "version": "11.0.5",
- "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
- "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
- "requires": {
- "@types/webidl-conversions": "*"
- }
- },
- "accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "requires": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- }
- },
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
- },
- "ansi-regex": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
- "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "axios": {
- "version": "1.7.7",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
- "requires": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
- "body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
- "requires": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- }
- },
- "bottleneck": {
- "version": "2.19.5",
- "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz",
- "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="
- },
- "bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
- },
- "call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
- "requires": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "requires": {
- "restore-cursor": "^2.0.0"
- }
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "requires": {
- "safe-buffer": "5.2.1"
- }
- },
- "content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
- },
- "cookie": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
- "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "requires": {
- "object-assign": "^4",
- "vary": "^1"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-data-property": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
- "requires": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "gopd": "^1.0.1"
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
- },
- "depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
- },
- "destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
- },
- "dottie": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz",
- "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA=="
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
- },
- "encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="
- },
- "es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "requires": {
- "get-intrinsic": "^1.2.4"
- }
- },
- "es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
- },
- "express": {
- "version": "4.21.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
- "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
- "requires": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.7.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.3",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.10",
- "proxy-addr": "~2.0.7",
- "qs": "6.13.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "path-to-regexp": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
- "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w=="
- }
- }
- },
- "external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- }
- },
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- }
- },
- "follow-redirects": {
- "version": "1.15.9",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="
- },
- "form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- }
- },
- "forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
- },
- "function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
- },
- "get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
- "requires": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- }
- },
- "gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "requires": {
- "get-intrinsic": "^1.1.3"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "has-property-descriptors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
- "requires": {
- "es-define-property": "^1.0.0"
- }
- },
- "has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="
- },
- "has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
- },
- "hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "requires": {
- "function-bind": "^1.1.2"
- }
- },
- "http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "requires": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "inflection": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz",
- "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw=="
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "inquirer": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
- "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
- "requires": {
- "ansi-escapes": "^3.2.0",
- "chalk": "^2.4.2",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^2.0.0",
- "lodash": "^4.17.12",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rxjs": "^6.4.0",
- "string-width": "^2.1.0",
- "strip-ansi": "^5.1.0",
- "through": "^2.3.6"
- }
- },
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
- },
- "lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
- },
- "memory-pager": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
- "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
- },
- "merge-descriptors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
- },
- "mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "requires": {
- "mime-db": "1.52.0"
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
- },
- "minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
- },
- "mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "requires": {
- "minimist": "^1.2.6"
- }
- },
- "moment": {
- "version": "2.30.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
- "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="
- },
- "moment-timezone": {
- "version": "0.5.46",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz",
- "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==",
- "requires": {
- "moment": "^2.29.4"
- }
- },
- "mongodb-connection-string-url": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz",
- "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==",
- "requires": {
- "@types/whatwg-url": "^11.0.2",
- "whatwg-url": "^13.0.0"
- },
- "dependencies": {
- "tr46": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
- "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
- "requires": {
- "punycode": "^2.3.0"
- }
- },
- "webidl-conversions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
- "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
- },
- "whatwg-url": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz",
- "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==",
- "requires": {
- "tr46": "^4.1.1",
- "webidl-conversions": "^7.0.0"
- }
- }
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
- },
- "negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
- },
- "node-fetch": {
- "version": "2.6.7",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
- "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
- "requires": {
- "whatwg-url": "^5.0.0"
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "object-inspect": {
- "version": "1.13.3",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
- "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA=="
- },
- "on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "opn": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
- "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
- "requires": {
- "is-wsl": "^1.1.0"
- }
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
- },
- "pg": {
- "version": "8.13.1",
- "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz",
- "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==",
- "requires": {
- "pg-cloudflare": "^1.1.1",
- "pg-connection-string": "^2.7.0",
- "pg-pool": "^3.7.0",
- "pg-protocol": "^1.7.0",
- "pg-types": "^2.1.0",
- "pgpass": "1.x"
- }
- },
- "pg-cloudflare": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz",
- "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==",
- "optional": true
- },
- "pg-connection-string": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz",
- "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA=="
- },
- "pg-hstore": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.4.tgz",
- "integrity": "sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==",
- "requires": {
- "underscore": "^1.13.1"
- }
- },
- "pg-int8": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
- "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
- },
- "pg-pool": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz",
- "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==",
- "requires": {}
- },
- "pg-protocol": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz",
- "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ=="
- },
- "pg-types": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
- "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
- "requires": {
- "pg-int8": "1.0.1",
- "postgres-array": "~2.0.0",
- "postgres-bytea": "~1.0.0",
- "postgres-date": "~1.0.4",
- "postgres-interval": "^1.1.0"
- }
- },
- "pgpass": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz",
- "integrity": "sha512-YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==",
- "requires": {
- "split2": "^3.1.1"
- }
- },
- "postgres-array": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
- "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="
- },
- "postgres-bytea": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
- "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU="
- },
- "postgres-date": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
- "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="
- },
- "postgres-interval": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
- "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
- "requires": {
- "xtend": "^4.0.0"
- }
- },
- "proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "requires": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- }
- },
- "proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- },
- "punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="
- },
- "qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
- "requires": {
- "side-channel": "^1.0.6"
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
- },
- "raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
- "requires": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- }
- },
- "request-ip": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz",
- "integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA=="
- },
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "requires": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- }
- },
- "retry-as-promised": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz",
- "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA=="
- },
- "router": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/router/-/router-1.3.8.tgz",
- "integrity": "sha512-461UFH44NtSfIlS83PUg2N7OZo86BC/kB3dY77gJdsODsBhhw7+2uE0tzTINxrY9CahCUVk1VhpWCA5i1yoIEg==",
- "requires": {
- "array-flatten": "3.0.0",
- "debug": "2.6.9",
- "methods": "~1.1.2",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "setprototypeof": "1.2.0",
- "utils-merge": "1.0.1"
- },
- "dependencies": {
- "array-flatten": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz",
- "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA=="
- }
- }
- },
- "run-async": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz",
- "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==",
- "requires": {
- "is-promise": "^2.1.0"
- }
- },
- "rxjs": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
- "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
- "requires": {
- "tslib": "^1.9.0"
- }
- },
- "safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="
- },
- "send": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
- "requires": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "dependencies": {
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
- },
- "ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- }
- }
- },
- "sequelize": {
- "version": "6.37.5",
- "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.5.tgz",
- "integrity": "sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==",
- "requires": {
- "@types/debug": "^4.1.8",
- "@types/validator": "^13.7.17",
- "debug": "^4.3.4",
- "dottie": "^2.0.6",
- "inflection": "^1.13.4",
- "lodash": "^4.17.21",
- "moment": "^2.29.4",
- "moment-timezone": "^0.5.43",
- "pg-connection-string": "^2.6.1",
- "retry-as-promised": "^7.0.4",
- "semver": "^7.5.4",
- "sequelize-pool": "^7.1.0",
- "toposort-class": "^1.0.1",
- "uuid": "^8.3.2",
- "validator": "^13.9.0",
- "wkx": "^0.5.0"
- },
- "dependencies": {
- "debug": {
- "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"
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "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==",
- "requires": {
- "lru-cache": "^6.0.0"
- }
- }
- }
- },
- "sequelize-pool": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
- "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg=="
- },
- "serve-static": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
- "requires": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
- }
- },
- "set-function-length": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
- "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
- "requires": {
- "define-data-property": "^1.1.4",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.2"
- }
- },
- "setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
- "requires": {
- "call-bind": "^1.0.7",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
- }
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
- },
- "sparse-bitfield": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
- "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
- "requires": {
- "memory-pager": "^1.0.2"
- }
- },
- "split2": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
- "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
- "requires": {
- "readable-stream": "^3.0.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
- },
- "stremio-addon-linter": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/stremio-addon-linter/-/stremio-addon-linter-1.7.0.tgz",
- "integrity": "sha512-ck1L1Wp2qvAhvXLj+4Lq1XRn8K3r2gx1i/f+e1W6K0+Et/oIYYDmaIVoh3SvExiNbCBcbJjH9WWEeDYKoqaMqQ==",
- "requires": {
- "semver": "^5.5.0"
- }
- },
- "stremio-addon-sdk": {
- "version": "1.6.10",
- "resolved": "https://registry.npmjs.org/stremio-addon-sdk/-/stremio-addon-sdk-1.6.10.tgz",
- "integrity": "sha512-+U/lDGv73JPZa7OOy8eMb+SkUFhnHuZGBRXuKNeXcz706oDdwC/sQe9r8Wxw2A7Cw05+f/CQIJSl4zIcmKBkGg==",
- "requires": {
- "chalk": "^2.4.2",
- "cors": "^2.8.4",
- "express": "^4.16.3",
- "inquirer": "^6.2.2",
- "mkdirp": "^0.5.1",
- "node-fetch": "^2.3.0",
- "opn": "^5.4.0",
- "router": "^1.3.3",
- "stremio-addon-linter": "^1.7.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- },
- "dependencies": {
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- }
- }
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="
- }
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
- },
- "toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
- },
- "toposort-class": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz",
- "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg="
- },
- "tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
- },
- "tslib": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz",
- "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA=="
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "underscore": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz",
- "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g=="
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
- },
- "uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
- },
- "validator": {
- "version": "13.12.0",
- "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz",
- "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg=="
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
- },
- "whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
- "requires": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "wkx": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz",
- "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- }
- }
-}
diff --git a/catalogs/serverless.js b/catalogs/serverless.js
deleted file mode 100644
index ec028bb..0000000
--- a/catalogs/serverless.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import getRouter from 'stremio-addon-sdk/src/getRouter.js';
-import addonInterface from './addon.js';
-import qs from 'querystring';
-import { parseConfiguration } from '../addon/lib/configuration.js';
-import { createManifest } from './lib/manifest.js';
-
-const router = getRouter(addonInterface);
-
-// router.get('/', (_, res) => {
-// res.redirect('/configure')
-// res.end();
-// });
-//
-// router.get('/:configuration?/configure', (req, res) => {
-// const configValues = parseConfiguration(req.params.configuration || '');
-// const landingHTML = landingTemplate(createManifest(configValues), configValues);
-// res.setHeader('content-type', 'text/html');
-// res.end(landingHTML);
-// });
-
-router.get('/:configuration?/manifest.json', (req, res) => {
- const configValues = parseConfiguration(req.params.configuration || '');
- const manifestBuf = JSON.stringify(createManifest(configValues));
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
- res.end(manifestBuf)
-});
-
-router.get('/:configuration/:resource/:type/:id/:extra?.json', (req, res, next) => {
- const { configuration, resource, type, id } = req.params;
- const extra = req.params.extra ? qs.parse(req.url.split('/').pop().slice(0, -5)) : {}
- const configValues = { ...extra, ...parseConfiguration(configuration) };
- addonInterface.get(resource, type, id, configValues)
- .then(resp => {
- const cacheHeaders = {
- cacheMaxAge: 'max-age',
- staleRevalidate: 'stale-while-revalidate',
- staleError: 'stale-if-error'
- };
- const cacheControl = Object.keys(cacheHeaders)
- .map(prop => Number.isInteger(resp[prop]) && cacheHeaders[prop] + '=' + resp[prop])
- .filter(val => !!val).join(', ');
-
- res.setHeader('Cache-Control', `${cacheControl}, public`);
- res.setHeader('Content-Type', 'application/json; charset=utf-8');
- res.end(JSON.stringify(resp));
- })
- .catch(err => {
- if (err.noHandler) {
- if (next) {
- next()
- } else {
- res.writeHead(404);
- res.end(JSON.stringify({ err: 'not found' }));
- }
- } else {
- console.error(err);
- res.writeHead(500);
- res.end(JSON.stringify({ err: 'handler error' }));
- }
- });
-});
-
-export default function (req, res) {
- router(req, res, function () {
- res.statusCode = 404;
- res.end();
- });
-};
diff --git a/catalogs/package.json b/package.json
similarity index 50%
rename from catalogs/package.json
rename to package.json
index 64f728e..0aeab28 100644
--- a/catalogs/package.json
+++ b/package.json
@@ -4,15 +4,21 @@
"exports": "./index.js",
"type": "module",
"scripts": {
- "start": "node index.js"
+ "start": "tsx index.ts",
+ "dev": "tsx --watch index.ts",
+ "lint": "eslint **/*.ts",
+ "lint:fix": "eslint --fix **/*.ts",
+ "check": "tsc --noEmit",
+ "build": "tsc"
},
"engines": {
- "node": ">=16.x"
+ "node": ">=22.x"
},
"author": "TheBeastLT ",
"license": "MIT",
"dependencies": {
"@keyv/mongo": "^3.0.1",
+ "@types/express": "^5.0.0",
"axios": "^1.7.7",
"bottleneck": "^2.19.5",
"moment": "^2.30.1",
@@ -21,5 +27,14 @@
"request-ip": "^3.3.0",
"sequelize": "^6.29.0",
"stremio-addon-sdk": "^1.6.10"
+ },
+ "devDependencies": {
+ "@types/stremio-addon-sdk": "^1.6.11",
+ "eslint": "^9.18.0",
+ "eslint-config-prettier": "^10.0.1",
+ "globals": "^15.14.0",
+ "tsx": "^4.19.2",
+ "typescript": "^5.7.3",
+ "typescript-eslint": "^8.20.0"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..4104fe1
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,2767 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@keyv/mongo':
+ specifier: ^3.0.1
+ version: 3.0.1
+ '@types/express':
+ specifier: ^5.0.0
+ version: 5.0.0
+ axios:
+ specifier: ^1.7.7
+ version: 1.7.9
+ bottleneck:
+ specifier: ^2.19.5
+ version: 2.19.5
+ moment:
+ specifier: ^2.30.1
+ version: 2.30.1
+ pg:
+ specifier: ^8.8.0
+ version: 8.13.1
+ pg-hstore:
+ specifier: ^2.3.4
+ version: 2.3.4
+ request-ip:
+ specifier: ^3.3.0
+ version: 3.3.0
+ sequelize:
+ specifier: ^6.29.0
+ version: 6.37.5(pg-hstore@2.3.4)(pg@8.13.1)
+ stremio-addon-sdk:
+ specifier: ^1.6.10
+ version: 1.6.10
+ devDependencies:
+ '@types/stremio-addon-sdk':
+ specifier: ^1.6.11
+ version: 1.6.11
+ eslint:
+ specifier: ^9.18.0
+ version: 9.18.0
+ eslint-config-prettier:
+ specifier: ^10.0.1
+ version: 10.0.1(eslint@9.18.0)
+ globals:
+ specifier: ^15.14.0
+ version: 15.14.0
+ tsx:
+ specifier: ^4.19.2
+ version: 4.19.2
+ typescript:
+ specifier: ^5.7.3
+ version: 5.7.3
+ typescript-eslint:
+ specifier: ^8.20.0
+ version: 8.20.0(eslint@9.18.0)(typescript@5.7.3)
+
+packages:
+
+ '@esbuild/aix-ppc64@0.23.1':
+ resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.23.1':
+ resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.23.1':
+ resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.23.1':
+ resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.23.1':
+ resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.23.1':
+ resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.23.1':
+ resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.23.1':
+ resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.23.1':
+ resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.23.1':
+ resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.23.1':
+ resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.23.1':
+ resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.23.1':
+ resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.23.1':
+ resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.23.1':
+ resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.23.1':
+ resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.23.1':
+ resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-x64@0.23.1':
+ resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.23.1':
+ resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.23.1':
+ resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.23.1':
+ resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.23.1':
+ resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.23.1':
+ resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.23.1':
+ resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.4.1':
+ resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.19.1':
+ resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.10.0':
+ resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.2.0':
+ resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.18.0':
+ resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.5':
+ resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.2.5':
+ resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.6':
+ resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.3.1':
+ resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+ engines: {node: '>=18.18'}
+
+ '@humanwhocodes/retry@0.4.1':
+ resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==}
+ engines: {node: '>=18.18'}
+
+ '@keyv/mongo@3.0.1':
+ resolution: {integrity: sha512-dNVIhm68mh/CAySN6q7o1vyBRdBRt41nrJXIDlqLhnXOo4l8IAY1Vj5BlTkUfw1BDLuZ9zjb+g1lr/BMRdzNdg==}
+
+ '@mongodb-js/saslprep@1.1.9':
+ resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@types/body-parser@1.19.5':
+ resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
+
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+ '@types/express-serve-static-core@5.0.5':
+ resolution: {integrity: sha512-GLZPrd9ckqEBFMcVM/qRFAP0Hg3qiVEojgEFsx/N/zKXsBzbGF6z5FBDpZ0+Xhp1xr+qRZYjfGr1cWHB9oFHSA==}
+
+ '@types/express@5.0.0':
+ resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==}
+
+ '@types/http-errors@2.0.4':
+ resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/mime@1.3.5':
+ resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+
+ '@types/ms@0.7.34':
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+
+ '@types/node@22.10.6':
+ resolution: {integrity: sha512-qNiuwC4ZDAUNcY47xgaSuS92cjf8JbSUoaKS77bmLG1rU7MlATVSiw/IlrjtIyyskXBZ8KkNfjK/P5na7rgXbQ==}
+
+ '@types/qs@6.9.18':
+ resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==}
+
+ '@types/range-parser@1.2.7':
+ resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+
+ '@types/send@0.17.4':
+ resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
+
+ '@types/serve-static@1.15.7':
+ resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
+
+ '@types/stremio-addon-sdk@1.6.11':
+ resolution: {integrity: sha512-y0nXwX2gqrWcVYLEvujxqLOm/yZoMu8nLyiw1MthgVuiPp6RVfgWqwpql71MUV5shSfPNsd7EtsiWw2cUFhcWQ==}
+
+ '@types/validator@13.12.2':
+ resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==}
+
+ '@types/webidl-conversions@7.0.3':
+ resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==}
+
+ '@types/whatwg-url@11.0.5':
+ resolution: {integrity: sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==}
+
+ '@typescript-eslint/eslint-plugin@8.20.0':
+ resolution: {integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/parser@8.20.0':
+ resolution: {integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/scope-manager@8.20.0':
+ resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/type-utils@8.20.0':
+ resolution: {integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/types@8.20.0':
+ resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.20.0':
+ resolution: {integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/utils@8.20.0':
+ resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/visitor-keys@8.20.0':
+ resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ accepts@1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.14.0:
+ resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ansi-escapes@3.2.0:
+ resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==}
+ engines: {node: '>=4'}
+
+ ansi-regex@3.0.1:
+ resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==}
+ engines: {node: '>=4'}
+
+ ansi-regex@4.1.1:
+ resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
+ engines: {node: '>=6'}
+
+ ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+
+ array-flatten@3.0.0:
+ resolution: {integrity: sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==}
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ axios@1.7.9:
+ resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ bottleneck@2.19.5:
+ resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ bson@6.10.1:
+ resolution: {integrity: sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA==}
+ engines: {node: '>=16.20.1'}
+
+ bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+
+ call-bind-apply-helpers@1.0.1:
+ resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
+ engines: {node: '>= 0.4'}
+
+ call-bound@1.0.3:
+ resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==}
+ engines: {node: '>= 0.4'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+
+ cli-cursor@2.1.0:
+ resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==}
+ engines: {node: '>=4'}
+
+ cli-width@2.2.1:
+ resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==}
+
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+
+ content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+
+ cookie-signature@1.0.6:
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+
+ cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ engines: {node: '>= 0.6'}
+
+ cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.0:
+ resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+
+ destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+
+ dottie@2.0.6:
+ resolution: {integrity: sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==}
+
+ dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+ engines: {node: '>= 0.4'}
+
+ ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+
+ encodeurl@1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
+ es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+ engines: {node: '>= 0.4'}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+ engines: {node: '>= 0.4'}
+
+ esbuild@0.23.1:
+ resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eslint-config-prettier@10.0.1:
+ resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+
+ eslint-scope@8.2.0:
+ resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.0:
+ resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.18.0:
+ resolution: {integrity: sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.3.0:
+ resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+
+ express@4.21.2:
+ resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
+ engines: {node: '>= 0.10.0'}
+
+ external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fastq@1.18.0:
+ resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
+
+ figures@2.0.0:
+ resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==}
+ engines: {node: '>=4'}
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
+ engines: {node: '>= 0.8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flatted@3.3.2:
+ resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
+
+ follow-redirects@1.15.9:
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ form-data@4.0.1:
+ resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
+ engines: {node: '>= 6'}
+
+ forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+
+ fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ get-intrinsic@1.2.7:
+ resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==}
+ engines: {node: '>= 0.4'}
+
+ get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+ engines: {node: '>= 0.4'}
+
+ get-tsconfig@4.8.1:
+ resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@15.14.0:
+ resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==}
+ engines: {node: '>=18'}
+
+ gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+ engines: {node: '>= 0.4'}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+ engines: {node: '>= 0.4'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ http-errors@2.0.0:
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ engines: {node: '>= 0.8'}
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+
+ imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+
+ inflection@1.13.4:
+ resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==}
+ engines: {'0': node >= 0.4.0}
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ inquirer@6.5.2:
+ resolution: {integrity: sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==}
+ engines: {node: '>=6.0.0'}
+
+ ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@2.0.0:
+ resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==}
+ engines: {node: '>=4'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-wsl@1.1.0:
+ resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==}
+ engines: {node: '>=4'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+ engines: {node: '>= 0.4'}
+
+ media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+
+ memory-pager@1.5.0:
+ resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==}
+
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ methods@1.1.2:
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+ engines: {node: '>= 0.6'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ mimic-fn@1.2.0:
+ resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==}
+ engines: {node: '>=4'}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ mkdirp@0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+
+ moment-timezone@0.5.46:
+ resolution: {integrity: sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==}
+
+ moment@2.30.1:
+ resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
+
+ mongodb-connection-string-url@3.0.2:
+ resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==}
+
+ mongodb@6.12.0:
+ resolution: {integrity: sha512-RM7AHlvYfS7jv7+BXund/kR64DryVI+cHbVAy9P61fnb1RcWZqOW1/Wj2YhqMCx+MuYhqTRGv7AwHBzmsCKBfA==}
+ engines: {node: '>=16.20.1'}
+ peerDependencies:
+ '@aws-sdk/credential-providers': ^3.188.0
+ '@mongodb-js/zstd': ^1.1.0 || ^2.0.0
+ gcp-metadata: ^5.2.0
+ kerberos: ^2.0.1
+ mongodb-client-encryption: '>=6.0.0 <7'
+ snappy: ^7.2.2
+ socks: ^2.7.1
+ peerDependenciesMeta:
+ '@aws-sdk/credential-providers':
+ optional: true
+ '@mongodb-js/zstd':
+ optional: true
+ gcp-metadata:
+ optional: true
+ kerberos:
+ optional: true
+ mongodb-client-encryption:
+ optional: true
+ snappy:
+ optional: true
+ socks:
+ optional: true
+
+ ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ mute-stream@0.0.7:
+ resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==}
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-inspect@1.13.3:
+ resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
+ engines: {node: '>= 0.4'}
+
+ on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+
+ onetime@2.0.1:
+ resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==}
+ engines: {node: '>=4'}
+
+ opn@5.5.0:
+ resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==}
+ engines: {node: '>=4'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+
+ parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-to-regexp@0.1.12:
+ resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
+
+ path-to-regexp@0.1.7:
+ resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
+
+ pg-cloudflare@1.1.1:
+ resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==}
+
+ pg-connection-string@2.7.0:
+ resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==}
+
+ pg-hstore@2.3.4:
+ resolution: {integrity: sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==}
+ engines: {node: '>= 0.8.x'}
+
+ pg-int8@1.0.1:
+ resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==}
+ engines: {node: '>=4.0.0'}
+
+ pg-pool@3.7.0:
+ resolution: {integrity: sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==}
+ peerDependencies:
+ pg: '>=8.0'
+
+ pg-protocol@1.7.0:
+ resolution: {integrity: sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==}
+
+ pg-types@2.2.0:
+ resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==}
+ engines: {node: '>=4'}
+
+ pg@8.13.1:
+ resolution: {integrity: sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==}
+ engines: {node: '>= 8.0.0'}
+ peerDependencies:
+ pg-native: '>=3.0.1'
+ peerDependenciesMeta:
+ pg-native:
+ optional: true
+
+ pgpass@1.0.5:
+ resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ postgres-array@2.0.0:
+ resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
+ engines: {node: '>=4'}
+
+ postgres-bytea@1.0.0:
+ resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-date@1.0.7:
+ resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==}
+ engines: {node: '>=0.10.0'}
+
+ postgres-interval@1.2.0:
+ resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==}
+ engines: {node: '>=0.10.0'}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+ engines: {node: '>=0.6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+
+ raw-body@2.5.2:
+ resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+ engines: {node: '>= 0.8'}
+
+ request-ip@3.3.0:
+ resolution: {integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==}
+
+ resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ restore-cursor@2.0.0:
+ resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==}
+ engines: {node: '>=4'}
+
+ retry-as-promised@7.0.4:
+ resolution: {integrity: sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==}
+
+ reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ router@1.3.8:
+ resolution: {integrity: sha512-461UFH44NtSfIlS83PUg2N7OZo86BC/kB3dY77gJdsODsBhhw7+2uE0tzTINxrY9CahCUVk1VhpWCA5i1yoIEg==}
+ engines: {node: '>= 0.8'}
+
+ run-async@2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ rxjs@6.6.7:
+ resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==}
+ engines: {npm: '>=2.0.0'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+
+ semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
+ engines: {node: '>= 0.8.0'}
+
+ sequelize-pool@7.1.0:
+ resolution: {integrity: sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==}
+ engines: {node: '>= 10.0.0'}
+
+ sequelize@6.37.5:
+ resolution: {integrity: sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ ibm_db: '*'
+ mariadb: '*'
+ mysql2: '*'
+ oracledb: '*'
+ pg: '*'
+ pg-hstore: '*'
+ snowflake-sdk: '*'
+ sqlite3: '*'
+ tedious: '*'
+ peerDependenciesMeta:
+ ibm_db:
+ optional: true
+ mariadb:
+ optional: true
+ mysql2:
+ optional: true
+ oracledb:
+ optional: true
+ pg:
+ optional: true
+ pg-hstore:
+ optional: true
+ snowflake-sdk:
+ optional: true
+ sqlite3:
+ optional: true
+ tedious:
+ optional: true
+
+ serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
+ engines: {node: '>= 0.8.0'}
+
+ setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+ engines: {node: '>= 0.4'}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ sparse-bitfield@3.0.3:
+ resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+
+ stremio-addon-linter@1.7.0:
+ resolution: {integrity: sha512-ck1L1Wp2qvAhvXLj+4Lq1XRn8K3r2gx1i/f+e1W6K0+Et/oIYYDmaIVoh3SvExiNbCBcbJjH9WWEeDYKoqaMqQ==}
+
+ stremio-addon-sdk@1.6.10:
+ resolution: {integrity: sha512-+U/lDGv73JPZa7OOy8eMb+SkUFhnHuZGBRXuKNeXcz706oDdwC/sQe9r8Wxw2A7Cw05+f/CQIJSl4zIcmKBkGg==}
+ hasBin: true
+
+ string-width@2.1.1:
+ resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==}
+ engines: {node: '>=4'}
+
+ strip-ansi@4.0.0:
+ resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==}
+ engines: {node: '>=4'}
+
+ strip-ansi@5.2.0:
+ resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
+ engines: {node: '>=6'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+
+ toposort-class@1.0.1:
+ resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ tr46@5.0.0:
+ resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
+ engines: {node: '>=18'}
+
+ ts-api-utils@2.0.0:
+ resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+
+ tsx@4.19.2:
+ resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+
+ typescript-eslint@8.20.0:
+ resolution: {integrity: sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ typescript@5.7.3:
+ resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ underscore@1.13.7:
+ resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==}
+
+ undici-types@6.20.0:
+ resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+
+ unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ validator@13.12.0:
+ resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==}
+ engines: {node: '>= 0.10'}
+
+ vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ webidl-conversions@7.0.0:
+ resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+ engines: {node: '>=12'}
+
+ whatwg-url@14.1.0:
+ resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==}
+ engines: {node: '>=18'}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ wkx@0.5.0:
+ resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==}
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+snapshots:
+
+ '@esbuild/aix-ppc64@0.23.1':
+ optional: true
+
+ '@esbuild/android-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/android-arm@0.23.1':
+ optional: true
+
+ '@esbuild/android-x64@0.23.1':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/darwin-x64@0.23.1':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-arm@0.23.1':
+ optional: true
+
+ '@esbuild/linux-ia32@0.23.1':
+ optional: true
+
+ '@esbuild/linux-loong64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.23.1':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.23.1':
+ optional: true
+
+ '@esbuild/linux-s390x@0.23.1':
+ optional: true
+
+ '@esbuild/linux-x64@0.23.1':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.23.1':
+ optional: true
+
+ '@esbuild/sunos-x64@0.23.1':
+ optional: true
+
+ '@esbuild/win32-arm64@0.23.1':
+ optional: true
+
+ '@esbuild/win32-ia32@0.23.1':
+ optional: true
+
+ '@esbuild/win32-x64@0.23.1':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.4.1(eslint@9.18.0)':
+ dependencies:
+ eslint: 9.18.0
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/config-array@0.19.1':
+ dependencies:
+ '@eslint/object-schema': 2.1.5
+ debug: 4.4.0
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/core@0.10.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.2.0':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.0
+ espree: 10.3.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.18.0': {}
+
+ '@eslint/object-schema@2.1.5': {}
+
+ '@eslint/plugin-kit@0.2.5':
+ dependencies:
+ '@eslint/core': 0.10.0
+ levn: 0.4.1
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.6':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.3.1
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.3.1': {}
+
+ '@humanwhocodes/retry@0.4.1': {}
+
+ '@keyv/mongo@3.0.1':
+ dependencies:
+ mongodb: 6.12.0
+ transitivePeerDependencies:
+ - '@aws-sdk/credential-providers'
+ - '@mongodb-js/zstd'
+ - gcp-metadata
+ - kerberos
+ - mongodb-client-encryption
+ - snappy
+ - socks
+
+ '@mongodb-js/saslprep@1.1.9':
+ dependencies:
+ sparse-bitfield: 3.0.3
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.18.0
+
+ '@types/body-parser@1.19.5':
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 22.10.6
+
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 22.10.6
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 0.7.34
+
+ '@types/estree@1.0.6': {}
+
+ '@types/express-serve-static-core@5.0.5':
+ dependencies:
+ '@types/node': 22.10.6
+ '@types/qs': 6.9.18
+ '@types/range-parser': 1.2.7
+ '@types/send': 0.17.4
+
+ '@types/express@5.0.0':
+ dependencies:
+ '@types/body-parser': 1.19.5
+ '@types/express-serve-static-core': 5.0.5
+ '@types/qs': 6.9.18
+ '@types/serve-static': 1.15.7
+
+ '@types/http-errors@2.0.4': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/mime@1.3.5': {}
+
+ '@types/ms@0.7.34': {}
+
+ '@types/node@22.10.6':
+ dependencies:
+ undici-types: 6.20.0
+
+ '@types/qs@6.9.18': {}
+
+ '@types/range-parser@1.2.7': {}
+
+ '@types/send@0.17.4':
+ dependencies:
+ '@types/mime': 1.3.5
+ '@types/node': 22.10.6
+
+ '@types/serve-static@1.15.7':
+ dependencies:
+ '@types/http-errors': 2.0.4
+ '@types/node': 22.10.6
+ '@types/send': 0.17.4
+
+ '@types/stremio-addon-sdk@1.6.11': {}
+
+ '@types/validator@13.12.2': {}
+
+ '@types/webidl-conversions@7.0.3': {}
+
+ '@types/whatwg-url@11.0.5':
+ dependencies:
+ '@types/webidl-conversions': 7.0.3
+
+ '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.20.0(eslint@9.18.0)(typescript@5.7.3)
+ '@typescript-eslint/scope-manager': 8.20.0
+ '@typescript-eslint/type-utils': 8.20.0(eslint@9.18.0)(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.20.0(eslint@9.18.0)(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.20.0
+ eslint: 9.18.0
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 2.0.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.20.0
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.20.0
+ debug: 4.4.0
+ eslint: 9.18.0
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.20.0':
+ dependencies:
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/visitor-keys': 8.20.0
+
+ '@typescript-eslint/type-utils@8.20.0(eslint@9.18.0)(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.20.0(eslint@9.18.0)(typescript@5.7.3)
+ debug: 4.4.0
+ eslint: 9.18.0
+ ts-api-utils: 2.0.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.20.0': {}
+
+ '@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/visitor-keys': 8.20.0
+ debug: 4.4.0
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.6.3
+ ts-api-utils: 2.0.0(typescript@5.7.3)
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.20.0(eslint@9.18.0)(typescript@5.7.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0)
+ '@typescript-eslint/scope-manager': 8.20.0
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.7.3)
+ eslint: 9.18.0
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.20.0':
+ dependencies:
+ '@typescript-eslint/types': 8.20.0
+ eslint-visitor-keys: 4.2.0
+
+ accepts@1.3.8:
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+
+ acorn-jsx@5.3.2(acorn@8.14.0):
+ dependencies:
+ acorn: 8.14.0
+
+ acorn@8.14.0: {}
+
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ansi-escapes@3.2.0: {}
+
+ ansi-regex@3.0.1: {}
+
+ ansi-regex@4.1.1: {}
+
+ ansi-styles@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ argparse@2.0.1: {}
+
+ array-flatten@1.1.1: {}
+
+ array-flatten@3.0.0: {}
+
+ asynckit@0.4.0: {}
+
+ axios@1.7.9:
+ dependencies:
+ follow-redirects: 1.15.9
+ form-data: 4.0.1
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ balanced-match@1.0.2: {}
+
+ body-parser@1.20.3:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.13.0
+ raw-body: 2.5.2
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ bottleneck@2.19.5: {}
+
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.1:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ bson@6.10.1: {}
+
+ bytes@3.1.2: {}
+
+ call-bind-apply-helpers@1.0.1:
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+
+ call-bound@1.0.3:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ get-intrinsic: 1.2.7
+
+ callsites@3.1.0: {}
+
+ chalk@2.4.2:
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chardet@0.7.0: {}
+
+ cli-cursor@2.1.0:
+ dependencies:
+ restore-cursor: 2.0.0
+
+ cli-width@2.2.1: {}
+
+ color-convert@1.9.3:
+ dependencies:
+ color-name: 1.1.3
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.3: {}
+
+ color-name@1.1.4: {}
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ concat-map@0.0.1: {}
+
+ content-disposition@0.5.4:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ content-type@1.0.5: {}
+
+ cookie-signature@1.0.6: {}
+
+ cookie@0.7.1: {}
+
+ cors@2.8.5:
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ debug@2.6.9:
+ dependencies:
+ ms: 2.0.0
+
+ debug@4.4.0:
+ dependencies:
+ ms: 2.1.3
+
+ deep-is@0.1.4: {}
+
+ delayed-stream@1.0.0: {}
+
+ depd@2.0.0: {}
+
+ destroy@1.2.0: {}
+
+ dottie@2.0.6: {}
+
+ dunder-proto@1.0.1:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+
+ ee-first@1.1.1: {}
+
+ encodeurl@1.0.2: {}
+
+ encodeurl@2.0.0: {}
+
+ es-define-property@1.0.1: {}
+
+ es-errors@1.3.0: {}
+
+ es-object-atoms@1.1.1:
+ dependencies:
+ es-errors: 1.3.0
+
+ esbuild@0.23.1:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.23.1
+ '@esbuild/android-arm': 0.23.1
+ '@esbuild/android-arm64': 0.23.1
+ '@esbuild/android-x64': 0.23.1
+ '@esbuild/darwin-arm64': 0.23.1
+ '@esbuild/darwin-x64': 0.23.1
+ '@esbuild/freebsd-arm64': 0.23.1
+ '@esbuild/freebsd-x64': 0.23.1
+ '@esbuild/linux-arm': 0.23.1
+ '@esbuild/linux-arm64': 0.23.1
+ '@esbuild/linux-ia32': 0.23.1
+ '@esbuild/linux-loong64': 0.23.1
+ '@esbuild/linux-mips64el': 0.23.1
+ '@esbuild/linux-ppc64': 0.23.1
+ '@esbuild/linux-riscv64': 0.23.1
+ '@esbuild/linux-s390x': 0.23.1
+ '@esbuild/linux-x64': 0.23.1
+ '@esbuild/netbsd-x64': 0.23.1
+ '@esbuild/openbsd-arm64': 0.23.1
+ '@esbuild/openbsd-x64': 0.23.1
+ '@esbuild/sunos-x64': 0.23.1
+ '@esbuild/win32-arm64': 0.23.1
+ '@esbuild/win32-ia32': 0.23.1
+ '@esbuild/win32-x64': 0.23.1
+
+ escape-html@1.0.3: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ eslint-config-prettier@10.0.1(eslint@9.18.0):
+ dependencies:
+ eslint: 9.18.0
+
+ eslint-scope@8.2.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.0: {}
+
+ eslint@9.18.0:
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0)
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/config-array': 0.19.1
+ '@eslint/core': 0.10.0
+ '@eslint/eslintrc': 3.2.0
+ '@eslint/js': 9.18.0
+ '@eslint/plugin-kit': 0.2.5
+ '@humanfs/node': 0.16.6
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.1
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.2.0
+ eslint-visitor-keys: 4.2.0
+ espree: 10.3.0
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.3.0:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ eslint-visitor-keys: 4.2.0
+
+ esquery@1.6.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ esutils@2.0.3: {}
+
+ etag@1.8.1: {}
+
+ express@4.21.2:
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.3
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.7.1
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.3.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ merge-descriptors: 1.0.3
+ methods: 1.1.2
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.12
+ proxy-addr: 2.0.7
+ qs: 6.13.0
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.19.0
+ serve-static: 1.16.2
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ external-editor@3.1.0:
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fastq@1.18.0:
+ dependencies:
+ reusify: 1.0.4
+
+ figures@2.0.0:
+ dependencies:
+ escape-string-regexp: 1.0.5
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ finalhandler@1.3.1:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.1
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.2
+ keyv: 4.5.4
+
+ flatted@3.3.2: {}
+
+ follow-redirects@1.15.9: {}
+
+ form-data@4.0.1:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+
+ forwarded@0.2.0: {}
+
+ fresh@0.5.2: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ get-intrinsic@1.2.7:
+ dependencies:
+ call-bind-apply-helpers: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+
+ get-proto@1.0.1:
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+
+ get-tsconfig@4.8.1:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ globals@14.0.0: {}
+
+ globals@15.14.0: {}
+
+ gopd@1.2.0: {}
+
+ graphemer@1.4.0: {}
+
+ has-flag@3.0.0: {}
+
+ has-flag@4.0.0: {}
+
+ has-symbols@1.1.0: {}
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ http-errors@2.0.0:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ toidentifier: 1.0.1
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ignore@5.3.2: {}
+
+ import-fresh@3.3.0:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ imurmurhash@0.1.4: {}
+
+ inflection@1.13.4: {}
+
+ inherits@2.0.4: {}
+
+ inquirer@6.5.2:
+ dependencies:
+ ansi-escapes: 3.2.0
+ chalk: 2.4.2
+ cli-cursor: 2.1.0
+ cli-width: 2.2.1
+ external-editor: 3.1.0
+ figures: 2.0.0
+ lodash: 4.17.21
+ mute-stream: 0.0.7
+ run-async: 2.4.1
+ rxjs: 6.6.7
+ string-width: 2.1.1
+ strip-ansi: 5.2.0
+ through: 2.3.8
+
+ ipaddr.js@1.9.1: {}
+
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@2.0.0: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-number@7.0.0: {}
+
+ is-wsl@1.1.0: {}
+
+ isexe@2.0.0: {}
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ json-buffer@3.0.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash.merge@4.6.2: {}
+
+ lodash@4.17.21: {}
+
+ math-intrinsics@1.1.0: {}
+
+ media-typer@0.3.0: {}
+
+ memory-pager@1.5.0: {}
+
+ merge-descriptors@1.0.3: {}
+
+ merge2@1.4.1: {}
+
+ methods@1.1.2: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime@1.6.0: {}
+
+ mimic-fn@1.2.0: {}
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimist@1.2.8: {}
+
+ mkdirp@0.5.6:
+ dependencies:
+ minimist: 1.2.8
+
+ moment-timezone@0.5.46:
+ dependencies:
+ moment: 2.30.1
+
+ moment@2.30.1: {}
+
+ mongodb-connection-string-url@3.0.2:
+ dependencies:
+ '@types/whatwg-url': 11.0.5
+ whatwg-url: 14.1.0
+
+ mongodb@6.12.0:
+ dependencies:
+ '@mongodb-js/saslprep': 1.1.9
+ bson: 6.10.1
+ mongodb-connection-string-url: 3.0.2
+
+ ms@2.0.0: {}
+
+ ms@2.1.3: {}
+
+ mute-stream@0.0.7: {}
+
+ natural-compare@1.4.0: {}
+
+ negotiator@0.6.3: {}
+
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
+
+ object-assign@4.1.1: {}
+
+ object-inspect@1.13.3: {}
+
+ on-finished@2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+
+ onetime@2.0.1:
+ dependencies:
+ mimic-fn: 1.2.0
+
+ opn@5.5.0:
+ dependencies:
+ is-wsl: 1.1.0
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ os-tmpdir@1.0.2: {}
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parseurl@1.3.3: {}
+
+ path-exists@4.0.0: {}
+
+ path-key@3.1.1: {}
+
+ path-to-regexp@0.1.12: {}
+
+ path-to-regexp@0.1.7: {}
+
+ pg-cloudflare@1.1.1:
+ optional: true
+
+ pg-connection-string@2.7.0: {}
+
+ pg-hstore@2.3.4:
+ dependencies:
+ underscore: 1.13.7
+
+ pg-int8@1.0.1: {}
+
+ pg-pool@3.7.0(pg@8.13.1):
+ dependencies:
+ pg: 8.13.1
+
+ pg-protocol@1.7.0: {}
+
+ pg-types@2.2.0:
+ dependencies:
+ pg-int8: 1.0.1
+ postgres-array: 2.0.0
+ postgres-bytea: 1.0.0
+ postgres-date: 1.0.7
+ postgres-interval: 1.2.0
+
+ pg@8.13.1:
+ dependencies:
+ pg-connection-string: 2.7.0
+ pg-pool: 3.7.0(pg@8.13.1)
+ pg-protocol: 1.7.0
+ pg-types: 2.2.0
+ pgpass: 1.0.5
+ optionalDependencies:
+ pg-cloudflare: 1.1.1
+
+ pgpass@1.0.5:
+ dependencies:
+ split2: 4.2.0
+
+ picomatch@2.3.1: {}
+
+ postgres-array@2.0.0: {}
+
+ postgres-bytea@1.0.0: {}
+
+ postgres-date@1.0.7: {}
+
+ postgres-interval@1.2.0:
+ dependencies:
+ xtend: 4.0.2
+
+ prelude-ls@1.2.1: {}
+
+ proxy-addr@2.0.7:
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+
+ proxy-from-env@1.1.0: {}
+
+ punycode@2.3.1: {}
+
+ qs@6.13.0:
+ dependencies:
+ side-channel: 1.1.0
+
+ queue-microtask@1.2.3: {}
+
+ range-parser@1.2.1: {}
+
+ raw-body@2.5.2:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+
+ request-ip@3.3.0: {}
+
+ resolve-from@4.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ restore-cursor@2.0.0:
+ dependencies:
+ onetime: 2.0.1
+ signal-exit: 3.0.7
+
+ retry-as-promised@7.0.4: {}
+
+ reusify@1.0.4: {}
+
+ router@1.3.8:
+ dependencies:
+ array-flatten: 3.0.0
+ debug: 2.6.9
+ methods: 1.1.2
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.7
+ setprototypeof: 1.2.0
+ utils-merge: 1.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ run-async@2.4.1: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ rxjs@6.6.7:
+ dependencies:
+ tslib: 1.14.1
+
+ safe-buffer@5.2.1: {}
+
+ safer-buffer@2.1.2: {}
+
+ semver@5.7.2: {}
+
+ semver@7.6.3: {}
+
+ send@0.19.0:
+ dependencies:
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ mime: 1.6.0
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ sequelize-pool@7.1.0: {}
+
+ sequelize@6.37.5(pg-hstore@2.3.4)(pg@8.13.1):
+ dependencies:
+ '@types/debug': 4.1.12
+ '@types/validator': 13.12.2
+ debug: 4.4.0
+ dottie: 2.0.6
+ inflection: 1.13.4
+ lodash: 4.17.21
+ moment: 2.30.1
+ moment-timezone: 0.5.46
+ pg-connection-string: 2.7.0
+ retry-as-promised: 7.0.4
+ semver: 7.6.3
+ sequelize-pool: 7.1.0
+ toposort-class: 1.0.1
+ uuid: 8.3.2
+ validator: 13.12.0
+ wkx: 0.5.0
+ optionalDependencies:
+ pg: 8.13.1
+ pg-hstore: 2.3.4
+ transitivePeerDependencies:
+ - supports-color
+
+ serve-static@1.16.2:
+ dependencies:
+ encodeurl: 2.0.0
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.19.0
+ transitivePeerDependencies:
+ - supports-color
+
+ setprototypeof@1.2.0: {}
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ side-channel-list@1.0.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.3
+
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ object-inspect: 1.13.3
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.3
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.7
+ object-inspect: 1.13.3
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.3
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
+ signal-exit@3.0.7: {}
+
+ sparse-bitfield@3.0.3:
+ dependencies:
+ memory-pager: 1.5.0
+
+ split2@4.2.0: {}
+
+ statuses@2.0.1: {}
+
+ stremio-addon-linter@1.7.0:
+ dependencies:
+ semver: 5.7.2
+
+ stremio-addon-sdk@1.6.10:
+ dependencies:
+ chalk: 2.4.2
+ cors: 2.8.5
+ express: 4.21.2
+ inquirer: 6.5.2
+ mkdirp: 0.5.6
+ node-fetch: 2.7.0
+ opn: 5.5.0
+ router: 1.3.8
+ stremio-addon-linter: 1.7.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+
+ string-width@2.1.1:
+ dependencies:
+ is-fullwidth-code-point: 2.0.0
+ strip-ansi: 4.0.0
+
+ strip-ansi@4.0.0:
+ dependencies:
+ ansi-regex: 3.0.1
+
+ strip-ansi@5.2.0:
+ dependencies:
+ ansi-regex: 4.1.1
+
+ strip-json-comments@3.1.1: {}
+
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ through@2.3.8: {}
+
+ tmp@0.0.33:
+ dependencies:
+ os-tmpdir: 1.0.2
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ toidentifier@1.0.1: {}
+
+ toposort-class@1.0.1: {}
+
+ tr46@0.0.3: {}
+
+ tr46@5.0.0:
+ dependencies:
+ punycode: 2.3.1
+
+ ts-api-utils@2.0.0(typescript@5.7.3):
+ dependencies:
+ typescript: 5.7.3
+
+ tslib@1.14.1: {}
+
+ tsx@4.19.2:
+ dependencies:
+ esbuild: 0.23.1
+ get-tsconfig: 4.8.1
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-is@1.6.18:
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+
+ typescript-eslint@8.20.0(eslint@9.18.0)(typescript@5.7.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.18.0)(typescript@5.7.3))(eslint@9.18.0)(typescript@5.7.3)
+ '@typescript-eslint/parser': 8.20.0(eslint@9.18.0)(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.20.0(eslint@9.18.0)(typescript@5.7.3)
+ eslint: 9.18.0
+ typescript: 5.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.7.3: {}
+
+ underscore@1.13.7: {}
+
+ undici-types@6.20.0: {}
+
+ unpipe@1.0.0: {}
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ utils-merge@1.0.1: {}
+
+ uuid@8.3.2: {}
+
+ validator@13.12.0: {}
+
+ vary@1.1.2: {}
+
+ webidl-conversions@3.0.1: {}
+
+ webidl-conversions@7.0.0: {}
+
+ whatwg-url@14.1.0:
+ dependencies:
+ tr46: 5.0.0
+ webidl-conversions: 7.0.0
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ wkx@0.5.0:
+ dependencies:
+ '@types/node': 22.10.6
+
+ word-wrap@1.2.5: {}
+
+ xtend@4.0.2: {}
+
+ yocto-queue@0.1.0: {}
diff --git a/src/addon.ts b/src/addon.ts
new file mode 100644
index 0000000..d432402
--- /dev/null
+++ b/src/addon.ts
@@ -0,0 +1,3 @@
+import addon from '@/lib/addon/index'
+
+export default addon;
diff --git a/src/catalog.ts b/src/catalog.ts
new file mode 100644
index 0000000..1368273
--- /dev/null
+++ b/src/catalog.ts
@@ -0,0 +1,3 @@
+import catalogs from '@/lib/catalogs'
+
+export default catalogs;
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..7d56ee7
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "target": "ESNext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
+ "module": "commonjs" /* Specify what module code is generated. */,
+ "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */,
+ "baseUrl": "./" /* Specify the base directory to resolve non-relative module names. */,
+ "paths": {
+ "@/*": ["./src/*"]
+ } /* Specify a set of entries that re-map imports to additional lookup locations. */,
+ "sourceMap": true /* Create source map files for emitted JavaScript files. */,
+ "noEmit": true /* Disable emitting files from a compilation. */,
+ "outDir": "./dist" /* Specify an output folder for all emitted files. */,
+ "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */,
+ "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
+ "strict": true /* Enable all strict type-checking options. */,
+ "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */,
+ "skipLibCheck": true /* Skip type checking all .d.ts files. */
+ }
+}